部品 · 読了まで6分

L298NでDCモーターを制御する:Arduinoで速度と回転方向を変える

L298Nモータードライバはどう動くのか。Hブリッジの考え方、ENA・IN1・IN2ピン、5Vジャンパーと電源の配線、PWMでの速度制御、回転方向の切り替え、2モーターのロボットカーのコード、ESP32とPicoでの使い方を解説します。

DCモーターは、ファン、ロボットの車輪、水ポンプ、おもちゃの車を回す、いちばん身近なモーターです。しかし、モーターをArduinoのピンに直接つなぐことはできません。ピンが出せるよりはるかに多くの電流を消費し、回転方向を変えるには極性を逆にする必要があるからです。L298Nモータードライバは、この2つの問題を一度に解決します。2つのDCモーターを独立して正転・逆転させ、PWMで速度を設定できます。ほぼすべてのロボットカーのプロジェクトで見かける部品です。

L298Nデュアルモータードライバモジュール
L298Nモータードライバ:黒いヒートシンクの下に、2つのHブリッジを持つL298Nチップがあります。両側にモーター端子、手前に電源と制御のピンがあります。

DCモーターのしくみと、ドライバが必要な理由

DCモーターの2つの端子に電圧をかけると回り、極性を逆にすると反対に回り、電圧を下げると遅くなります。小さなおもちゃ用のモーターでも、回っている間は数百ミリアンペアを消費し、回り始めや停止時には1アンペアを超えます。さらに、モーターはコイルなので、オフになるときに逆電圧のスパイクを発生させます。Arduinoのピンが出せるのは最大でも20〜40 mAで、そのスパイクからも守られていません。モーターを直接つなぐとピンが壊れ、ボードが傷むこともあります。

Hブリッジとは?

モーターを両方向に回す方法がHブリッジです。モーターのまわりに4つの電子スイッチを「H」の字の形に並べたものです。対角にある2つのスイッチが閉じると電流はモーターを一方向に流れ、もう一方の対角の組が閉じると反対方向に流れます。L298NチップにはこのようなHブリッジが2つ入っているので、2つのモーターを独立して制御できます。各モーターは、回転方向のピン2本(IN1とIN2)と速度のピン1本(ENA)を使います。

IN1IN2ENAモーターの動き
HIGHLOWHIGHまたはPWM正転する
LOWHIGHHIGHまたはPWM逆転する
HIGHHIGHHIGHブレーキがかかりすぐ止まる
任意任意LOW空転して自然に止まる

L298Nの仕様

項目値
モーター電源電圧5〜35 V(5Vジャンパー装着時は最大12 V)
1チャンネルあたりの電流連続2 A、ピーク3 A
ロジック電圧5 V(入力は3.3 Vの信号も認識)
電圧降下約1.5〜3 V(モーターにはそのぶん低い電圧がかかる)
駆動できるモーターDCモーター2個、またはバイポーラのステッピングモーター1個
保護基板上のフライバックダイオード
ギア付きDCモーターと車輪のセット
ロボットカーに使われる黄色いギア付きDCモーターと車輪:ギアボックスが回転数を下げてトルクを上げます。3〜6 Vで動きます。

L298Nのピンと電源の配線

ピンまたは端子機能
OUT1, OUT2モーターAの2本の線
OUT3, OUT4モーターBの2本の線
12V (VS)モーター電源:電池やアダプターのプラス
GND共通グラウンド:電池のマイナスとArduinoのGNDをここにつなぐ
5V5Vジャンパー装着時は5 V出力、外したときはロジック電源の入力
ENA, ENB速度の入力(PWM)。ジャンパーを付けたままだとモーターは常に全速で回る
IN1, IN2, IN3, IN4回転方向の入力
電池のマイナス、L298NのGND、ArduinoのGNDはすべてつながっている必要があります。共通のグラウンドがないと、制御信号は意味をなしません。モーター電源が12 Vを超える場合は、基板の5Vジャンパーを外し、5Vピンに別の5 Vを供給してください。モーターをArduinoの5Vピンから給電するのは絶対にやめましょう。

モーターを正転・逆転させ、速度を変える

まずENAのジャンパーを外し、ENAをArduinoのD9ピンに、IN1をD8に、IN2をD7につなぎます。モーターをOUT1とOUT2に、18650電池2本(7.4 V)または単3電池4〜6本のパックを12VとGNDの端子につなぎ、GNDはArduinoのGNDにもつなぎます。下のmotor()関数は-255〜255の値を受け取り、プラスが正転、マイナスが逆転、0がブレーキです。速度制御の考え方はPWMとは?で解説しています。

