【Raspberry Pi】 モーターを回そう。「DCモーター編」①
モーターを回そう!
さて、今回は、戦車を動かすための動力源であるモーターの制御です。
教本ではLEDの後、スイッチおよび A/Dコンバータを学ぶ章が続きますが、
戦車には不要と判断し、すっ飛ばしました。さっと実習するに留めました。
動いてる戦車のスイッチは押せませんし、A/Dコンバータのような事は、
戦車として動くようになってからでも良いでしょう。
今回はモーターを動かします。
電池とモーターを繋げれば元気に回転しますが、制御をしたいので、
A/Dコンバータでも少し出てきたドライバ(半導体)が登場します。
TA7291P というものを使用します。
こんなやつです。
データシートを見ると左から順に、
- GND
- OUT1
- なし
- Vref
- IN1
- IN2
- Vcc
- Vs
- なし
- OUT2
とのこと。
INはラズパイからの入力、OUTはモータへの出力ですね。
Vrefは制御電源端子とあるので、制御のために必要、
Vccはロジック側制御端子なので、ドライバの駆動に必要、
Vsは出力側電源端子なので、モータの駆動に必要、という事でしょうか。(調べました)
LEDとは違い、モータの電源はラズパイのピンから取得してはいけないらしいです。
試しにやってみたらラズパイが再起動しました・・・(壊れなくてよかった。)
モータ用の電源は電池などから提供します。
制御を行うVrefをラズパイのGPIOピン、Vccをラズパイの5V、Vsを電池等の+極と繋ぎ、
INの二つをGPIOピン、OUTの二つをモータに繋ぎます。
GNDは共有するらしいので、電池のマイナスと、ラズパイのGNDが繋がるようにします。
Fritzing という便利なものがありました!
教本だとVrefを固定電圧にして、INの二つを可変電圧にしていましたが、
制御電源端子とあるので、こっちの方がしっくり来ました。(GPIOピンを1つ多く使いますが・・・)
説明すっ飛ばしましたが、モータ制御ではPWMというキーワードが登場します。
高速でオンとオフを繰り返すことで、電圧を制御する方法の事です。
自作PCのファンコントローラで静穏性と冷却性能を考えてた時に知った言葉です。
このPWM制御を、Vrefに行うことでモータの速度制御をします。
IN1,IN2 はそれぞれ、OUT1,OUT2 に対応しており、モータの正回転と逆回転の制御をします。
制御のためのソースコードはこちら!
import RPi.GPIO as GPIO
from time import sleep
p21 = 0
IN_A = 20
IN_B = 26
GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.OUT)
GPIO.setup(IN_A, GPIO.OUT)
GPIO.setup(IN_B, GPIO.OUT)
p21 = GPIO.PWM(21,50)
p21.start(0)
try:
while True:
#forward
p21.ChangeDutyCycle(100)
GPIO.output(IN_A,GPIO.HIGH)
GPIO.output(IN_B,GPIO.LOW)
sleep(3)
#stop
p21.ChangeDutyCycle(0)
GPIO.output(IN_A,GPIO.LOW)
GPIO.output(IN_B,GPIO.LOW)
sleep(3)
#back
p21.ChangeDutyCycle(50)
GPIO.output(IN_A,GPIO.LOW)
GPIO.output(IN_B,GPIO.HIGH)
sleep(3)
#stop
p21.ChangeDutyCycle(0)
GPIO.output(IN_A,GPIO.LOW)
GPIO.output(IN_B,GPIO.LOW)
sleep(3)
except KeyboardInterrupt:
pass
GPIO.cleanup()
ピン番号を定数化しろと言われそうなソースコードです。
ポイントは13行目。
line13: p21 = GPIO.PWM(21,50)
の部分です。
右辺第1引数が、GPIO番号、第2引数が周波数(50は教本参考)です。
戻り値のPWMインスタンスが左辺となるようです。
次のポイントは、20行目。
line20: p21.ChangeDutyCycle(100)
の部分です。
ChangeDutyCycleの引数でデューティ比を指定します。
範囲は、0.0~100.0 となっており、100が全力となります。
line34: p21.ChangeDutyCycle(50)
は全力の半分の出力となります。
startやstopのメソッドもあるようです。
教本はこの制御をドライバのIN1,IN2(上でいう20ピン、26ピン)に対して行うことで、速度の制御をしていました。
正回転、逆回転の制御は、IN_A(20ピン)、IN_B(26ピン)で行います。
IN_A | IN_B | action | |
---|---|---|---|
1 | GPIO.HIGH | GPIO.HIGH | ブレーキ |
2 | GPIO.HIGH | GPIO.LOW | 正回転 |
3 | GPIO.LOW | GPIO.HIGH | 逆回転 |
4 | GPIO.LOW | GPIO.LOW | エンジンブレーキ |
1の場合は、IN_A,IN_B どちらも回転しようとして急ブレーキ、
2の場合は、IN_A,IN_B どちらも動力を失うので緩やかなブレーキとなります。
が、かなりスピードが出ていなければ違いは判らないかと思います。
またまた動画撮ってみた
LEDを活かしてなるべく分かりやすくしてみました。
IN_A が「GPIO.HIGH」の時、右のLEDが光り、
IN_B が「GPIO.HIGH」の時、左のLEDが光ります。
(反対側もちょっと光っちゃってますが、強く光る方がHIGHです。)
右回転の時は、デューティ比100 、左回転の時はデューティ比50 、です。
(角度の問題か、光の強さの比較が分かり辛いです。音出してもOKって方は駆動音聞き比べて貰えば分かるかもしれません。)
ひとまず、モータ駆動は成功です。
さて、戦車は自動車と違い、曲がるときにタイヤの角度を付けることが出来ません。(そもそもタイヤじゃないけど)
前輪を「 |-----| 」から 「 /-----/ 」こうして曲がることは出来ないのです。
左右の履帯の回転速度を変えて方向転換をしたり、旋回したりします。
超信地旋回!!
つまり、上の制御を二つのモーターで行います。
すなわち、モータドライバが二つ必要です。
まとめ
秋月商店にGO!!
次回は2つのモータを制御します。
Discussion