Raspberry Pi PicoでL293Dを使う方法 | DCモーターを制御する

  • URLをコピーしました!

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

最近、ラズパイを使って動くロボットを作ってみたいと思い、タミヤのギアボックスを購入しました。
このギアボックスは左右独立タイプなので、回転方向を変えれば左右に曲がることができます。

今回はこのギアボックスのモーターをラズピコで制御する方法を解説します。

目次

モータードライバーとは?

ギアボックスのモーターは動かすのにLEDよりずっと大きな電流が必要になります。
そのため、モーターはラズピコのGPIOピンからは直接制御ができません。そこで、モータードライバーに信号を送ることで、代わりにモーターを制御してもらいます。

今回使うモータードライバー

今回使うモータードライバーはL293Dというモータードライバです。

L293Dの性能は以下の通りです。

供給電圧範囲4.5V~36V
出力電流600mA
ピーク出力電流チャンネルあたり 1.2A 非繰り返し
チャンネル数4チャンネル
(2つのDCモーターまたは1つのステッピングモーターを制御可能)
動作周波数最大5Khz
yossy

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

配線

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を使ってモーターを制御して、タミヤのギアボックスをラズピコから動かすことができました。

yossy

これでロボットが動き回れる!

ということで、次はセンサーを使った制御をしてみたいと思います。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次