FunnyGeek

Home > This page

移動できるAIロボットも作れるのか?ラズタンクを作ってみる。

ゴール設定(AIロボットの土台となるキャタピラーをリモート運転する)

ラピロの上半身をキャタピラーに搭載したらガンタンクみたいな移動できるAIロボットが作れるのかな。何しろモーター駆動のラジコンを部品から作るのは初めてなので、まずはキャタピラー部分を作ってラズパイで前後左右に移動するタンク部分を作ってみる。課題は、両輪をモーター駆動させる乾電池の実装とラズパイのモバイルバッテリーをどうやってRaspberry pi3に繋ぐのかを知らないので、勉強するところから着手。

Rapiro, ガンタンクを夢見るラピロ

事前準備(キャタピラーの組み立て)

ふらっと立ち寄ったジョイフルホンダの文房具売り場で目に留まったタミヤの「トラック&ホイールセット」。実はコレ、衝動買いです。ケータイで調べて、別売りのモーター「ダブルギアボックス(左右独立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に設定することで、モーター左側が正転方向に回転するわけですね。

モータドライバ(TA7291P)の機能

▽実際にモータドライバを実装した姿。試作機なので配線だらけでとても格好悪いです。

ラズパイ・タンクの試作機(回路)

▽試作機(完成)。ラズパイ用モバイルバッテリーを中段に設置。トラックベルトを装着したら、戦車みたいにごっつくなってしまった。

ラズパイ・タンクの試作機(完成)

事前準備(モータードライバを制御するPythonスクリプト)

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ロボットの土台となるキャタピラーをリモート運転する)

なんだ、ラジコン作っただけじゃんと思われたかもしれませんが、ラズベリーパイでスクリプトを実行することでラズタンク試作機を移動させることが出来たので、この後、センサーやカメラを搭載するなどして、様々な条件を仕込んだプログラミングを実装すれば、AIロボットが自己判断して素早く(少なくともラピロが歩くよりも早く)移動することが可能になるはずだ。何のために移動させるのか、の目的が見つからないけれどね…。

▲上に戻る