皆さんこんにちは。yossyです。

最近、ラズパイを使って動くロボットを作ってみたいと思い、タミヤのギアボックスを購入しました。
このギアボックスは左右独立タイプなので、回転方向を変えれば左右に曲がることができます。
今回はこのギアボックスのモーターをラズピコで制御する方法を解説します。
モータードライバーとは?
ギアボックスのモーターは動かすのにLEDよりずっと大きな電流が必要になります。
そのため、モーターはラズピコのGPIOピンからは直接制御ができません。そこで、モータードライバーに信号を送ることで、代わりにモーターを制御してもらいます。
今回使うモータードライバー
今回使うモータードライバーはL293Dというモータードライバです。
L293Dの性能は以下の通りです。
供給電圧範囲 | 4.5V~36V |
---|---|
出力電流 | 600mA |
ピーク出力電流 | チャンネルあたり 1.2A 非繰り返し |
チャンネル数 | 4チャンネル (2つのDCモーターまたは1つのステッピングモーターを制御可能) |
動作周波数 | 最大5Khz |

出力電流が若干低いので、ハイパワーな用途には向かないと思います。


配線
L293Dには、16本のピンがあります。チップを正面から見たときの左下が1番ピンです。
今回は2つのDCモーターを制御するのですべてのピンを使います。
ピン | 名称 | 機能 | 接続先 |
---|---|---|---|
1番 | Enable 1,2 | ドライバチャンネル1,2を有効にする | ラズピコ13番ピン |
2番 | Input 1 (1A) | ドライバ入力1 | ラズピコ14番ピン |
3番 | Output 1 (1Y) | ドライバ出力1 | モータAのプラス |
4番 | GND | グランド | マイナス |
5番 | 〃 | 〃 | 〃 |
6番 | Output 2 (2Y) | ドライバ出力2 | モーターAのマイナス |
7番 | Input 2 (2A) | ドライバ入力2 | ラズピコ15番ピン |
8番 | VCC2 | モーター用電源 4.5V~36V | モーター用電源(5V)プラス (マイナスはラズピコに接続) |
9番 | Enable 3,4 | ドライバチャンネル3,4を有効にする | ラズピコ18番ピン |
10番 | Input 3 (3A) | ドライバ入力3 | ラズピコ16番ピン |
11番 | Output3 (3Y) | ドライバ出力3 | モーターBプラス |
12番 | GND | グランド | マイナス |
13番 | 〃 | 〃 | 〃 |
14番 | Output 4 (4Y) | ドライバ出力4 | モーターBマイナス |
15番 | Input 4 (4A) | ドライバ入力4 | ラズピコ17番ピン |
16番 | VCC1 | 内部ロジック用電源5V | モーター用電源(5V)プラス (マイナスはラズピコに接続) |
モーター用電源の5VにラズピコのVBUS端子は使用しないでください。
プログラム
動作内容
このモータードライバは入力端子のオン・オフを切り替えることで回転方向を、Enableピンに送るPWMの信号で速さを制御できます。
IN1/IN2, IN3/IN4のオン・オフをそれぞれ変えると、回転方向が逆になります。
(例:IN1 = ON, IN2 = OFF →正転 / IN1 = OFF, IN2 = ON →逆転)
また、両方をオフにすることでモーターを止めることができます。
PWMとは日本語でパルス幅変調といい、信号のオン・オフを高速で繰り返すことで電圧を擬似的に変える仕組みです。Raspberry Pi PicoのPMWは0(0%)~65535(100%)の間で比率を設定できるので、65535の何%かで速さを制御しています。
ソースコード
from machine import Pin, PWM
import time
# GPIOピン設定
IN1 = Pin(14, Pin.OUT) # モーターA方向1
IN2 = Pin(15, Pin.OUT) # モーターA方向2
ENA = PWM(Pin(13)) # モーターA速度制御 (PWM)
IN3 = Pin(17, Pin.OUT) # モーターB方向1
IN4 = Pin(16, Pin.OUT) # モーターB方向2
ENB = PWM(Pin(18)) # モーターB速度制御 (PWM)
# PWMの周波数を設定
ENA.freq(1000)
ENB.freq(1000)
while True:
ENA.duty_u16(int(100 * 65535 / 100)) # =65535 =100%
ENB.duty_u16(int(100 * 65535 / 100))
IN1.on()
IN2.off()
IN3.on()
IN4.off()
print("正転, 100%")
time.sleep(2)
ENA.duty_u16(int(50 * 65535 / 100)) # =32767 =0%
ENB.duty_u16(int(50 * 65535 / 100))
IN1.off()
IN2.on()
IN3.off()
IN4.on()
print("逆転, 50%")
time.sleep(2)
IN1.off()
IN2.off()
IN3.off()
IN4.off()
print("静止")
time.sleep(2)
動作の様子
こちらが、実際に動作している様子です。わかりやすいようにタイヤを付けて動かしています。
もしモーターが回る向きがおかしいときは、モーターの配線を逆にしてみてください。
まとめ
今回は、モータードライバーL293Dを使ってモーターを制御して、タミヤのギアボックスをラズピコから動かすことができました。



これでロボットが動き回れる!
ということで、次はセンサーを使った制御をしてみたいと思います。



