日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

Raspberry pi 2 + モータードライバTA7291P

さて、前回までのサーボモータに続き、今回はRaspberry pi 2で普通のモーターを制御します。モーターを回すだけなら電池とモーターを繋げてスイッチをつけるだけでラズパイの出番はないわけですが、モーターの回転速度、回転方向も含めて制御したいと思います。

モーターはアナログ回路です。例えば小さい電力ならゆっくり、大きな電力なら速く回転します。ラズパイは基本的にデジタル(5Vと0Vで1と0を表す)で動いているわけですが、サーボモーターでも使ったPWMの仕組みがあり、アナログに似た操作ができます。また、モータードライバと呼ばれるICを使えば、速度や回転方向のほか、モーターを使った時に発生するノイズによる影響も避けることができるようです。

というわけで、秋月電子からモータードライバ TA7291Pを買いました。2個セットで300円。これだけだと送料のほうが高いので他にも買い物をしたのですが、それはまた別の機会に書こうと思います。

f:id:WindVoice:20160116204913j:plain

これを含めた回路は以下のFritzingで作った図の通りです。モーターの電源は前回までのブログでも紹介したモバイルバッテリーのUSBポートから線を引っ張って取得しています。図では適当なリチウム電池の絵になっています。モーター1個くらいならRaspberry piから直接取っても大丈夫かもしれませんが、この後サーボモーターも追加でつないで自動車にしたいという野望があり、安定動作のため別電源としています。

f:id:WindVoice:20160116213841p:plain

さて、配線ができたらいつもの通りPythonプログラムを書きます。ta7291クラスは文字通りモータードライバーを簡単に扱うためのクラスです。使い方はコメントに書いてありますので見てください。

pi@raspberrypi:~/work$ cat ta7291.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time
import sys

class ta7291:
	'''
	Motor driver TA7291 class
	'''
	def __init__(self, pwm, in1, in2):
		# GPIOセットアップ
		GPIO.setmode(GPIO.BCM)
		GPIO.setup(pwm, GPIO.OUT)
		GPIO.setup(in1, GPIO.OUT)
		GPIO.setup(in2, GPIO.OUT)
		# ピンを保存
		self.in1 = in1
		self.in2 = in2
		self.p = GPIO.PWM(18, 50)

	def drive(self, speed):
		'''
		モーターを回転させる。
		speed : -100から100の数値。正の数なら正回転、負の数なら逆回転。
		'''
		if speed > 0:
			GPIO.output(self.in1, 1)
			GPIO.output(self.in2, 0)
			self.p.start(speed)
		if speed < 0:
			GPIO.output(self.in1, 0)
			GPIO.output(self.in2, 1)
			self.p.start(-speed)
		if speed == 0:
			GPIO.output(self.in1, 0)
			GPIO.output(self.in2, 0)
			
	def brake(self):
		GPIO.output(self.in1, 1)
		GPIO.output(self.in2, 1)
		time.sleep(0.5)

	def cleanup(self):
		'''
		最後は正面に戻して終了する
		'''
		self.brake()
		GPIO.cleanup()

if __name__ == "__main__":
	pass
pi@raspberrypi:~/work$ 

それから、ta7291pクラスを使用するメインプログラムの方を作ります。例えば下のようなシンプルなものになります。

pi@raspberrypi:~/work$ cat motor_test.py 
#!/usr/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time
import sys
import ta7291

if __name__ == "__main__":
	d = ta7291.ta7291(18, 24, 25)

	print "Normal Powerup/down..."
	for power in range(0, 100, 10):
		d.drive(power)
		time.sleep(0.3)
	for power in range(100, 0, -10):
		d.drive(power)
		time.sleep(0.3)

	print "Stop 3 seconds..."
	d.drive(0)
	time.sleep(3)

	print "Max speed 3 seconds, and stop..."
	d.drive(100)
	time.sleep(3)
	d.drive(0)
	time.sleep(3)

	print "Max speed 3 seconds, and brake..."
	d.drive(100)
	time.sleep(3)
	d.brake()
	time.sleep(3)

	d.cleanup()

さて、ここまでくれば動作可能です。モーターを動かしているところは動画にしましたので載せておきます。上でも書いたようにサーボモータを追加して、自動車のような姿にして走らせる事を目標にしていますが、ラジコンの経験もない私ですので無事走るかどうか…… 慣れないタミヤモーターをいじっていますので、動いた時にまた記事にしようと思います。


モータードライバーTA7291P

タミヤ 楽しい工作シリーズ No.189 ミニモーター低速ギヤボックス 4速 70189

タミヤ 楽しい工作シリーズ No.189 ミニモーター低速ギヤボックス 4速 70189