【自律型ロボット製作記】#5 アームロボット40320Cをラズパイからコントロールする

どうもこんにちは、InomaCreateです。
前回まで、SLAMでの自律走行をいろいろ検証していましたが、そろそろ違うこともやりたくなり、アマゾンでアームロボット40320Cを購入しました。
付属のリモコンでアームを動かすだけでは面白くないので、現在開発中の自律ロボットに組み込みたいと思います。
今回は、このアームロボットとモータードライバDRV8830を使って、ラズパイからコントロールするようにしてみました。
グリッパーアームロボット 40320C
おもちゃのアームロボットの割には、しっかりと動きます。
DCモーターが5個ついていて、5つの関節を動かすことができます。ただし、普段プラモデルなど作らない私からすると、結構作るのが大変でした。2時間ぐらいあれば組み上がると思います。
モータードライバDRV8830
ラズパイでモーターをコントロールするため、DRV8830使用のDCモータドライブキットを5個購入しました。
※秋月電子通商さんで購入。
DRV8830使用DCモータードライブキット
このドライバを使うことで、I2Cを使ってマイコンからDCモーターの正転・逆転・ブレーキ等が制御できるようになります。もちろん、今のロボットに搭載しているラズパイからも制御可能です。
回路図
各モーターにI2Cアドレスをそれぞれ割り振ることで、1本のI2Cバスで5つのモーターを動かすことができます。
今回は、以下のような割り振りにしました。

I2Cアドレス設定は、CN3の「A0」「A1」端子を半田ジャンパして設定します。

半田ジャンパー例:A1=H/A0=オープン
回路図です。
DRV8830のマニュアルにならって、ラズパイと接続します。

実際に配線した写真です。配線がかなり込み入ってなんじゃこりゃ~状態です。。。

ラズパイからロボットアームを動かしてみる
ラズパイからロボットアームのモーターへI2C通信で信号を送り回転させます。
今回はおためしなので、キー入力に従って、各モーターを動作させるようにしてみました。
正転、逆転、スタンバイは、マニュアルに従って、設定します。
ビットのD7-D2が出力電圧の設定
ビットのD1,D0が正転、逆転などの設定です。

DRV8830 DCモータードライバキット マニュアル
#!/usr/bin/python
import time
import smbus
i2c = smbus.SMBus(1)
m1_adr = 0x61
m2_adr = 0x63
m3_adr = 0x65
m4_adr = 0x67
m5_adr = 0x64
def main():
time.sleep(5)
while True:
key = raw_input()
if(key == 'q'):
print 'finish!!'
break
# M1 Motor
if(key == 'l1'):
i2c.write_byte_data(m1_adr,0,0b10100101)
print 'left turn'
time.sleep(0.4)
i2c.write_byte_data(m1_adr,0,0b110100)
if(key == 'r1'):
i2c.write_byte_data(m1_adr,0,0b10100110)
print 'right turn'
time.sleep(0.4)
i2c.write_byte_data(m1_adr,0,0b110100)
# M2 Motor
if(key == 'l2'):
i2c.write_byte_data(m2_adr,0,0b10100101)
print 'left turn'
time.sleep(0.4)
i2c.write_byte_data(m2_adr,0,0b110100)
if(key == 'r2'):
i2c.write_byte_data(m2_adr,0,0b10100110)
print 'right turn'
time.sleep(0.4)
i2c.write_byte_data(m2_adr,0,0b110100)
# M3 Motor
if(key == 'l3'):
i2c.write_byte_data(m3_adr,0,0b10100101)
print 'left turn'
time.sleep(0.4)
i2c.write_byte_data(m3_adr,0,0b110100)
if(key == 'r3'):
i2c.write_byte_data(m3_adr,0,0b10100110)
print 'right turn'
time.sleep(0.4)
i2c.write_byte_data(m3_adr,0,0b110100)
# M4 Motor
if(key == 'l4'):
i2c.write_byte_data(m4_adr,0,0b10100101)
print 'left turn'
time.sleep(0.4)
i2c.write_byte_data(m4_adr,0,0b110100)
if(key == 'r4'):
i2c.write_byte_data(m4_adr,0,0b10100110)
print 'right turn'
time.sleep(0.4)
i2c.write_byte_data(m4_adr,0,0b110100)
# M5 Motor
if(key == 'l5'):
i2c.write_byte_data(m5_adr,0,0b10100101)
print 'left turn'
time.sleep(0.4)
i2c.write_byte_data(m5_adr,0,0b110100)
if(key == 'r5'):
i2c.write_byte_data(m5_adr,0,0b10100110)
print 'right turn'
time.sleep(0.4)
i2c.write_byte_data(m5_adr,0,0b110100)
if __name__ == '__main__':
main()
実際に動かしてみた動画です。
ちゃんと、各モーターがラズパイから動かすことができました!!
最後に
とりあえず、ラズパイからコントロールできるようになりましたので、次は、ROSのトピック通信などを使って、スマホから操作できるようにしてみたいと思います。
最終ゴールは、カメラやAIを使って自律制御させたいです。
実は、Interface 2019年8月号を読んでたら、JetsonNanoとカメラを使ってアームロボットを自動制御させる記事がありました。その記事を参考にチャレンジしていこうと思います!
それでは!!

