L293Dモーターシールドの使い方:AFMotor、DCモーター4個、ステッピングモーター、サーボ
L293Dモーターシールドの使い方を解説します。AFMotorライブラリ、PWRジャンパー、空きピン、4WDカーのコード、ステッピングモーターとサーボ、0.6 Aの制限、モーターが回らないときの対処法まで紹介します。
L293Dモーターシールドは、Arduino Unoの上に直接差し込むモータードライバ基板で、1枚でDCモーター4個、ステッピングモーター2個、サーボ2個を動かせます。2個のL293Dチップがモーターに必要な電流を供給し、回転方向を切り替え、PWMで速度を調整するので、ジャンパーワイヤーを1本も使わずに四輪ロボットカーのすべてのモーターを制御できます。市販のボードはほぼすべてAdafruitの古いMotor Shield V1の設計をコピーしたもので、同じライブラリ、つまりAFMotorでプログラムします。
このガイドでは、シールドに何が載っているか、どのArduinoのピンを使い、どのピンがセンサー用に空いているか、わかりにくいPWRジャンパーの3通りの電源構成での使い方、AFMotorライブラリの命令、そしてスマホで操作する四輪ロボットカーの完全なコードを紹介します。最後の章では、0.6 Aの電流制限、チップが熱くなる理由、L298Nとの違い、「モーターが回らない」原因として知られているものを1つの表にまとめました。

