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プログラムを作成します。