部品 · 読了まで19分

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モーターシールドを上から見たところ:M1〜M4の端子台、サーボ用ピンヘッダー、電源ジャンパー
L293Dモーターシールド(Adafruit V1の設計):中央に74HC595、その両側にL293Dチップ。左にM1〜M2、右にM3〜M4の端子台、左上に2つのサーボ用ピンヘッダー、下に外部電源の端子台とPWRジャンパーがあります。

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_22つのサーボ用ピンヘッダー(−、+、S)。D10とD9
PWR LEDモーター電源が来ているかを示します。消えているとモーターは回りません
RESETボタンArduinoのリセットボタンをシールドの上に複製したもの
A0〜A5の列空いているアナログピン。多くのボードでは隣に+5VとGNDの列もあります

シールドが使うピンと空いているピンは?

Arduinoのピンシールドでの役割使用中になるのは?
D3M2の速度(PWM、Timer2)M2またはステッピングモーター1を使うとき
D474HC595のクロック(CLK)DCモーターかステッピングモーターを1つでも使うとき
D5M4の速度(PWM、Timer0)M4またはステッピングモーター2を使うとき
D6M3の速度(PWM、Timer0)M3またはステッピングモーター2を使うとき
D774HC595の出力イネーブル(EN)モーターを1つでも使うとき
D874HC595のデータ入力(DATA)モーターを1つでも使うとき
D9SERVO_2の信号(Timer1)そのサーボを使うときだけ
D10SER1の信号(Timer1)そのサーボを使うときだけ
D11M1の速度(PWM、Timer2)M1またはステッピングモーター1を使うとき
D1274HC595のラッチ(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のピン配置」で確認できます。

シールドを付けている間は、D3〜D8、D11、D12をコードの中でほかの用途に使わないでください。たとえばHC-SR04のtrigピンをD7に、LEDをD12につなぐと、74HC595に送るデータが壊れてモーターがランダムに方向を変えます。また、M1とM2の速度信号はTimer2から来ています。Unoではtone()関数やIRremoteライブラリもTimer2を使うので、これらが動いている間はM1とM2の速度調整がおかしくなります。

電源と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ジャックまたはUSBEXT_PWR外す

ロボットカーでいちばんよく使われるのは1つの電源にする方法です。18650電池2本のパックをEXT_PWRにつなぎ、ジャンパーを付ければ、Arduinoもモーターも同じ電池で動きます。シンプルですが、モーターが起動時に大きな電流を流すと電池の電圧が一瞬下がり、Arduinoがリセットすることがあります。そうなったら、ジャンパーを外してArduinoを別の電源(モバイルバッテリー、USB、9 VのACアダプター)から給電すれば確実に解決します。机の上で試すときは2番目の構成がいちばん便利です。Arduinoはパソコンにつないだまま、モーターは電池で動かし、ジャンパーは外しておきます。

EXT_PWR端子台には逆接続保護用のダイオードがありません。電池を逆につなぐと、シールドはすぐに壊れ、Arduinoもほぼ確実に壊れます。ジャンパーを付けた状態で、DCジャックとEXT_PWRの両方に別々の電源をつながないでください。2つの電源どうしをショートさせることになります。また、モーター電源をArduinoの5Vピンに入れることは絶対にしないでください。

どの電池を選べばいいでしょうか?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ライブラリのインストール

  1. Arduino IDEでライブラリマネージャを開きます(「ツール」>「ライブラリを管理」またはCtrl+Shift+I)。
  2. 検索欄にAdafruit Motor Shieldと入力します。2つの結果が表示されます。説明に「V1 firmware」と書かれたAdafruit Motor Shield libraryと、Adafruit Motor Shield V2 Libraryです。
  3. L293DのシールドにはV1のほうをインストールします。V2のライブラリは、I2Cで通信しTB6612チップを使うまったく別のボード用です。
  4. スケッチの先頭に#include <AFMotor.h>の行を追加します。
  5. 必要なら「ファイル」>「スケッチ例」>「Adafruit Motor Shield library」>「MotorTest」を開き、M1につないだモーターでボードを試してください。
コンパイル時にAFMotor.h: No such file or directory(ファイルが見つからない)と表示される場合は、ライブラリがまったくインストールされていないか、誤ってV2のライブラリをインストールしています。V2のヘッダーファイルの名前はAdafruit_MotorShield.hで、L293Dのボードでは動きません。ライブラリのインストールに関するほかの問題は「Arduinoにライブラリを追加する方法」をご覧ください。

最初のスケッチ:DCモーターを前進、後退、いろいろな速度で回す

モーターの2本の線をM1端子台の外側の2つのネジに固定し、中央のGNDネジは空けておきます。電池パックをEXT_PWRにつなぎ、ArduinoをUSBでパソコンに接続して、PWRジャンパーを外します(上の2番目の構成)。PWR LEDが点灯していたら、下のコードを書き込みます。モーターはまずゆっくり加速して減速し、次に2秒間逆回転して止まります。

C++ (Arduino IDE)
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で動きます。

いちばん多い間違いはsetSpeed()を忘れることです。ライブラリはモーターを作成するときに速度を0に設定するので、run(FORWARD)と書いても速度を指定しなければモーターはまったく動きません。また、ほとんどのTTモーターは80〜100未満ではうなるだけで回らないので、100〜120以上で起動してください。

四輪(4WD)ロボットカーのコード

車輪付きの黄色いギア付きTT DCモーター
ロボットキットの黄色いギア付きTTモーター:3〜6 Vで動作し、無負荷で約150 mA、拘束時には1 Aを超える電流が流れます。

L293Dモーターシールドのいちばん人気の使い道は四輪ロボットカーです。4つのモーターがそれぞれ自分の端子台につながり、配線がごちゃごちゃしないからです。この種の車にはハンドルがなく、戦車のように曲がります。左側の2輪が一方に、右側の2輪が反対に回ると、車はその場で回転します。そのため、コードでは4つのモーターを1つずつではなく、左側と右側の2つのグループとして制御します。スマホから操作するために、HC-05 Bluetoothモジュールを空いているA0とA1にSoftwareSerialでつなぎます(日本では技適マークのない無線モジュールの使用は電波法で制限されています)。モジュールの詳細は「HC-05 Bluetoothモジュール」をご覧ください。

部品接続
左前のモーターM1
左後ろのモーターM2
右後ろのモーターM3
右前のモーターM4
HC-05 TXDA0(SoftwareSerial RX)
HC-05 RXDA1、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ジャンパーを取り付ける
C++ (Arduino IDE)
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ロボットカーの作り方」をご覧ください。

HC-05のRXDピンは3.3 Vで動作します。Arduinoの5 VのTX信号を分圧回路で下げずにつながないでください。また、接続が切れると車は最後の命令のまま走り続けます。最後の文字から1秒たったらdrive(0, 0)を呼び出す安全のためのルールを、millis()で簡単に追加できます。

ステッピングモーターの駆動: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つのコイルだけに通電します電流がいちばん少なく、トルクもいちばん低い
DOUBLE2つのコイルに同時に通電しますトルクが高い。いちばんよく使われます
INTERLEAVE1つと2つのコイルを交互に通電します(ハーフステップ)分解能が2倍で、回転がなめらか
MICROSTEPコイルの電流をPWMで段階的に変え、1フルステップを16分割しますゆっくり静かに回る。トルクは下がります

28BYJ-48は5 Vのモーターです。この実験では、モーター電源を単3電池4本(6 V)にし、ジャンパーを外して、ArduinoはUSBで動かしてください。モーター内部のギアボックスのため、フルステップで1回転は2048ステップです。

C++ (Arduino IDE)
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()でコイルをオフにすると発熱を防げますが、その間は軸の保持トルクがなくなります。

ほとんどのNEMA 17モーターは、コイルあたり1.5〜2 Aを流し、コイルの抵抗は約1.5〜3 Ωです。L293Dには電流制限がないため、これらのモーターを12 Vでつなぐとチャンネルの上限を何倍も超え、チップは数秒で自ら停止します。L293Dシールドでは、コイル抵抗が高く、12 Vで0.4 A未満しか流れないステッピングモーターだけを使ってください。強力なNEMA 17には「A4988ドライバ」が適しています。

サーボの接続: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のサーボを左右に往復させます。

C++ (Arduino IDE)
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、どちらがいい?

L298Nの2チャンネルモータードライバモジュール
L298Nモジュール:1つのチップに2つのHブリッジ、大きなヒートシンク、チャンネルあたり2 A。ケーブルで配線するので、どのボードにも使えます。
項目L293DモーターシールドL298Nモジュール
モーターの数DC 4個、またはステッピング2個+サーボ2個DC 2個またはステッピング1個
チャンネルあたりの電流連続0.6 A、ピーク1.2 A連続2 A、ピーク3 A
モーターの電圧4.5〜25 V5〜35 V
電圧降下約1.5〜2.6 V約2〜3 V
接続Unoの上に差し込む、配線なしジャンパーワイヤーで接続、ピンは自由に選べる
使うピン固定の8本+サーボ用のD9とD106本(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 PicoESP32
1(1,2EN)速度(PWM)GP15GPIO 25
2(1A)方向1GP14GPIO 26
7(2A)方向2GP13GPIO 27
3と6(1Y、2Y)モーターの端子モーターへモーターへ
4、5、12、13GND(熱もこのピンから逃げます)GNDGND
16(VCC1)ロジック電源、5 VVBUS(40番ピン)5V(VIN)
8(VCC2)モーターの電源電池のプラス電池のプラス
MicroPython
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ソケットの上に絶縁テープを貼り、ピンをまっすぐにしてシールドを付け直す
問題をいちばん早く見つける方法は、テストをいちばん単純な形にすることです。車のスケッチはいったん置いておき、モーター1つだけをM1につなぎ、PWR LEDが点灯していることを確認して、上の最初のスケッチを書き込みます。これで動けば問題はシールドではなくコードにあります。動かなければ、電源とライブラリから確認してください。Arduinoがリセットを繰り返すすべての原因は「Arduinoがリセットを繰り返すとき」にまとめています。

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操作の車
#80上級
プレミアム

L298Nで作るBluetooth操作の車

スマートフォンをリモコンにして、自作のロボットカーを操作できます。ArduinoはBluetoothモジュールを通じてスマートフォンのリモコンアプリから指令を受け取り、モータードライバーで車輪を回します。前進、後退、左右や斜めへの移動ができ、速度もスマートフォンから調整できます。停止ボタンを押すと、短いブレーキ動作でモーターがすぐに止まります。

5.0(38)
65
障害物回避ロボット
#81上級
プレミアム

障害物回避ロボット

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

5.0(38)
49
ステッピングモーターの使い方
#67中級
プレミアム

ステッピングモーターの使い方

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

4.5(31)
42
ステッピングモーターで作る360度サーボモーター
#68中級
プレミアム

ステッピングモーターで作る360度サーボモーター

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

4.5(22)
32
サーボモーターの使い方
#35初級
プレミアム

サーボモーターの使い方

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

4.7(48)
67
ポテンショメーターでサーボモーターを操作
#36初級
プレミアム

ポテンショメーターでサーボモーターを操作

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

4.6(37)
52
BluetoothでスマートフォンからLEDを操作
#34初級
プレミアム

BluetoothでスマートフォンからLEDを操作

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

4.8(68)
89
TCRT5000で床面の白黒を判別
#78中級
プレミアム

TCRT5000で床面の白黒を判別

ライントレースロボットの目となる小さなセンサーで、床面が黒か白かを判別できます。TCRT5000センサーは目に見えない光を床面に当て、戻ってくる光の量を調べます。白い面では緑のLED、黒い面では赤のLEDが点灯します。自分でロボットを作る前に学んでおきたい大切なステップです。

4.7(40)
49