L293Dモーターシールドとは?仕組みは?
DCモーターを両方向に回すには、Hブリッジと呼ばれる4つのスイッチの回路が必要です。この考え方は「L298NでDCモーターを制御する方法」で詳しく説明しています。L293Dチップの中には2つのHブリッジがあり、シールドにはこのチップが2個載っているので、合計4つのモーターチャンネルになります。名前の「D」は、モーターがオフになるときに生じる逆電圧のスパイクを吸収する保護ダイオードがチップに内蔵されていることを示します。また、L293Dは過熱すると自動的に出力を停止します。
シールドの本当の工夫は、中央にある74HC595シフトレジスタです。4つのモーターはそれぞれ方向用に2本、速度用に1本の信号が必要で、合計するとArduinoのピンが12本必要になります。シールドは8本分の方向信号を74HC595にシリアルで送るので、そのためには4本のピン(D4、D7、D8、D12)しか使わず、速度用に4本のPWMピン(D3、D5、D6、D11)を使います。この設計でピンを節約できますが、代わりにdigitalWriteでモーターを直接動かすことはできません。方向のビットをレジスタに送り込むライブラリが必要で、それがAFMotorです。
| 項目 | 値 |
|---|---|
| ドライバチップ | L293D × 2個(Hブリッジは合計4つ) |
| 方向の制御 | 74HC595シフトレジスタ(D4、D7、D8、D12) |
| モーターの電源電圧 | 4.5〜25 V(外部電源の端子台) |
| チャンネルあたりの電流 | 連続0.6 A、ごく短時間のピーク1.2 A |
| 速度の調整 | 8ビットPWM、setSpeed(0〜255) |
| 駆動できるモーター | DCモーター4個、ステッピングモーター2個、またはDC 2個+ステッピング1個 |
| サーボ | 2個、Arduinoの5 Vラインから給電(D9とD10) |
| 保護 | 内蔵ダイオード、過熱保護 |
| 対応ボード | Arduino Uno R3とMega 2560(Uno R4とLeonardoは非対応) |
基板には何がある?端子台、ピンヘッダー、ジャンパー
| 部品 | 役割 |
|---|---|
| M1とM2の端子台(左) | 1番目と2番目のDCモーター。中央のGNDネジはユニポーラのステッピングモーターの共通線用です |
| M3とM4の端子台(右) | 3番目と4番目のDCモーター、またはステッピングモーターのポート2 |
| EXT_PWR(+MとGND) | モーターの電源入力:電池パックまたはACアダプター |
| PWRジャンパー | 取り付けると、モーター電源がArduinoのVinラインにつながります |
| SER1とSERVO_2 | 2つのサーボ用ピンヘッダー(−、+、S)。D10とD9 |
| PWR LED | モーター電源が来ているかを示します。消えているとモーターは回りません |
| RESETボタン | Arduinoのリセットボタンをシールドの上に複製したもの |
| A0〜A5の列 | 空いているアナログピン。多くのボードでは隣に+5VとGNDの列もあります |
シールドが使うピンと空いているピンは?
| Arduinoのピン | シールドでの役割 | 使用中になるのは? |
|---|---|---|
| D3 | M2の速度(PWM、Timer2) | M2またはステッピングモーター1を使うとき |
| D4 | 74HC595のクロック(CLK) | DCモーターかステッピングモーターを1つでも使うとき |
| D5 | M4の速度(PWM、Timer0) | M4またはステッピングモーター2を使うとき |
| D6 | M3の速度(PWM、Timer0) | M3またはステッピングモーター2を使うとき |
| D7 | 74HC595の出力イネーブル(EN) | モーターを1つでも使うとき |
| D8 | 74HC595のデータ入力(DATA) | モーターを1つでも使うとき |
| D9 | SERVO_2の信号(Timer1) | そのサーボを使うときだけ |
| D10 | SER1の信号(Timer1) | そのサーボを使うときだけ |
| D11 | M1の速度(PWM、Timer2) | M1またはステッピングモーター1を使うとき |
| D12 | 74HC595のラッチ(LATCH) | モーターを1つでも使うとき |
| D0、D1 | 未使用(USBシリアルの線) | 書き込み中とシリアルモニタを開いている間 |
| D2 | 未使用。基板に小さなはんだ付け用のパッドがあります | 使用しない |
| D13 | 未使用ですが、シールドの上には引き出されていません | 使用しない |
| A0〜A5(D14〜D19) | 未使用。基板の端に1列に並んでいます | 使用しない |
空いている6本のアナログピンはセンサー用として十分です。UnoのA0〜A5は、必要に応じて14〜19番のデジタルピンとしても使えるからです。実用的な割り当ての例は次のとおりです。A0とA1に「HC-SR04距離センサー」またはSoftwareSerialでBluetoothモジュール、A2とA3にライントレース用や障害物検知用のセンサー、A4とA5にI2Cバス(OLED、LCD、MPU6050)。attachInterrupt()を使うホイールエンコーダーやボタンに使える空きピンはD2だけです。Unoのもう1つの割り込みピンD3は、M2の速度ピンだからです。サーボを使わないならD9とD10も空きます。ボードのピン配置は「ピン配置」ツールで、各ピンの機能は「Arduino Unoのピン配置」で確認できます。
電源とPWRジャンパー:正しい配線の3つの方法
基板の下の端にある2本ネジのEXT_PWR端子台が、モーターの電源入力です。プラス側はふつう「+M」か「+」、マイナス側は「GND」と表記されています。そのすぐ隣のPWRジャンパーは、このモーター電源のラインをArduinoのVinピンにつなぎます。ジャンパーを付けると、2枚のボードが1つの電源で動きます。EXT_PWRに加えた電圧がVinを通ってArduinoも動かし、逆にArduinoのDCジャックに差したACアダプターがモーターにも給電します。ジャンパーを外すと、2つのラインは完全に分かれます。基板上のPWR LEDはモーター電源が来ているときだけ点灯します。モーターのトラブルシューティングを始める前に、まず確認すべきなのがこのLEDです。
| 構成 | Arduinoの電源 | モーターの電源 | PWRジャンパー |
|---|---|---|---|
| 1つの電源(7〜12 Vの電池またはACアダプター) | 同じ電源からVin経由 | EXT_PWRまたはArduinoのDCジャック | 取り付ける |
| ArduinoはUSB、モーターは電池 | USBケーブル | EXT_PWR | 外す |
| 2つの別々の電源(いちばん安全) | DCジャックまたはUSB | EXT_PWR | 外す |
ロボットカーでいちばんよく使われるのは1つの電源にする方法です。18650電池2本のパックをEXT_PWRにつなぎ、ジャンパーを付ければ、Arduinoもモーターも同じ電池で動きます。シンプルですが、モーターが起動時に大きな電流を流すと電池の電圧が一瞬下がり、Arduinoがリセットすることがあります。そうなったら、ジャンパーを外してArduinoを別の電源(モバイルバッテリー、USB、9 VのACアダプター)から給電すれば確実に解決します。机の上で試すときは2番目の構成がいちばん便利です。Arduinoはパソコンにつないだまま、モーターは電池で動かし、ジャンパーは外しておきます。
どの電池を選べばいいでしょうか?L293Dの出力トランジスタは電流に応じて約1.5〜2.6 Vを消費するので、モーターには電池の電圧よりそのぶん低い電圧しかかかりません。ロボットキットの黄色い3〜6 VのTTモーターには、18650リチウム電池2本(公称7.4 V、満充電で8.4 V)が最適です。モーターには約5.5〜6 Vがかかり、ジャンパーを付けた状態でもArduinoのレギュレーターに余裕があります。単3電池4本(6 V)ではモーターに約4 Vしか残らず、Vin経由でArduinoに給電するにも足りません。9 V電池(006P / PP3)は数百ミリアンペア以上を流せないので、モーターがまったく回らないか、数分で電池が切れます。動作時間は電池寿命計算ツールで見積もれます。電源の選び方の全体は「Arduinoを電池で動かす方法」をご覧ください。
AFMotorライブラリのインストール
- Arduino IDEでライブラリマネージャを開きます(「ツール」>「ライブラリを管理」またはCtrl+Shift+I)。
- 検索欄にAdafruit Motor Shieldと入力します。2つの結果が表示されます。説明に「V1 firmware」と書かれたAdafruit Motor Shield libraryと、Adafruit Motor Shield V2 Libraryです。
- L293DのシールドにはV1のほうをインストールします。V2のライブラリは、I2Cで通信しTB6612チップを使うまったく別のボード用です。
- スケッチの先頭に#include <AFMotor.h>の行を追加します。
- 必要なら「ファイル」>「スケッチ例」>「Adafruit Motor Shield library」>「MotorTest」を開き、M1につないだモーターでボードを試してください。
最初のスケッチ:DCモーターを前進、後退、いろいろな速度で回す
モーターの2本の線をM1端子台の外側の2つのネジに固定し、中央のGNDネジは空けておきます。電池パックをEXT_PWRにつなぎ、ArduinoをUSBでパソコンに接続して、PWRジャンパーを外します(上の2番目の構成)。PWR LEDが点灯していたら、下のコードを書き込みます。モーターはまずゆっくり加速して減速し、次に2秒間逆回転して止まります。
1#include <AFMotor.h> // Adafruit Motor Shield V1 kütüphanesi / library
2
3AF_DCMotor motor(1); // M1 klemensi / M1 terminal
4
5void setup() {
6 Serial.begin(9600);
7 Serial.println(F("L293D motor testi / motor test"));
8 motor.setSpeed(200); // 0–255; bunu unutursan motor dönmez / skip this and the motor won't turn
9 motor.run(RELEASE); // başlangıçta dur / start stopped
10}
11
12void loop() {
13 motor.run(FORWARD); // ileri / forward
14 for (int s = 60; s <= 255; s++) { // yavaşça hızlan / ramp up
15 motor.setSpeed(s);
16 delay(10);
17 }
18 for (int s = 255; s >= 60; s--) { // yavaşça yavaşla / ramp down
19 motor.setSpeed(s);
20 delay(10);
21 }
22 motor.run(RELEASE); // dur / stop
23 delay(500);
24
25 motor.setSpeed(180);
26 motor.run(BACKWARD); // geri / backward
27 delay(2000);
28 motor.run(RELEASE);
29 delay(1000);
30}| 命令 | 働き |
|---|---|
| AF_DCMotor motor(1); | M1端子台のモーターを作成します。1〜4の番号を指定します |
| AF_DCMotor motor(1, MOTOR12_64KHZ); | M1とM2のPWM周波数も選びます |
| motor.setSpeed(200); | 速度を0〜255で設定します(0で停止、255で全速) |
| motor.run(FORWARD); | 前進方向に回します |
| motor.run(BACKWARD); | 後退方向に回します |
| motor.run(RELEASE); | モーターの駆動をやめ、モーターが止まります |
| motor.run(BRAKE); | ライブラリには定義されていますが、V1では何もしません |
速度は、モーターへの電力を1秒間に何千回もオン・オフして調整します。詳しくは「PWMとは?」をご覧ください。M1とM2はTimer2を使うので、周波数を選べます。MOTOR12_64KHZ、MOTOR12_8KHZ(初期値)、MOTOR12_2KHZ、MOTOR12_1KHZです。64 kHzにするとモーターの高い音が聞こえなくなりますが、L293Dはその周波数ではより熱くなります。一方、M3とM4はTimer0につながっています。このタイマーはmillis()とdelay()も動かしているため、ライブラリはその周波数を変更せず、この2つのチャンネルは常に約1 kHzで動きます。
四輪(4WD)ロボットカーのコード

