作ってみたのはいいけど本当に歩けるのか不安だったので、まず下半身だけで歩かせてみることにしました。
サーボモータを動かすにはPWMを使いますが、ラズパイではハードウエアPWMが使えることを知り、使ってみました。wiringpiと言うpythonのモジュールを使わせてもらいました。ハードウエアPWMとしては2基搭載されているようなのですが、試したところ1基しか使えなくて、どうしてもPWM1を動作させる方法がわからなかったため、とりあえずはソフトウエアPWMを使うことにしました。これもwiringpiで対応しています。こちらのサイトで公開されていたソースコードを少し変更した下記のコードを使って実験してみました。
#
# ソフトウエアPWMでSG90を動かす
#
import sys
import time
from wiringpi import *
def setupMotor(id):
wiringPiSetupGpio()
pinMode(id, GPIO.PWM_OUTPUT)
softPwmCreate(id, 0, 200)
if __name__ == '__main__' :
#
# SG-90(7 -- 22)
#
try:
id = int(sys.argv[1])
if(len(sys.argv) > 2):
angle = int(sys.argv[2])
else:
angle = 15
if angle == 0:
setupMotor(id)
softPwmWrite(id, 0)
elif angle < 7 or angle > 22:
print ("ERROR: over range")
else:
setupMotor(id)
softPwmWrite(id, angle)
time.sleep(1)
except Exception as e:
print ("Usage: {0} GPIO_PIN DUTY(7-22)".format(sys.argv[0]))
上記のコードで1個ずつサーボモータを動かしていきます。やりたいことは、「足の関節のモータを動かして片足立ちにし、同じ脚と腰をつなぐ関節のモータを動かして回転させることで少しずつ前に進ませる」なのですが、最初の片足立ちのところでハマりました。なんとなく予感はしていたのですが、重心の関係上もう片方の足を持ち上げられず、足だけが回転する状況になってしまいました。そこで、足を回転させる前にもう片方の足の関節を同じ角度だけ回転させて別の足の方に重心を移動させてから、もう片方の足を回転させてみたところ、今度はうまく片足を上げることに成功しました。ハマったのはそのくらいです。
ちなみにソフトウエアPWMはCPUで実現しているのでいまいち安定していない(サーボモータが回転した後、ブルブル震える)のですが、ハードウエアPWMだと回転した後、ピタッと止まってくれます。やっぱりハードウエアPWMはいいですね。