Raspberry Piを購入したら、ロボットやラジコンカーを作ってみたくなりませんか?
ロボットやラジコンを動かすにはモーターを制御する必要があります。今回のポイントはRaspberry Piでモーターを動かすです。では、解説していきましょう。
準備したもの
- Raspberry Pi Zero WH
- DCモーター
- モータードライバ TA7291P
- ブレッドボード
- ジャンパワイヤ オス-メス
- 電池ボックス
- 単三電池 × 2
モーター制御の仕組み
モーターを動かすのは電池を繋げばいいだけじゃないの?
ミニ四駆なんて単三電池2本と繋がってるだけじゃん。
Raspberry PiのGPIOからモーターを制御するにはモータードライバICが必要
Raspberry PiのGPIO出力電圧は3.3V、1ピンあたりの出力電流は16mA、合計50mAです。これではモーターを動かす出力が全然足りません。
ここで、モーターに大電流を流すのに活躍するのがモータードライバICです。
モータードライバICは、4つのトランジスタを用いたHブリッジ回路が1チップとしてモジュール化されています。
モーターに大電流を流すためのトランジスタ
トランジスタは簡単に言うと電子的なスイッチです。
トランジスタは3極端子があり、1極に電圧を加えると残り2極間が通電する仕組みです。この2極に電池を繋ぎ、1極にRaspberry Pi GPIO端子から電圧を加えればモーターに大電流が流れ、GPIOからの低電流でモーターを駆動することが出来ます。
モーターの正転、逆転を可能にするHブリッジ回路の仕組み
トランジスタ1個だけでは、正転しか出来ないですがトランジスタを4個、H型に配線することで正転、逆転を切り替えることが可能となります。
このような回路をHブリッジ回路と呼びます。
Hブリッジ回路でモーターを正転、逆転させる仕組みを図で説明します。
図はトランジスタを一つのスイッチと見立ています。
4つのスイッチON/OFF組み合わせで、モーターを正転、逆転出来ます。スイッチ1と4をONにするとモーターが正転します。スイッチ2と3をONにすると正転時とは逆方向に電流が流れ、モーターが逆転します。この他にスイッチ1と2もしくは3と4をONにするとブレーキがかかります。
モータードライバICを使ったモーターの正転、逆転方法
モーターを正転、逆転、ブレーキさせるにはRaspberry Piからどのような指令をモータードライバICに送ればよいでしょうか。
ここではTA7291PというモータードライバICを例にします。
TA7291Pの動作方法はデータシートを見ることで分かります。ここでは要点のみ説明します。
前節で説明しました通り、モータードライバICにはブリッジ回路が組まれていて、4つのトランジスタON/OFFの組み合わせでモーターを正転、逆転出来ます。TA7291Pはこの4つのトランジスタを2つのデジタル信号の組み合わせで制御することが出来ます。IN1/IN2端子とGPIO端子を繋ぎ、以下のようにIN1/IN2端子に信号入力するとモーターを正転/逆転出来ます。
入力 | 出力 | モード | ||
IN1 | IN2 | OUT1 | OUT2 | |
0 | 0 | ∞ | ∞ | ストップ |
1 | 0 | H | L | 正転 |
0 | 1 | L | H | 逆転 |
1 | 1 | L | L | ブレーキ |
※∞はハイインピーダンス
回路図
Raspberry PiとTA7291Pと電池の繋ぎ方
TA7291Pのデータシートを見ても、Raspberry Piとどう接続したらいいのか分からないという人も多いかと思います。TA7291Pの端子接続を下表に纏めましたので参考にして下さい。
端子記号 | 端子説明 | 接続先 |
Vcc | ロジック側電源端子 | Raspberry Pi +5V端子 |
Vs | 出力側電源端子 | 電池+極 |
Vref | 制御電源端子 | 電池+極 (3kΩ以上の保護抵抗を介す) |
GND | GND | Raspberry Pi GND & 電池ー極 |
IN1 | 入力端子1 | Raspberry Pi GPIO 27 |
IN2 | 入力端子2 | Raspberry Pi GPIO 22 |
OUT1 | 出力端子1 | モーター +極 |
OUT2 | 出力端子2 | モーター ー極 |
ブレッドボード回路
モーター正転、逆転をさせるサンプルプログラム
プログラムの流れについて説明します。まず、GPIO端子の出力設定をし、初期出力値を設定します。次にキー入力待ちの無限ループとし、「e」キーが押されたら正転、「d」キーが押されたら逆転、「q」キーが押されたら停止させるようにしています。
import RPi.GPIO as GPIO
import sys
GPIO.setmode(GPIO.BCM)
GPIO.setup(27, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)
GPIO.output(27, GPIO.LOW)
GPIO.output(22, GPIO.LOW)
try:
while True:
#「e」キーが押されたら前進
c = sys.stdin.read(1)
if c == 'e':
GPIO.output(27, GPIO.HIGH)
GPIO.output(22, GPIO.LOW)
#「d」キーが押されたら後退
if c == 'd':
GPIO.output(27, GPIO.LOW)
GPIO.output(22, GPIO.HIGH)
#「q」キーが押されたら止まる
if c == 'q':
GPIO.output(27, GPIO.LOW)
GPIO.output(22, GPIO.LOW)
except KeyboardInterrupt:
pass
GPIO.cleanup()
動作確認
単にモーターを正転、逆転するだけでは分かりにくいので、タミヤ ダブルギヤボックスの片側モーターのみ駆動させたときの動きをご覧ください。
キーを押すごとにモーターが正転→停止→逆転→停止します。
まとめ
Raspberry Piを用いてモーターを正転、逆転させる方法について解説しました。
ポイントは
- モーター正転、逆転するにはHブリッジ回路が必要
- Hブリッジ回路を1チップにモジュール化したのがモータードライバIC
- Raspberry PiのGPIOからモータードライバICへ、2つの信号を送信することでモーター正転、逆転を可能にする
です。
モーター制御は電子工作の第一歩です。これから、ものづくりの幅が広がりますね!