前回の記事でRaspberryPiのサーボモータを無事動かすことができました。でもどうせなら計算式などを理解して自分でパラメータを変えたい!とか思ってかなり試行錯誤してみたのですが、内容を理解するのには苦労しました。
そこで、もっと簡単に表現できないかと悩んだ結果、PWMの計算結果を配列に格納しておいて、そこから値を取得するようにしました!
ずるい!w とは思いますが、結果思い通りに動かせればそれで今のところはOKとします。
スクリプトファイルは以下のようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import webiopi import time import wiringpi as GPIO SV_PAN = 26 # SV_PAN (Left)90 ... 0 ... -90(Right) #val1 = [28,25,20,16,12,6,0] val2 = [28,27,26,25,24,23,22,21,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0] def getServoPanPWMvalue(val): return val2[val] webiopi.setDebug() def setup(): webiopi.debug("Script with macros - Setup") GPIO.wiringPiSetupGpio() GPIO.pinMode(SV_PAN,GPIO.OUTPUT) GPIO.softPwmCreate(SV_PAN,0,50) def loop(): webiopi.sleep(5) def destroy(): webiopi.debug("Script with macros - Destroy") @webiopi.macro def setHwPWMforPan(duty): GPIO.softPwmWrite(SV_PAN, getServoPanPWMvalue(int(duty))) |
簡単に解説します。ブラウザのスライダーが操作されるとマクロが呼ばれて「setHwPWMforPan(duty)」に渡されます。
スライダーの値は配列「val2」の中身に変換されてリターンされてきます。はい、これだけです。
なんなら、スライダーの値を直接「GPIO.softPwmWrite」に渡してあげても動くかもしれません。
なぜこの28~0になるのか?というところは前回の記事の計算を行ってみるとそうなります。範囲を調整したい場合は配列に格納する値を「26~2」にしてみるとか、そのように変更してみるとよいと思います。
上記のスクリプトに対応したHTMLファイルがこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width"> <title>Controller</title> <script type="text/javascript" src="/webiopi.js"></script> <script type="text/javascript"> </script> <style type="text/css"> </style> </head> <body> <div align="center"> <table> <tr> <td> <table> <tbody> <tr> <td> <div class="slidecontainer"> <input type="range" min="0" max="28" value="14" class="slider" id="myRange"> </div> </td> </tr> <tr> <td>slider value:<p id="out"></p></td> </tr> </tbody> </table> </td> </tr> </table> </div> <script> var commandID = 0; var slider = document.getElementById("myRange"); var output = document.getElementById("out"); output.innerHTML = slider.value; // Display the default slider value // Update the current slider value (each time you drag the slider handle) slider.oninput = function(){ output.innerHTML = slider.value; var slidervalue = slider.value; webiopi().callMacro("setHwPWMforPan", slidervalue); }; </script> </div> </body> </html> |
前回の記事と比較してもらえるとわかりますが、今回はスライダーの値(0~28)をそのまま引数として渡しています。こっちのほうが計算が少なくて分かりやすいと思います。
今回はソフトウェアPWMを使用しており、実行するとサーボがガタガタと振動していまいました。ですので、次回はハードウェアPWMを使用してサーボの振動をなくしてみたいと思います。
ブラウザのスライダーでRaspberryPiのサーボモータを動かす(ハードウェアPWM)
ご参考になればと思います。
コメントを残す