前回、ロボットの足にあたるサーボモーターを組み立てて、足と胴体をくっつける「ロボットの骨格」を作成しました。↓
今回は、このロボットをプログラムで歩かせたいと思います。
最終的にはwebiopiでブラウザからの操作を考えているので、deviceInstanceのライブラリを使ってモーションを作成したい所ですが、こちらは微調整するのにいちいち再起動する必要があったので、ある程度の所まではAdafruit_PCA9685ライブラリを使用して開発していく事にします。
Pythonのプログラムですので、ラズパイにプリインストールされている「Thonny Python IDE」などのエディタを使えばイイと思います。
なお、開発環境については第1回目の記事でまとめているので、参考にして下さい。↓
で、モーションの元となる「モーション図」みたいなやつですが、ググれば山ほど出てくるのでここでは割愛いたしますm(__)m
ちなみに以下のプログラムのモーションはオリジナルですので、少々変な動作にはなっていますが、そこは愛嬌ということでよろしくネ♡
モーションプログラム
test.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 87 88 89 90 91 92 93 94 95 96 |
import time import Adafruit_PCA9685 pwm = Adafruit_PCA9685.PCA9685() pwm.set_pwm_freq(60) def FW(): pwm.set_pwm(3, 0, 300) #R up pwm.set_pwm(1, 0, 310) time.sleep(0.5) pwm.set_pwm(0, 0, 370) pwm.set_pwm(2, 0, 370) time.sleep(0.5) pwm.set_pwm(3, 0, 360) #R down pwm.set_pwm(1, 0, 370) time.sleep(0.5) pwm.set_pwm(1, 0, 430) #L up pwm.set_pwm(3, 0, 420) time.sleep(0.5) pwm.set_pwm(0, 0, 430) pwm.set_pwm(2, 0, 430) time.sleep(0.5) pwm.set_pwm(1, 0, 370) #L down pwm.set_pwm(3, 0, 360) time.sleep(0.5) def BK(): pwm.set_pwm(3, 0, 300) #R up pwm.set_pwm(1, 0, 310) time.sleep(0.5) pwm.set_pwm(0, 0, 410) pwm.set_pwm(2, 0, 410) time.sleep(0.5) pwm.set_pwm(3, 0, 360) #R down pwm.set_pwm(1, 0, 370) time.sleep(0.5) pwm.set_pwm(1, 0, 430) #L up pwm.set_pwm(3, 0, 420) time.sleep(0.5) pwm.set_pwm(0, 0, 370) pwm.set_pwm(2, 0, 370) time.sleep(0.5) pwm.set_pwm(1, 0, 370) #L down pwm.set_pwm(3, 0, 360) time.sleep(0.5) def RT(): pwm.set_pwm(3, 0, 300) #R up pwm.set_pwm(1, 0, 310) time.sleep(0.5) pwm.set_pwm(0, 0, 410) time.sleep(0.5) pwm.set_pwm(3, 0, 360) #R down time.sleep(0.5) pwm.set_pwm(0, 0, 370) time.sleep(0.5) pwm.set_pwm(1, 0, 370) time.sleep(0.5) def LT(): pwm.set_pwm(1, 0, 430) #L up pwm.set_pwm(3, 0, 420) time.sleep(0.5) pwm.set_pwm(2, 0, 370) time.sleep(0.5) pwm.set_pwm(1, 0, 370) #R down time.sleep(0.5) pwm.set_pwm(2, 0, 390) time.sleep(0.5) pwm.set_pwm(3, 0, 370) time.sleep(0.5) def SET(): pwm.set_pwm(1, 0, 370) time.sleep(1) pwm.set_pwm(0, 0, 390) time.sleep(1) pwm.set_pwm(3, 0, 360) time.sleep(1) pwm.set_pwm(2, 0, 390) while(True): print("0/forward, 1/back, 2/right, 3/left, 4/reset, 5~/TEST END") select = int(input("choice No:")) if select == 0: FW() elif select == 1: BK() elif select == 2: RT() elif select == 3: LT() elif select == 4: SET() else: exit() |
pwm.set_pwm()のインスタンスメソッドの第二引数が開始パルス、第三引数が終了パルスとなっていますが、ここの値でサーボモーターの角度が決まります。
ざくっと説明すれば、開始が0とすれば、「終了パルスが150=0°」「終了パルスが500=180°」となります。
したがって、サーボの位置を真ん中(90°)にしたければ開始0,終了が175になります。(ざくっと)
これを基準に、前後左右に歩かせるプログラムを作成していきます。
なお、今回使用しているサーボモーターは格安のレビュー最悪品ですので、初期位置をセンター(90°)にしていてもズレる事が多いので、そこは175の値を前後させて90°になるよう微調整します。
プログラムを実行すれば、インプット関数で数字を入力する画面になるので、任意の番号を入力します。
番号に応じて前進、後退、左旋回、右旋回、初期位置、の関数が実効されます。
終了時は、1~4以外のキーを入力すれば強制終了となります。
少々使い勝手が悪いかもしれないので、その辺は自由に改造して頂ければと思います。
プログラムの実行
作成したプログラムを実行すれば、下のように動作するはずです。
決してスムーズとは言い難いですので、気になる方は個人で自分好みに合わせたモーションに変更してください。
次回は、今回作成したプログラムをもとに、webiopiで使えるPythonプログラムを作成します。