前回と前々回までは「wiringpi」のソフトウェアPWMを使用していましたが、こちらの方法だとサーボモータがガタガタと振動してしまいました。それでは少し実用性に欠けるので、今回はハードウェアPWMを使用してサーボが振動しないようにしていきたいと思います。
参考にさせていただいたサイトはこちらです。
「wiringpi」のハードウェアPWMを使用するためにPythonファイルを以下のように変更しています。
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 = 13 # SV_PAN (Left)90 ... 0 ... -90(Right) def getServoPanPWMvalue(val): move_deg = int((9.5*val/180 + 2.5)*(1024/100)) return move_deg webiopi.setDebug() def setup(): webiopi.debug("Script with macros - Setup") GPIO.wiringPiSetupGpio() GPIO.pinMode(SV_PAN, 2) # 出力ピンとして指定 GPIO.pwmSetMode(0) # 0Vに指定 GPIO.pwmSetRange(1024) # レンジを0~1024に指定 GPIO.pwmSetClock(375) # クロック def loop(): webiopi.sleep(5) def destroy(): webiopi.debug("Script with macros - Destroy") @webiopi.macro def setHwPWMforPan(servovalue): GPIO.pwmWrite(SV_PAN, getServoPanPWMvalue(int(servovalue))) |
また、HTMLファイルも同時に変更します。前回まではブラウザのスライダーの値を0~28段階で変更していました。
それを今回は0~180段階で制御できるようになっています。こちらのほうが細かく角度を指定することができますし、分かりやすいと思います。
デメリットとしてましては、今回はハードウェアPWMを使用していますので、使えるピン番号が限られているということです。
ハードウェアPWMはGPIO12、18もしくは、GPIO13、19のどれかに接続してやらないと動かすことができません。
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="180" value="90" 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> |
上記のスライダーを2個にして動かしてみた様子がこちらです↓
ハードウェアPWMを使ったら大分サーボの振動が少なくなった。 pic.twitter.com/MW0GFjD4Qm
— Kazuki@ロボット作り (@RoomKazuki) July 26, 2019
少し揺れているのはハード側の慣性で揺れてるだけなので、サーボはピタッと止まっています。ソフトウェアPWMに比べると雲泥の差です。これからはなるべくハードウェアPWMを使っていこうと思います。
コメントを残す