C++ (Arduino IDE)
1const int ENA = 9;    // hız (PWM) / speed (PWM)
2const int IN1 = 8;
3const int IN2 = 7;
4
5void motor(int speed) {              // -255 … 255
6  if (speed == 0) {                  // fren / brake
7    digitalWrite(IN1, HIGH);
8    digitalWrite(IN2, HIGH);
9    analogWrite(ENA, 255);
10    return;
11  }
12  digitalWrite(IN1, speed > 0);      // ileri ya da geri / forward or backward
13  digitalWrite(IN2, speed < 0);
14  analogWrite(ENA, abs(speed));
15}
16
17void setup() {
18  pinMode(ENA, OUTPUT);
19  pinMode(IN1, OUTPUT);
20  pinMode(IN2, OUTPUT);
21}
22
23void loop() {
24  motor(200);   delay(2000);   // ileri / forward
25  motor(0);     delay(500);    // dur / stop
26  motor(-120);  delay(2000);   // yavaşça geri / slowly backward
27  motor(0);     delay(500);
28}
ほとんどのモーターは、PWMの値が低いと回らずにうなるだけです。動き出すには、たいてい80〜120程度の値が必要です。回転方向を変える前にモーターを一瞬止めること、そして速度を一気にではなく少しずつ上げることで、急な電流の消費を減らし、ギアも守れます。

2モーターのロボットカー:前進、後退、左折、右折

ロボットカーにはハンドルがなく、2つの車輪を違う速度や方向で回して曲がります。両方のモーターが正転すれば車はまっすぐ進み、左のモーターが逆転して右のモーターが正転すれば、その場で左に回転します。下のdrive()関数は、各モーターの速度を-255〜255で別々に受け取ります。

C++ (Arduino IDE)
1// Sol motor / left motor: ENA=9, IN1=8, IN2=7 — Sağ motor / right motor: ENB=10, IN3=5, IN4=4
2const int ENA = 9, IN1 = 8, IN2 = 7;
3const int ENB = 10, IN3 = 5, IN4 = 4;
4
5void drive(int left, int right) {            // her biri -255 … 255 / each -255 … 255
6  digitalWrite(IN1, left >= 0);  digitalWrite(IN2, left < 0);
7  digitalWrite(IN3, right >= 0); digitalWrite(IN4, right < 0);
8  analogWrite(ENA, abs(left));
9  analogWrite(ENB, abs(right));
10}
11
12void setup() {
13  int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
14  for (int p : pins) pinMode(p, OUTPUT);
15}
16
17void loop() {
18  drive(200, 200);   delay(1500);   // ileri / forward
19  drive(-200, 200);  delay(600);    // sola dön / turn left
20  drive(200, -200);  delay(600);    // sağa dön / turn right
21  drive(-180, -180); delay(1000);   // geri / backward
22  drive(0, 0);       delay(1000);   // dur / stop
23}

車の前に距離センサーを付ければ、障害物を見つけると止まって向きを変えるロボットになります。センサー側はHC-SR04距離センサーを参照してください。UnoでServoライブラリを使う場合は注意が必要です。9番と10番ピンのPWMが無効になるので、ENAとENBは5番と6番ピンに移してください。

ESP32とRaspberry Pi PicoでL298Nを使う

L298Nの入力は約2.3 Vを超えるとHIGHとみなすので、ESP32やPicoの3.3 Vの信号でそのまま動きます。ただし、ボードのロジック電源は5 Vにしてください。ESP32では、ENAとENBにPWM対応のピン(たとえばGPIO 25と26)を使えば、同じArduinoのコードが使えます。34〜39番ピンは出力できません。MicroPythonを使うPicoで1つのモーターを制御するコードは、次のようになります。

MicroPython
1from machine import Pin, PWM
2import time
3
4ena = PWM(Pin(15), freq=1000)
5in1 = Pin(14, Pin.OUT)
6in2 = Pin(13, Pin.OUT)
7
8def motor(speed):                   # -100 … 100
9    in1.value(speed > 0)
10    in2.value(speed < 0)
11    ena.duty_u16(int(abs(speed) * 655.35))
12
13while True:
14    motor(80);  time.sleep(2)       # ileri / forward
15    motor(0);   time.sleep(0.5)     # dur / stop
16    motor(-50); time.sleep(2)       # geri / backward

