ラピロの上半身をキャタピラーに搭載したらガンタンクみたいな移動できるAIロボットが作れるのかな。何しろモーター駆動のラジコンを部品から作るのは初めてなので、まずはキャタピラー部分を作ってラズパイで前後左右に移動するタンク部分を作ってみる。課題は、両輪をモーター駆動させる乾電池の実装とラズパイのモバイルバッテリーをどうやってRaspberry pi3に繋ぐのかを知らないので、勉強するところから着手。
ふらっと立ち寄ったジョイフルホンダの文房具売り場で目に留まったタミヤの「トラック&ホイールセット」。実はコレ、衝動買いです。ケータイで調べて、別売りのモーター「ダブルギアボックス(左右独立4速タイプ)」という部品も買いました。
▽モーターの組み立てから。ギアから組み立てするんですね、驚きました。左右独立して回転するので、2個組み立てします。なんとギアは4種類の高速から低速の中から選択することができます。といっても変速は出来ないので、速さのスピード重視か、遅いけど高いトルクを重視するかを選んで固定です。今回は、単三乾電池4個とモバイルバッテリーを搭載する予定なので重いだろうからと、3番目の速さの回転数115rpm、回転トルク809gf-cmを選択。馬力でいうとー、えーっとー。馬力は、トルク×回転数なので、809[gf-cm]×115[rpm] = 0.00809[Kg-m]×115[rpm] = 0.93[馬力(PS)]。約1馬力。ホントかよ。
▽出来上がったモーターを車体&ホイールに搭載して、トラックベルトを巻き付ける。
▽ちょうどピッタリの隙間があったので、電池ボックスを設置した。
▽キャタピラの上にラズパイやモバイルバッテリーなどを搭載するので、2段目の床を取り付けた。
▽左右独立しているモーターを駆動させる回路図。ググってみたら、どうやらラジコンのモーターを駆動させるといったらほぼ一択の様に東芝製のIC「モータドライバTA7291P」がダントツの人気らしいです。
ただ、このTA7291Pは生産終了が発表されていることもあり、今後代替品の検討が必要となります。 東芝製、または各種メーカー製品の比較検討にはオンラインサイト「アールエスコンポーネンツ」が便利です。
カタログには「VTRのフロントローディング・テープローディング…中略…用として最適な回路構成」とありましたので、懐かしのカセットテープを駆動する当時の重要なパーツだったのでしょうか。今もモーター駆動で現役だったのですね。このモータドライバ(IC)を使うことで、モーターの正転、逆転、ストップ、ブレーキ、かつPWM出力と組み合わせることで、モーターの回転速度を可変にすることができるようになります。
▽モータドライバ(TA7291P)の端子と機能です。例えば、ラズパイのGPIO27を1、GPIO22を0に設定することで、モーター左側が正転方向に回転するわけですね。
▽実際にモータドライバを実装した姿。試作機なので配線だらけでとても格好悪いです。
▽試作機(完成)。ラズパイ用モバイルバッテリーを中段に設置。トラックベルトを装着したら、戦車みたいにごっつくなってしまった。
Pythonスクリプトを実行したらキーボードの[w][a][s][z]で前後左右に動きます。続いてキーボードの[x]がストップ。速度については、前進がスピードHigh(PWM100%)で、後進はスピードSlow(PWM50%)としています。キーボード[q]でスクリプト終了します。
<注意>[sudo pip install readcha]を実行して、[readchar]というキーボード入力のモジュールをインストールする必要があります。
<注意2>スピードSlowで動かすときなどモーターが回転しない、あるいは遅すぎなど回転速度が不安定な場合は、GPIO.PWMの周波数を[5]Hzや[10]Hzなどに変更して試してください。それでもダメな場合はPWM100%のみで楽しんでください。
#!/usr/bin/env python # -*- coding: utf-8 -*- # sudo pip install readchar import RPi.GPIO as GPIO import sys import time import readchar constLeftPWM = 17 constLeftIN1 = 27 constLeftIN2 = 22 constRightPWM = 16 constRightIN1 = 20 constRightIN2 = 21 GPIO.setwarnings( False ) GPIO.setmode( GPIO.BCM ) GPIO.setup( constLeftPWM, GPIO.OUT ) GPIO.setup( constLeftIN1, GPIO.OUT ) GPIO.setup( constLeftIN2, GPIO.OUT ) GPIO.setup( constRightPWM, GPIO.OUT ) GPIO.setup( constRightIN1, GPIO.OUT ) GPIO.setup( constRightIN2, GPIO.OUT ) pwmLeft = GPIO.PWM( constLeftPWM, 50 ) #50Hz pwmLeft.start( 0.0 ) pwmRight = GPIO.PWM( constRightPWM, 50 ) #50Hz pwmRight.start( 0.0 ) def moveForward(): GPIO.output( constLeftIN1, 1 ) GPIO.output( constLeftIN2, 0 ) GPIO.output( constRightIN1, 1 ) GPIO.output( constRightIN2, 0 ) def speedSlow(): pwmLeft.ChangeDutyCycle( 50 ) pwmRight.ChangeDutyCycle( 50 ) def speedHigh(): pwmLeft.ChangeDutyCycle( 100 ) pwmRight.ChangeDutyCycle( 100 ) def moveBack(): GPIO.output( constLeftIN1, 0 ) GPIO.output( constLeftIN2, 1 ) GPIO.output( constRightIN1, 0 ) GPIO.output( constRightIN2, 1 ) def moveLeft(): GPIO.output( constLeftIN1, 0 ) GPIO.output( constLeftIN2, 1 ) GPIO.output( constRightIN1, 1 ) GPIO.output( constRightIN2, 0 ) def moveRight(): GPIO.output( constLeftIN1, 1 ) GPIO.output( constLeftIN2, 0 ) GPIO.output( constRightIN1, 0 ) GPIO.output( constRightIN2, 1 ) def moveStop(): GPIO.output( constLeftIN1, 0 ) GPIO.output( constLeftIN2, 0 ) GPIO.output( constRightIN1, 0 ) GPIO.output( constRightIN2, 0 ) def end(): pwmLeft.stop() pwmRight.stop() GPIO.cleanup() sys.exit(0) ###################################### # メインルーチン ###################################### if __name__ == '__main__': try: while 1: kb = readchar.readchar() sys.stdout.write(kb) if kb == 'w': speedHigh() moveForward() if kb == 'z': speedSlow() moveBack() if kb == 'a': speedSlow() moveLeft() if kb == 's': speedSlow() moveRight() if kb == 'x': moveStop() if kb == 'q': end() #time.sleep(3) except KeyboardInterrupt: moveStop() end()
手動操作なのでAIロボットとは呼べない為、ラズタンク試作機と仮称を付けました。ラズタンク試作機、行きまーす!
なんだ、ラジコン作っただけじゃんと思われたかもしれませんが、ラズベリーパイでスクリプトを実行することでラズタンク試作機を移動させることが出来たので、この後、センサーやカメラを搭載するなどして、様々な条件を仕込んだプログラミングを実装すれば、AIロボットが自己判断して素早く(少なくともラピロが歩くよりも早く)移動することが可能になるはずだ。何のために移動させるのか、の目的が見つからないけれどね…。