モーターを回そう!
さて、今回は、戦車を動かすための動力源であるモーターの制御です。
教本では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つのモータを制御します。
コメント