前回、Adafruit_PCA9685ライブラリを使ってロボットの歩行モーションプログラムを作成しました。↓
今回はブラウザからi2c制御を可能にするため、webiopiで使える「deviceInstanceライブラリ」を利用したPythonプログラムを作成します。
記述の方法が異なりますが、前回作成したプログラムを見本とすれば、サーボを動かす順番、角度などが分かりますので、あとはそれをwebiopiに合った記述に変更していくだけです。
webiopiやdeviceInstanceライブラリなど、環境構築については第2回の記事でまとめていますので、そちらを参考願います。↓
はじめに、html、css、javascriptにも変更があるので、変更箇所を抜粋して記載しておきます。
各種ファイルは、第2回で作成した場所、pi/webiopi/のディレクトリ配下にあるはずです。
HTML/css
motor.html
1 2 3 |
<div class="n"> <li id="set" class="ledoff">SET</li> </div> |
class n の部分を上記のように変更します。
上下左右ボタンに加え、中央に「SET」のボタンを配置しました。
これはサーボモーターの位置を「初期位置」に戻すボタンとします。
style.css
1 2 3 4 5 6 7 |
.a li, .b li, .c li, .d li, .n li { border: solid 1px; } .n { margin-right: 3px; margin-left: 3px; } |
border: solid にn classを追加しました。
また、n class にマージンを追加しました。
追加したボタンのスタイリングをしただけです。
javascript
motor.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
} else if(mode == "LEFT") { // 左旋回 w().callMacro('LT'); } else if(mode == "SET") { // 初期位置 w().callMacro('SET'); } } * * * // 「set」ボタンが押されたときのイベント処理 $('#set').bind(BUTTON_DOWN, function(event) { if(direction == "STOP") { $(this).addClass('ledon'); change_direction('SET'); } }).bind(BUTTON_UP, function(event) { $(this).removeClass('ledon'); change_direction('STOP'); }); }); |
追加したボタン(SET)の関数呼び出しと、イベント処理を追加しました。
続いて、Pythonのプログラムを変更します。
Python
macro_pwm.py
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
import webiopi import time from webiopi import deviceInstance pwm0 = deviceInstance("pwm0") @webiopi.macro def SET(): pwm0.pwmWriteAngle(0, 10) time.sleep(1) pwm0.pwmWriteAngle(1, 0) time.sleep(1) pwm0.pwmWriteAngle(2, 10) time.sleep(1) pwm0.pwmWriteAngle(3, 0) time.sleep(1) @webiopi.macro def FW(): pwm0.pwmWriteAngle(3, -20) pwm0.pwmWriteAngle(1, -20) time.sleep(0.5) pwm0.pwmWriteAngle(0, -10) pwm0.pwmWriteAngle(2, -10) time.sleep(0.5) pwm0.pwmWriteAngle(3, 0) pwm0.pwmWriteAngle(1, 0) time.sleep(0.5) pwm0.pwmWriteAngle(1, 10) pwm0.pwmWriteAngle(3, 10) time.sleep(0.5) pwm0.pwmWriteAngle(0, 30) pwm0.pwmWriteAngle(2, 30) time.sleep(0.5) pwm0.pwmWriteAngle(1, 0) pwm0.pwmWriteAngle(3, 0) time.sleep(0.5) @webiopi.macro def BK(): pwm0.pwmWriteAngle(3, 10) pwm0.pwmWriteAngle(1, 10) time.sleep(0.5) pwm0.pwmWriteAngle(0, -10) pwm0.pwmWriteAngle(2, -10) time.sleep(0.5) pwm0.pwmWriteAngle(3, 0) pwm0.pwmWriteAngle(1, 0) time.sleep(0.5) pwm0.pwmWriteAngle(1, -20) pwm0.pwmWriteAngle(3, -20) time.sleep(0.5) pwm0.pwmWriteAngle(0, 30) pwm0.pwmWriteAngle(2, 30) time.sleep(0.5) pwm0.pwmWriteAngle(1, 0) pwm0.pwmWriteAngle(3, 0) time.sleep(0.5) @webiopi.macro def LT(): pwm0.pwmWriteAngle(3, -60) pwm0.pwmWriteAngle(1, -30) time.sleep(0.5) pwm0.pwmWriteAngle(0, 30) time.sleep(0.5) pwm0.pwmWriteAngle(3, 0) time.sleep(0.5) pwm0.pwmWriteAngle(1, 0) time.sleep(0.5) pwm0.pwmWriteAngle(0, 0) time.sleep(0.5) @webiopi.macro def RT(): pwm0.pwmWriteAngle(3, 20) pwm0.pwmWriteAngle(1, 50) time.sleep(0.5) pwm0.pwmWriteAngle(2, -20) time.sleep(0.5) pwm0.pwmWriteAngle(1, 0) time.sleep(0.5) pwm0.pwmWriteAngle(3, 0) time.sleep(0.5) pwm0.pwmWriteAngle(2, 0) time.sleep(0.5) |
macro_pwm.pyを、上記のように変更します。
deviceInstanceのメソッドを使えるように、pwm0 = deviceInstance(“pwm0”)でインスタンス化しています。
pwm0.pwmWriteAngle()は、第一引数がサーボのチャンネル、第二引数が角度になります。
それぞれjavascriptからのマクロ呼び出しに対して、前進、後退、左右旋回、初期位置、の動作になるよう設定しています。
動作確認
それでは、ブラウザから実際にプログラムを動かしてみます。
予めラズパイのwebiopiを起動させておき、
ブラウザから「ラズパイのローカルIP:8000/test/motor.html」 にアクセスします。
パスワード入力後、任意のボタンをクリックして、意図した動作が実行されればOKです。
※サーボモーターによって角度の誤差が生じるので、動作が不安定であれば微調整をお願いします。
次回は、頭にラズパイ、電源、ドライバ、などを収納して完成させたいと思います!