L293Dモーターシールドのいちばん人気の使い道は四輪ロボットカーです。4つのモーターがそれぞれ自分の端子台につながり、配線がごちゃごちゃしないからです。この種の車にはハンドルがなく、戦車のように曲がります。左側の2輪が一方に、右側の2輪が反対に回ると、車はその場で回転します。そのため、コードでは4つのモーターを1つずつではなく、左側と右側の2つのグループとして制御します。スマホから操作するために、HC-05 Bluetoothモジュールを空いているA0とA1にSoftwareSerialでつなぎます(日本では技適マークのない無線モジュールの使用は電波法で制限されています)。モジュールの詳細は「HC-05 Bluetoothモジュール」をご覧ください。
| 部品 | 接続 |
|---|---|
| 左前のモーター | M1 |
| 左後ろのモーター | M2 |
| 右後ろのモーター | M3 |
| 右前のモーター | M4 |
| HC-05 TXD | A0(SoftwareSerial RX) |
| HC-05 RXD | A1、1 kΩ + 2 kΩの分圧回路を経由(5 V → 3.3 V) |
| HC-05のVCCとGND | シールドの+5VとGNDの列 |
| 18650電池 × 2本(7.4 V) | EXT_PWR(+MとGND)、PWRジャンパーを取り付ける |
1#include <AFMotor.h>
2#include <SoftwareSerial.h>
3
4AF_DCMotor frontLeft(1); // M1: sol ön / front left
5AF_DCMotor rearLeft(2); // M2: sol arka / rear left
6AF_DCMotor rearRight(3); // M3: sağ arka / rear right
7AF_DCMotor frontRight(4); // M4: sağ ön / front right
8
9SoftwareSerial bt(A0, A1); // RX = A0 (HC-05 TXD), TX = A1 (HC-05 RXD, bölücüyle / via a divider)
10
11int speed = 200; // 0–255 arası sürüş hızı / driving speed 0–255
12
13void setSide(AF_DCMotor &a, AF_DCMotor &b, int value) { // -255 … 255
14 uint8_t dir = value > 0 ? FORWARD : (value < 0 ? BACKWARD : RELEASE);
15 uint8_t pwm = constrain(abs(value), 0, 255);
16 a.setSpeed(pwm);
17 b.setSpeed(pwm);
18 a.run(dir);
19 b.run(dir);
20}
21
22void drive(int left, int right) { // sol ve sağ taraf / left and right side
23 setSide(frontLeft, rearLeft, left);
24 setSide(frontRight, rearRight, right);
25}
26
27void setup() {
28 Serial.begin(9600); // hata ayıklama / debugging
29 bt.begin(9600); // HC-05 varsayılan hızı / default baud rate
30 drive(0, 0);
31}
32
33void loop() {
34 if (!bt.available()) return;
35 char c = bt.read();
36 Serial.println(c);
37
38 switch (c) {
39 case 'F': drive(speed, speed); break; // ileri / forward
40 case 'B': drive(-speed, -speed); break; // geri / backward
41 case 'L': drive(-speed, speed); break; // yerinde sola / spin left
42 case 'R': drive(speed, -speed); break; // yerinde sağa / spin right
43 case 'G': drive(speed / 3, speed); break; // ileri-sola kavis / curve forward-left
44 case 'I': drive(speed, speed / 3); break; // ileri-sağa kavis / curve forward-right
45 case 'S': drive(0, 0); break; // dur / stop
46 case 'q': speed = 255; break; // tam hız / full speed
47 default:
48 if (c >= '0' && c <= '9') speed = map(c - '0', 0, 9, 90, 240); // hız kademesi / speed step
49 }
50}コードの中心はdrive(left, right)関数です。左右それぞれに-255〜255の値を受け取り、プラスは前進、マイナスは後退、0は停止を意味します。setSide()は、同じ側の2つのモーターに同じ速度と方向を与えます。命令は、アプリストアにある「Arduino Bluetooth RC Car」タイプのアプリが送る1文字です。Fは前進、Bは後退、LとRはその場で回転、GとIはカーブ、Sは停止です。アプリの速度スライダーは0〜9の数字を送り、コードはそれを90〜240のPWM値に変換します。下限を90にしているので、いちばん低い段階でもモーターが起動できます。1つの車輪が逆に回る場合は、コードを変えずに、そのモーターの2本の線を端子台で入れ替えてください。シャーシの組み立てとモーター2個の版は「Arduinoロボットカーの作り方」をご覧ください。
ステッピングモーターの駆動:28BYJ-48とNEMA 17
シールドは同時に2つのステッピングモーターを動かせます。ステッピングモーターのポート1はM1とM2の端子台、ポート2はM3とM4を使います。バイポーラのモーター(NEMA 17のような4線式)では、一方のコイルをM1に、もう一方のコイルをM2につなぎます。ユニポーラのモーター(5線式または6線式)でも2つのコイルはM1とM2につなぎ、共通線は端子台の中央のGNDネジにつなぎます。人気の28BYJ-48の配線は次のとおりです。青と黄の線をM1に、ピンクとオレンジの線をM2に、赤い共通線をGNDにつなぎます。このモーターをULN2003基板で使う方法は「ステッピングモーターとは?」をご覧ください。
| ステップの種類 | 仕組み | 使いどころ |
|---|---|---|
| SINGLE | 常に1つのコイルだけに通電します | 電流がいちばん少なく、トルクもいちばん低い |
| DOUBLE | 2つのコイルに同時に通電します | トルクが高い。いちばんよく使われます |
| INTERLEAVE | 1つと2つのコイルを交互に通電します(ハーフステップ) | 分解能が2倍で、回転がなめらか |
| MICROSTEP | コイルの電流をPWMで段階的に変え、1フルステップを16分割します | ゆっくり静かに回る。トルクは下がります |
28BYJ-48は5 Vのモーターです。この実験では、モーター電源を単3電池4本(6 V)にし、ジャンパーを外して、ArduinoはUSBで動かしてください。モーター内部のギアボックスのため、フルステップで1回転は2048ステップです。
1#include <AFMotor.h>
2
3// 28BYJ-48: tam adımda tur başına 2048 adım / 2048 full steps per revolution
4AF_Stepper stepper(2048, 1); // 1 = M1 + M2, 2 = M3 + M4
5
6void setup() {
7 stepper.setSpeed(10); // dakikada 10 tur / 10 RPM
8}
9
10void loop() {
11 stepper.step(2048, FORWARD, DOUBLE); // bir tur ileri, güçlü tork / one turn forward, more torque
12 delay(500);
13 stepper.step(4096, BACKWARD, INTERLEAVE); // yarım adımla bir tur geri / one turn back in half steps
14 stepper.release(); // bobinleri kapat, ısınmasın / de-energise the coils
15 delay(1000);
16}setSpeed()は1分あたりの回転数を設定します。28BYJ-48はギアボックスがあるため、毎分10〜15回転より速くは回れません。注意したいのは、step()がブロッキングの関数であることです。モーターが指定したステップを終えるまで、loop()はほかに何もしません。ステッピングモーターが回っている間にセンサーを読んだりDCモーターを動かしたりしたい場合は、ライブラリのonestep()関数をAccelStepperライブラリと組み合わせて使ってください。ライブラリに付属するスケッチ例のAFMotor_ConstantSpeedが、まさにその方法を示しています。待機中にrelease()でコイルをオフにすると発熱を防げますが、その間は軸の保持トルクがなくなります。
サーボの接続:SER1とSERVO_2のピンヘッダー
シールドの角にある2つの3ピンのピンヘッダーはサーボ用です。基板の表記によると、ピンは−(GND)、+(5 V)、S(信号)の順です。サーボの茶色の線を−に、赤を+に、オレンジをSにつなぎます。基板の回路図によると、SER1はD10に、SERVO_2はD9につながっています(番号を逆に書いている資料もあるので、サーボが動かないときはコードでもう一方のピンを試してください)。サーボは標準のServoライブラリで動かします。このライブラリがUnoで使うTimer1はモーターのタイマーと競合しないので、DCモーターとサーボは同時に問題なく動きます。
サーボの電源はモーターの電池からではなく、Arduinoの5 Vラインから来ます。SG90なら問題ありませんが、MG996Rのような大きなサーボは動くときに1 Aを超える電流を流すことがあります。Arduinoのレギュレーターが熱くなり、電圧が落ちてボードがリセットします。大きなサーボでは信号線だけをピンヘッダーに差し、サーボの+と−は別の5〜6 Vの電源から給電して、GNDを共通にしてください。詳しくは「MG996Rサーボモーター」と「サーボモーターとは?」をご覧ください。下のコードは、M3のモーターを回しながらSER1のサーボを左右に往復させます。
1#include <AFMotor.h>
2#include <Servo.h>
3
4AF_DCMotor motor(3); // M3 klemensi / M3 terminal
5Servo servo1; // SER1 başlığı / SER1 header
6
7void setup() {
8 servo1.attach(10); // SER1 = D10, SERVO_2 = D9
9 motor.setSpeed(170);
10 motor.run(FORWARD); // motor dönerken servo tarar / servo sweeps while the motor runs
11}
12
13void loop() {
14 for (int a = 20; a <= 160; a += 2) { // sağa tara / sweep right
15 servo1.write(a);
16 delay(15);
17 }
18 for (int a = 160; a >= 20; a -= 2) { // sola tara / sweep left
19 servo1.write(a);
20 delay(15);
21 }
22}電流制限(0.6 A)と発熱
L293Dのデータシートでいちばん重要な行は、チャンネルあたり連続0.6 A、ピーク1.2 Aです。ピークの値はごく短いパルスだけのもので、モーターが何秒も1 Aを流すとチップは苦しくなります。発熱の理由は簡単な計算でわかります。L293Dはバイポーラトランジスタを使う古いタイプのドライバで、0.6 Aでは上側のトランジスタで標準1.4 V、下側で1.2 Vの電圧が落ちます。つまりモーターが0.6 Aを流すと、チップの中で0.6 A × 2.6 V ≈ 1.6 Wの熱が生じます。同じチップの2つのモーターでは、その2倍の約3 Wになります。ヒートシンクのない小さなDIPチップではこの熱を逃がしきれず、温度がすぐに上がり、最後は過熱保護が出力をオフにします。症状はおなじみです。モーターがしばらく回って止まり、チップが冷えるとまた回り出します。
黄色いTTモーターは無負荷で約150 mA、床を走っているときは200〜300 mAを流し、これはシールドの範囲内です。問題は、車輪が障害物に押し付けられたときや、車がその場で回転するときです。拘束されたTTモーターは1〜1.5 Aを流すことがあり、4WDの車ではその場での回転中に4つのモーターが同時に負荷を受けます。モーターの実際の電流を知るには、テスターをモーターと直列につなぎ、車輪を手で短時間押さえながら測ってください。方法は「テスターの使い方」をご覧ください。シールドを熱くしないためのポイントは次のとおりです。
- ソフトスタートにする:速度を0から255へ一気に上げず、200〜300 msかけて段階的に上げると、起動時の電流がはっきり下がります。
- モーターを拘束しない:障害物を避けるロボットでは、障害物にぶつかる前に車を止めてください。拘束されたモーターがいちばん熱を出します。
- チップにヒートシンクを貼る:放熱テープ付きの小さなアルミ製ヒートシンクで、L293Dの温度を多少下げられます。
- 2個目のL293Dをはんだ付けする:Adafruitも、電流容量を増やすために既存のチップの上に2個目のL293Dを足どうし重ねてはんだ付けできると述べています。2個のチップで電流を分け合います。
- 必要以上の電圧を使わない:6 Vのモーターに12 Vをかけると、電流も熱も増えます。
- 適切なドライバに替える:モーターが常に0.6 Aを超えて流すなら、L298NやTB6612FNGを使ったドライバを使ってください。
L293DモーターシールドとL298N、どちらがいい?