L298N、TB6612FNG、MOSFETのどれを選ぶ?

ドライバ長所短所向いている用途
L298N安い、丈夫、1チャンネルあたり2 A約2 Vのロス、発熱する、大きい趣味のロボット、6〜12 Vのモーター
TB6612FNG小型、高効率(MOSFET)、3.3 V対応連続1.2 A、最大13.5 V電池で動く小型ロボット
L9110Sとても小さく安い1チャンネルあたり約800 mAミニモーター
MOSFET単体(IRLZ44Nなど)非常に高効率、大電流一方向のみファン、ポンプ、LEDテープ

モーターをオン・オフするだけならリレーでも足りますが、速度は調整できません。2つの比較はリレーモジュールとは?で紹介しています。合うトランジスタやMOSFETを選ぶにはトランジスタツールを見てみてください。

L298Nのプロジェクトアイデア

  • 障害物をよけるロボット:HC-SR04で障害物を見つけて向きを変える車です。
  • Bluetoothで操作する車:スマホのアプリからHC-05経由で動かすロボットです。
  • ジョイスティックで操作する車:ジョイスティックの2つの軸を2つのモーターの速度に変えます。詳しくはジョイスティックモジュールの使い方で解説しています。
  • ライントレースロボット:赤外線センサーで床の黒い線をたどる車です。
  • 自動カーテン:朝に光が差すとカーテンを開け、夕方に閉めるモーター式のしくみです。
  • ベルトコンベア:ポテンショメーターで速度を設定できる小さなコンベアです。

よくあるミスと直し方

  • 基板のLEDは点くのにモーターが回らない:GNDが共通になっていない、ENAのジャンパーを外したのにピンをつないでいない、またはPWMの値が低すぎます。
  • モーターが回るとArduinoがリセットする:モーターとArduinoが弱い電源を共有しています。電源を分け、モーターの端子に100 nFのコンデンサをはんだ付けしてください。
  • モーターがとても遅く、力が弱い:L298Nが約2 Vを消費しています。電池の電圧を上げる(たとえば18650を2本)か、より高効率のドライバを使ってください。
  • モーターが一方向にしか回らない:INピンの1本がつながっていないか、コードが両方向に同じ値を書き込んでいます。
  • L298Nがとても熱くなる:モーターの消費電流が大きすぎます。ヒートシンクがふさがれていないか確認し、必要ならより強力なドライバを選んでください。
  • 9 Vの角形電池を使っている:大きな電流を出せず、すぐに切れます。充電式の18650や単3電池のパックを使ってください。

L298Nでモーター制御を学べば、ロボットのプロジェクトへの扉が開きます。BlueGraysアプリには、L298NのBluetoothで操作する車や、障害物をよけるロボットのプロジェクトが回路図とコード付きでステップごとに載っています。

よくある質問

L298Nはいくつのモーターを駆動できますか?

L298Nには2つのHブリッジが入っているので、2つのDCモーターを独立して、正転・逆転も速度も別々に駆動できます。両方のチャンネルを一緒に使えば、バイポーラのステッピングモーター1個も駆動できます。

L298Nの5Vジャンパーは何のためにありますか?

ジャンパーを付けていると、基板上のレギュレーターがモーター電源から5 Vを作ってチップに供給します。その5 VでArduinoに給電することもできます。モーター電源が12 Vを超えるとレギュレーターが過熱することがあるので、ジャンパーを外して5Vピンに別の5 Vを供給してください。

L298Nにはどの電池をつなげばいいですか?

6〜9 Vの小さなモーターなら、18650リチウム電池2本(7.4 V)か単3電池6本(9 V)がよい選択です。L298Nは約2 Vを失うので、モーターの定格電圧より少し高い電源を選びましょう。9 Vの角形電池では、モーターを動かすのに十分な電流が出せません。

ENAのジャンパーを外すのはなぜですか?

ENAのジャンパーを付けたままだと、モーターは常に全速で回ります。速度を調整するには、ジャンパーを外してENAピンをArduinoのPWMピンのどれかにつなぎます。そうすれば、analogWriteで速度を0〜255に設定できます。

低速でモーターが回らないのはなぜですか?

