Raspberry piで2足歩行ロボットの作成⑤「webiopi deviceInstanceライブラリを使いPython でモーションの作成」
2021-07-22
今回はブラウザからi2c制御を可能にするため、webiopiで使える「deviceInstanceライブラリ」を利用したPythonプログラムを作成します。
記述の方法が異なりますが、前回作成したプログラムを見本とすれば、サーボを動かす順番、角度などが分かりますので、あとはそれをwebiopiに合った記述に変更していくだけです。
はじめに、html、css、javascriptにも変更があるので、変更箇所を抜粋して記載しておきます。
各種ファイルは、第2回で作成した場所、pi/webiopi/のディレクトリ配下にあるはずです。
HTML/css
motor.html
SET
class n の部分を上記のように変更します。
style.css
.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
} 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
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からのマクロ呼び出しに対して、前進、後退、左右旋回、初期位置、の動作になるよう設定しています。
上下左右ボタンに加え、中央に「SET」のボタンを配置しました。
これはサーボモーターの位置を「初期位置」に戻すボタンとします。
動作確認
それでは、ブラウザから実際にプログラムを動かしてみます。
予めラズパイのwebiopiを起動させておき、
ブラウザから「ラズパイのローカルIP:8000/test/motor.html」 にアクセスします。
パスワード入力後、任意のボタンをクリックして、意図した動作が実行されればOKです。
※サーボモーターによって角度の誤差が生じるので、動作が不安定であれば微調整をお願いします。
次回は、頭にラズパイ、電源、ドライバ、などを収納して完成させたいと思います。