| 項目 | L293Dモーターシールド | L298Nモジュール |
|---|---|---|
| モーターの数 | DC 4個、またはステッピング2個+サーボ2個 | DC 2個またはステッピング1個 |
| チャンネルあたりの電流 | 連続0.6 A、ピーク1.2 A | 連続2 A、ピーク3 A |
| モーターの電圧 | 4.5〜25 V | 5〜35 V |
| 電圧降下 | 約1.5〜2.6 V | 約2〜3 V |
| 接続 | Unoの上に差し込む、配線なし | ジャンパーワイヤーで接続、ピンは自由に選べる |
| 使うピン | 固定の8本+サーボ用のD9とD10 | 6本(ENA、IN1〜IN4、ENB) |
| ライブラリ | AFMotorが必須 | 不要(digitalWrite、analogWrite) |
| ESP32とPico | 不向き | そのまま使える |
| 向いている用途 | TTモーターの4WDカー、学習キット | より強力なモーター、2WDロボット |
まとめると、Arduino UnoでTTモーターの4WDカーを作るなら、L293Dシールドは配線を最小限にし、4つのモーターを1枚のボードにまとめられます。モーターがより強力な場合、ボードがESP32やPicoの場合、またはピンを自分で選びたい場合は、L298Nのほうが柔軟です。詳しくは「L298NでDCモーターを制御する方法」をご覧ください。どちらよりも効率のよいものが欲しいなら、MOSFETを使ったTB6612FNGは電圧降下がとても小さく、電池が長持ちします。どのモーターがどの用途に向いているかは「DCモーター、サーボ、ステッピングモーターの違い」で比較しています。
ESP32、Raspberry Pi Pico、Megaでも使える?
Arduino Mega 2560では問題なく動きます。シールドはMegaの最初のデジタルピンとアナログピンに載り、AFMotorもMegaのタイマーに対応しています。Uno R4、Leonardo、ESP32、Raspberry Pi Picoでは動きません。AFMotorはATmega328PとATmega2560のタイマーのレジスタに直接書き込むからです。ESP32を選んでいると'DC_MOTOR_PWM_RATE' was not declared in this scope(宣言されていない)、Leonardoを選んでいると#error "This chip is not supported!"(このチップは非対応)というエラーでコンパイルが止まります。Unoの形をしたESP32ボード(ESPDuino-32など)は物理的にはシールドに差し込めますが、ピン番号と3.3 Vの信号レベルが違います。これらのボードでは、シールドの代わりにL298N、TB6612FNG、またはL293Dチップ単体を使うほうがずっと簡単です。L293Dの入力は2.3 Vを超えればHIGHとみなすので、3.3 Vのボードとそのまま使えます。
| L293Dのピン | 役割 | Raspberry Pi Pico | ESP32 |
|---|---|---|---|
| 1(1,2EN) | 速度(PWM) | GP15 | GPIO 25 |
| 2(1A) | 方向1 | GP14 | GPIO 26 |
| 7(2A) | 方向2 | GP13 | GPIO 27 |
| 3と6(1Y、2Y) | モーターの端子 | モーターへ | モーターへ |
| 4、5、12、13 | GND(熱もこのピンから逃げます) | GND | GND |
| 16(VCC1) | ロジック電源、5 V | VBUS(40番ピン) | 5V(VIN) |
| 8(VCC2) | モーターの電源 | 電池のプラス | 電池のプラス |
1from machine import Pin, PWM
2import time
3
4en = PWM(Pin(15)) # L293D pin 1 (1,2EN): hız / speed
5en.freq(1000)
6in1 = Pin(14, Pin.OUT) # L293D pin 2 (1A): yön / direction
7in2 = Pin(13, Pin.OUT) # L293D pin 7 (2A): yön / direction
8
9def motor(speed): # -100 … 100
10 in1.value(1 if speed > 0 else 0)
11 in2.value(1 if speed < 0 else 0)
12 en.duty_u16(int(abs(speed) * 655.35))
13
14while True:
15 motor(80) # ileri / forward
16 time.sleep(2)
17 motor(0) # dur / stop
18 time.sleep(0.5)
19 motor(-60) # geri / backward
20 time.sleep(2)
21 motor(0)
22 time.sleep(0.5)PicoのGNDと電池のGNDは必ずつないでください。ESP32では同じ考え方をArduinoの言語で組みます。表のピンに、digitalWriteで方向を、analogWriteで速度を与えます。これらのボードが初めてなら、「ESP32とは?」と「Raspberry Pi Picoとは?」から始めてください。
モーターが回らない:よくある間違いと対処法
| 症状 | 考えられる原因 | 対処法 |
|---|---|---|
| どのモーターも回らず、PWR LEDが消えている | モーター電源がない:EXT_PWRに何もつながっていないか、USBだけをつないでいる | EXT_PWRに6〜12 Vの電池をつなぐ。LEDが点灯しないとモーターは回りません |
| LEDは点灯し、コードも書き込んだが、モーターが動かない | コードにsetSpeed()がない、またはモーター番号が端子台と合っていない | setup()にsetSpeed(200)を追加する。AF_DCMotor(1)とM1が対応しているか確認する |
| モーターがうなるが回らない | PWM値が低すぎる、または電池が弱っている | 100を超える値で起動する。電池を充電するか、18650電池2本を使う |
| エラー:AFMotor.h: No such file or directory(ファイルが見つからない) | ライブラリが入っていない、またはV2を入れている | ライブラリマネージャからV1のAdafruit Motor Shield libraryをインストールする |
| 「This chip is not supported」(このチップは非対応)または「DC_MOTOR_PWM_RATE」のエラー | ボードにUno R4、Leonardo、ESP32のいずれかを選んでいる | 「ツール」>「ボード」でUnoかMegaを選ぶ |
| モーターが動き出すとArduinoがリセットする | 起動時の電流で電池の電圧が下がる(ブラウンアウト) | ジャンパーを外してArduinoを別に給電する。モーターの端子間に100 nFのコンデンサをはんだ付けする |
| モーターがしばらく回って止まり、チップがとても熱い | L293Dの過熱保護が働いた | 負荷を減らす、ソフトスタートにする、ヒートシンクを付ける、またはL298Nに替える |
| モーターがランダムに方向を変える | コードでD4、D7、D8、D12のいずれかをほかの用途に使っている | センサーをA0〜A5に移す |
| M1とM2の速度が変わらず、M3とM4は正常 | tone()またはIRremoteがTimer2を使っている | これらのモーターをM3とM4に移すか、競合するコードを取り除く |
| 1つの車輪だけ逆に回る | 端子台でモーターの線が逆になっている | そのモーターの2本の線を入れ替える |
| シールドを付けるとボードの動作がおかしい | UnoのUSBソケットがシールドの裏のはんだに触れている、またはピンが曲がっている | USBソケットの上に絶縁テープを貼り、ピンをまっすぐにしてシールドを付け直す |
L293Dモーターシールドを使ったプロジェクトのアイデア
- Bluetooth操作の4WDカー:上のコードでスマホから操作する四輪駆動のロボット。
- 障害物を避けるロボット:SER1のサーボに取り付けたHC-SR04で前方をスキャンし、いちばん開けた方向へ曲がる車。詳しいガイドは「障害物を避けるロボット」をご覧ください。
- ライントレースロボット:A0〜A3につないだ赤外線センサーで床の黒い線をたどります。PIDの調整は「ライントレースロボット」で解説しています。
- カメラスライダー:ステッピングモーターでカメラをレールの上でゆっくり動かし、タイムラプス動画を撮ります。
- パン・チルト雲台:2つのサーボ用ピンヘッダーに2つのサーボをつなぎ、カメラやレーザーを2軸で動かします。もっと多くのサーボを使うなら「Arduinoのロボットアーム」をご覧ください。
- 自動カーテンやベルトコンベヤー:DCモーターで明るさに応じてカーテンを開け閉めしたり、小さなベルトコンベヤーを作ったりできます。
L293Dモーターシールドを正しく使うためのまとめは次のとおりです。V1のライブラリをインストールし、PWR LEDを確認し、電源構成に合わせてジャンパーを設定し、setSpeed()を忘れず、センサーはA0〜A5につなぎ、モーターは0.6 Aの制限以下に抑えます。このルールを守れば、小さなシールド1枚で4モーターのロボットの力をすべてまかなえます。BlueGraysアプリでは、Bluetooth操作の車、障害物を避けるロボット、ステッピングモーターやサーボのプロジェクトを、回路図とコード付きでステップごとに紹介しています。
よくある質問
L293Dモーターシールドで何個のモーターを動かせますか?
シールドは4個のDCモーターを同時に、それぞれ独立して前進・後退させ、異なる速度で動かせます。DCモーターの代わりに、ステッピングモーター2個(M1〜M2とM3〜M4の組)、またはDCモーター2個とステッピングモーター1個をつなぐこともできます。さらにサーボ用のピンヘッダーが2つあり、サーボはモーターとは独立してD9とD10で動かします。
L293DモーターシールドのPWRジャンパーは何のためにありますか?
ジャンパーを付けると、シールドのモーター電源がArduinoのVinラインにつながり、2枚のボードが1つの電源で動きます。ArduinoをUSBから、モーターを別の電池から給電する場合は、ジャンパーを外す必要があります。ジャンパーを付けたままDCジャックとEXT_PWRの両方に別々の電源をつなぐと、2つの電源がショートします。
L293Dモーターシールドにはどの電池を使えばいいですか?
TTモーターのロボットカーには、18650リチウム電池2本(7.4 V)がいちばんです。L293Dで約2 V失われるので、モーターには5.5〜6 Vがかかります。単3電池4本ではモーターに約4 Vしか残らず、9 V電池(006P / PP3)はモーターを動かすのに十分な電流を流せません。端子台には逆接続保護がないので、EXT_PWRに電池をつなぐときは極性に注意してください。
「AFMotor.h: No such file or directory」のエラーはどう直しますか?
このエラーは、AFMotorライブラリがインストールされていないことを示します。ライブラリマネージャでAdafruit Motor Shieldを検索し、説明にV1と書かれたAdafruit Motor Shield libraryをインストールしてください。V2のライブラリは別のボード用で、AFMotor.hファイルは含まれていません。
L293Dモーターシールドはどれくらいの電流を流せますか?なぜ熱くなるのですか?
各チャンネルは連続で0.6 A、ごく短時間のピークで1.2 Aを流せます。L293Dのトランジスタは0.6 Aで約2.6 Vの電圧が落ちるため、モーター1個あたり1.5 W近い熱が生じます。そのためチップが熱くなり、上限を超えると自ら停止します。モーターを拘束させないようにし、常に0.6 Aを超えて流すモーターにはL298Nのようなより強力なドライバを使ってください。
L293DモーターシールドとL298N、どちらがいいですか?
Arduino UnoでTTモーターの4WDカーを作るなら、配線なしで差し込めてモーターチャンネルが4つあるL293Dシールドのほうが便利です。より強力なモーターやESP32、Picoを使う場合、またはピンを自分で選びたい場合は、チャンネルあたり2 AのL298Nのほうが向いています。どちらもモーター電圧のうち約2 Vを失います。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
L298Nで作るBluetooth操作の車
スマートフォンをリモコンにして、自作のロボットカーを操作できます。ArduinoはBluetoothモジュールを通じてスマートフォンのリモコンアプリから指令を受け取り、モータードライバーで車輪を回します。前進、後退、左右や斜めへの移動ができ、速度もスマートフォンから調整できます。停止ボタンを押すと、短いブレーキ動作でモーターがすぐに止まります。