モーターが摩擦に打ち勝って動き出すには、ある程度の最低電圧が必要で、L298Nの電圧降下がそれをさらに難しくします。たいてい、PWMの値が80〜120を下回るとモーターはうなるだけになります。コードで最低速度を設定するか、電圧の高い電源を使ってください。

L298NはESP32やRaspberry Pi Picoで使えますか?

はい。L298Nの入力ピンは3.3 Vの信号をHIGHと認識するので、ESP32やPicoに直接つなげます。ただし、ボードのロジック側は5 Vから給電し、すべてのGNDを共通にする必要があります。

全プロジェクトを見る
L298Nで作るBluetooth操作の車
#80上級
プレミアム

L298Nで作るBluetooth操作の車

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

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

障害物回避ロボット

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

5.0(38)
49
ジョイスティックでサーボモーターを制御
#60中級
プレミアム

ジョイスティックでサーボモーターを制御

防犯カメラの向きを変えるように、ジョイスティックで2つのモーターを操作します。スティックを左右に倒すと下側のサーボモーターがゆっくり回り、上下に倒すと上側のサーボモーターが上下に傾きます。手を離すと、どちらもその位置で止まります。カメラやレーザーの台座など、2方向に動く装置の基礎を作ります。

4.7(42)
58
ESP32サーボモーター(ポテンショメーター制御)
#118中級
プレミアム

ESP32サーボモーター(ポテンショメーター制御)

このプロジェクトでは、ポテンショメーターでSG90サーボモーターを制御します。ポテンショメーターから読み取ったアナログ値を0~180度の範囲に変換し、サーボの角度を調整します。ESP32Servoライブラリは、ESP32の出力に対応した適切なGPIOでサーボ信号を生成します。このプロジェクトではGPIO 18を使います。ロボットアームやカメラ用ジンバル、自動ドアの機構に使われる基本的な制御方法です。

4.3(29)
42
ジョイスティックでLEDを制御
#59中級
プレミアム

ジョイスティックでLEDを制御

ジョイスティックのスティックをいずれかの方向へいっぱいに倒すと、その方向のLEDが点灯します。右、左、上、下にそれぞれ異なる4色のLEDがあります。スティックを離すと中央に戻り、すべてのLEDが消灯します。ロボットカーや画面上のゲームを操作するための第一歩です。

4.7(50)
67
ESP32とHC-SR04で作る超音波距離計
#116中級

ESP32とHC-SR04で作る超音波距離計

HC-SR04超音波センサーは、発した音波が物体に反射して戻るまでの時間(Time of Flight)を測定して距離を計算します。このプロジェクトでは、ESP32からセンサーのTRIGピンに10マイクロ秒のパルスを送り、ECHOピンからの反射波の持続時間をpulseIn()で読み取ります。計算した距離をcm単位で16x2 I2C LCDに表示します。HC-SR04は5Vで動作するため、ECHOピンには分圧回路が必須です。分圧しないとESP32の3.3V GPIOが破損します。

4.9(28)
45
ESP32駐車センサー(HC-SR04 + 5連LEDバー + ブザー + OLED)
#142上級
プレミアム

ESP32駐車センサー(HC-SR04 + 5連LEDバー + ブザー + OLED)

車の駐車センサーをESP32で作ります!HC-SR04超音波センサーで前方の物体までの距離を測ります。距離が縮まるほど5連LEDバーが緑 → 黄 → 赤の順に点灯し、ブザーの鳴る間隔が短くなります。10 cm未満まで近づくとアラームが鳴り続け、すべてのLEDが点灯します。SSD1306 OLEDには現在の距離をcm単位の大きな文字で表示し、状態メッセージ(落ち着いて / 注意 / 接近 / 停止! / 危険)とLEDバーのシミュレーションも表示します。HC-SR04のpulseIn、複数のデジタル出力、ブザーを学べる定番のプロジェクトです。

0.0(0)
14
HC-SR04で距離を測定(シリアルモニタ表示)
#27初級

HC-SR04で距離を測定(シリアルモニタ表示)

HC-SR04センサーは、コウモリが暗闇で道を見つけるのと同じ仕組みで動作します。人には聞こえない音を出し、その反響を捉えて前方の物体までの距離を測ります。Arduinoは0.5秒ごとに距離をセンチメートル単位でコンピューターの画面に表示し、3〜100センチメートルの測定値を示します。駐車センサーや障害物を避けるロボットなどのプロジェクトの基礎になります。

4.6(46)
71