Raspberry Pi 備忘録 / Mbedもあるよ!

Raspberry Pi であれこれやった事の記録

DCモーター制御を試す

コンデンサ

DCモーターのノイズ対策が必要だということなので、
モーターの両極を橋渡しするように、 0.01μF のコンデンサーをハンダ付けしました。

ta7291p

出力側と制御側の二系統電 源端子かつ出力側にはモータ電圧を制御できる Vref 端子を持っており、モータへの印加電圧調整ができます。

とあり、ちょっとまだ意味がよくわからないのですが、
Vrefにかけた電圧を最大電圧として、OUT1,OUT2するようになるという意味かな?

TA7291P/S/SG/F/FG は、正・逆転切り替え用としてブリッジドライバで正転・逆転・ストップ・ブレーキの4 モードがコントロールできます。

とあり、そもそも、PWM制御するためのドライバでは無さそうです。
「正転と停止の切り替えが十分に早ければ,モータは一定速度で回転しているように見えます」という表現をなさっている方も居ります。

私は、USBからモーターに給電するので、Vrefは、10kΩの抵抗を介してつなごうと思っています。

f:id:pongsuke:20160114111954j:plain

データシートを見て、

ta7291p   接続先
Vcc   7   Rpi 5v
Vs    8   USBバッテリー +
Vref  4   10kΩの抵抗を介して、USBバッテリー +
GND   1   Rpi GND
IN1   5   GPIO14
IN2   6   GPIO15
OUT1  2   モーター片方
OUT2 10   モーター片方

に接続して、バッテリー - は、GND共有させました。

テストスクリプト

加速して、減速して、逆転加速・減速のテストスクリプト
Ctrl + c で終了することと、
何らかのエーラで終わる際にも、終了処理して、モーターが止まるようにした。

#!/usr/bin/python
# coding: utf-8 

import RPi.GPIO as GPIO
import time
import sys 

# GPIO 14,15番を使用
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
p0 = GPIO.PWM(14, 50) 
p1 = GPIO.PWM(15, 50) 

# 初期化
p0.start(0)
p1.start(0)

try:
        while True:
                for i in range(0,6):
                        new_duty = i*15
                        p0.ChangeDutyCycle(0)
                        p1.ChangeDutyCycle( new_duty )
                        print( new_duty )
                        time.sleep(1.0)
                for i in range(6,0,-1):
                        new_duty = i*15
                        p0.ChangeDutyCycle(0)
                        p1.ChangeDutyCycle( new_duty )
                        print( new_duty )
                        time.sleep(1.0)
                for i in range(0,6):
                        new_duty = i*15
                        p0.ChangeDutyCycle( new_duty )
                        p1.ChangeDutyCycle( 0 ) 
                        print( new_duty )
                        time.sleep(1.0)
                for i in range(6,0,-1):
                        new_duty = i*15
                        p0.ChangeDutyCycle( new_duty )
                        p1.ChangeDutyCycle( 0 ) 
                        print( new_duty )
                        time.sleep(1.0)

except KeyboardInterrupt:
        print("\nCtrl + c : Exit")
except:
        print("\nError : Exit")

p0.stop()
p1.stop()
GPIO.cleanup()