障害物回避ロボット
自分で進む道を見つける、賢い車を作ってみませんか?障害物回避ロボットは、前面の超音波センサーで周囲を常に調べます。障害物を見つけると停止し、サーボモーターで左右を確認して、最も障害物の少ない方向を選んで進みます。自動運転の基礎を学ぶのにぴったりの入門プロジェクトです。

ステッピングモーターの使い方
時計の針のように、必要な分だけ正確に少しずつ回転するモーターです。Arduinoがドライバーボードを介して小さなステッピングモーターを一方向に1回転させ、1秒待ってから逆方向に1回転させます。ドア、カーテン、回転台など、正確な回転が必要なプロジェクトの基礎を学べます。

ステッピングモーターで作る360度サーボモーター
普通のステッピングモーターを、1周の範囲で好きな角度へ動かせるようにします。Arduinoが各角度に必要なステップ数を計算し、モーターは0、90、45、180、135、360度へ順番に移動します。それぞれの位置で少し止まり、最初から繰り返します。通常は半回転の範囲に限られるサーボモーターの働きを、1周全体で実現する仕組みを作れます。

サーボモーターの使い方
小型サーボモーターのアームが、一方の端、中央、もう一方の端の3つの位置へ順番に回り、それぞれの位置で2秒間止まります。Arduinoが保持する角度をモーターに指示すると、モーターはその位置まで動いて止まります。ロボットアームや自動開閉するふたが動く仕組みを学べます。

ポテンショメーターでサーボモーターを操作
ポテンショメーターのつまみを回すと、サーボモーターのアームもそれに合わせて回ります。つまみの一方の端が0度、もう一方の端が半回転に対応します。Arduinoがつまみの位置を常に読み取り、サーボモーターが動きにすぐ反応します。ロボットアームや回転式カメラ台などのプロジェクトへの第一歩です。

BluetoothでスマートフォンからLEDを操作
スマートフォンで部屋の照明をつけたり消したりするための、小さな練習です。Bluetoothモジュールがスマートフォンから送られた文字をArduinoに伝えます。ある文字で赤いLEDが、別の文字で緑のLEDが点灯し、同じ文字を小文字で送ると消灯します。無線操作の仕組みを、ごくシンプルな形で学べます。

TCRT5000で床面の白黒を判別
ライントレースロボットの目となる小さなセンサーで、床面が黒か白かを判別できます。TCRT5000センサーは目に見えない光を床面に当て、戻ってくる光の量を調べます。白い面では緑のLED、黒い面では赤のLEDが点灯します。自分でロボットを作る前に学んでおきたい大切なステップです。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

