Raspberry piで2足歩行ロボットの作成④「Python Adafruit_PCA9685ライブラリでモーションの作成」
2021-07-22
今回は、このロボットをプログラムで歩かせたいと思います。
最終的にはwebiopiでブラウザからの操作を考えているので、deviceInstanceのライブラリを使ってモーションを作成したい所ですが、こちらは微調整するのにいちいち再起動する必要があったので、ある程度の所まではAdafruit_PCA9685ライブラリを使用して開発していく事にします。
Pythonのプログラムですので、ラズパイにプリインストールされている「Thonny Python IDE」などのエディタを使えばイイと思います。
ちなみに以下のプログラムのモーションはオリジナルですので、少々変な動作にはなっていますが、そこは愛嬌ということでよろしくお願いします。
モーションプログラム
test.py
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プログラムを作成します。