🤖

【Raspberry Pi】 モーターを回そう。「DCモーター編」①

2022/07/31に公開

モーターを回そう!

さて、今回は、戦車を動かすための動力源であるモーターの制御です。
教本ではLEDの後、スイッチおよび A/Dコンバータを学ぶ章が続きますが、
戦車には不要と判断し、すっ飛ばしました。さっと実習するに留めました。
動いてる戦車のスイッチは押せませんし、A/Dコンバータのような事は、
戦車として動くようになってからでも良いでしょう。

今回はモーターを動かします。
電池とモーターを繋げれば元気に回転しますが、制御をしたいので、
A/Dコンバータでも少し出てきたドライバ(半導体)が登場します。
TA7291P というものを使用します。
TA7291P
こんなやつです。

データシートを見ると左から順に、

  1. GND
  2. OUT1
  3. なし
  4. Vref
  5. IN1
  6. IN2
  7. Vcc
  8. Vs
  9. なし
  10. OUT2

とのこと。

INはラズパイからの入力、OUTはモータへの出力ですね。
Vrefは制御電源端子とあるので、制御のために必要、
Vccはロジック側制御端子なので、ドライバの駆動に必要、
Vsは出力側電源端子なので、モータの駆動に必要、という事でしょうか。(調べました)

LEDとは違い、モータの電源はラズパイのピンから取得してはいけないらしいです。
試しにやってみたらラズパイが再起動しました・・・(壊れなくてよかった。)
モータ用の電源は電池などから提供します。

制御を行うVrefをラズパイのGPIOピン、Vccをラズパイの5V、Vsを電池等の+極と繋ぎ、
INの二つをGPIOピン、OUTの二つをモータに繋ぎます。
GNDは共有するらしいので、電池のマイナスと、ラズパイのGNDが繋がるようにします。

Fritzing という便利なものがありました!
frit_motor

教本だと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 どちらも動力を失うので緩やかなブレーキとなります。
が、かなりスピードが出ていなければ違いは判らないかと思います。


またまた動画撮ってみた
DC

LEDを活かしてなるべく分かりやすくしてみました。
IN_A が「GPIO.HIGH」の時、右のLEDが光り、
IN_B が「GPIO.HIGH」の時、左のLEDが光ります。
(反対側もちょっと光っちゃってますが、強く光る方がHIGHです。)
右回転の時は、デューティ比100 、左回転の時はデューティ比50 、です。
(角度の問題か、光の強さの比較が分かり辛いです。音出してもOKって方は駆動音聞き比べて貰えば分かるかもしれません。)
ひとまず、モータ駆動は成功です。


さて、戦車は自動車と違い、曲がるときにタイヤの角度を付けることが出来ません。(そもそもタイヤじゃないけど)
前輪を「 |-----| 」から 「 /-----/ 」こうして曲がることは出来ないのです。
左右の履帯の回転速度を変えて方向転換をしたり、旋回したりします。
超信地旋回!!
つまり、上の制御を二つのモーターで行います。
すなわち、モータドライバが二つ必要です。

まとめ

秋月商店にGO!!
次回は2つのモータを制御します。

GitHubで編集を提案

Discussion