L298NでDCモーターを制御する:Arduinoで速度と回転方向を変える
L298Nモータードライバはどう動くのか。Hブリッジの考え方、ENA・IN1・IN2ピン、5Vジャンパーと電源の配線、PWMでの速度制御、回転方向の切り替え、2モーターのロボットカーのコード、ESP32とPicoでの使い方を解説します。
DCモーターは、ファン、ロボットの車輪、水ポンプ、おもちゃの車を回す、いちばん身近なモーターです。しかし、モーターをArduinoのピンに直接つなぐことはできません。ピンが出せるよりはるかに多くの電流を消費し、回転方向を変えるには極性を逆にする必要があるからです。L298Nモータードライバは、この2つの問題を一度に解決します。2つのDCモーターを独立して正転・逆転させ、PWMで速度を設定できます。ほぼすべてのロボットカーのプロジェクトで見かける部品です。

DCモーターのしくみと、ドライバが必要な理由
DCモーターの2つの端子に電圧をかけると回り、極性を逆にすると反対に回り、電圧を下げると遅くなります。小さなおもちゃ用のモーターでも、回っている間は数百ミリアンペアを消費し、回り始めや停止時には1アンペアを超えます。さらに、モーターはコイルなので、オフになるときに逆電圧のスパイクを発生させます。Arduinoのピンが出せるのは最大でも20〜40 mAで、そのスパイクからも守られていません。モーターを直接つなぐとピンが壊れ、ボードが傷むこともあります。
Hブリッジとは?
モーターを両方向に回す方法がHブリッジです。モーターのまわりに4つの電子スイッチを「H」の字の形に並べたものです。対角にある2つのスイッチが閉じると電流はモーターを一方向に流れ、もう一方の対角の組が閉じると反対方向に流れます。L298NチップにはこのようなHブリッジが2つ入っているので、2つのモーターを独立して制御できます。各モーターは、回転方向のピン2本(IN1とIN2)と速度のピン1本(ENA)を使います。
| IN1 | IN2 | ENA | モーターの動き |
|---|---|---|---|
| HIGH | LOW | HIGHまたはPWM | 正転する |
| LOW | HIGH | HIGHまたはPWM | 逆転する |
| HIGH | HIGH | HIGH | ブレーキがかかりすぐ止まる |
| 任意 | 任意 | 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個 |
| 保護 | 基板上のフライバックダイオード |

L298Nのピンと電源の配線
| ピンまたは端子 | 機能 |
|---|---|
| OUT1, OUT2 | モーターAの2本の線 |
| OUT3, OUT4 | モーターBの2本の線 |
| 12V (VS) | モーター電源:電池やアダプターのプラス |
| GND | 共通グラウンド:電池のマイナスとArduinoのGNDをここにつなぐ |
| 5V | 5Vジャンパー装着時は5 V出力、外したときはロジック電源の入力 |
| ENA, ENB | 速度の入力(PWM)。ジャンパーを付けたままだとモーターは常に全速で回る |
| IN1, IN2, IN3, IN4 | 回転方向の入力 |
モーターを正転・逆転させ、速度を変える
まず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とは?で解説しています。
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}2モーターのロボットカー:前進、後退、左折、右折
ロボットカーにはハンドルがなく、2つの車輪を違う速度や方向で回して曲がります。両方のモーターが正転すれば車はまっすぐ進み、左のモーターが逆転して右のモーターが正転すれば、その場で左に回転します。下のdrive()関数は、各モーターの速度を-255〜255で別々に受け取ります。
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つのモーターを制御するコードは、次のようになります。
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 / backwardL298N、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操作の車
スマートフォンをリモコンにして、自作のロボットカーを操作できます。ArduinoはBluetoothモジュールを通じてスマートフォンのリモコンアプリから指令を受け取り、モータードライバーで車輪を回します。前進、後退、左右や斜めへの移動ができ、速度もスマートフォンから調整できます。停止ボタンを押すと、短いブレーキ動作でモーターがすぐに止まります。

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

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

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

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

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が破損します。

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

HC-SR04で距離を測定(シリアルモニタ表示)
HC-SR04センサーは、コウモリが暗闇で道を見つけるのと同じ仕組みで動作します。人には聞こえない音を出し、その反響を捉えて前方の物体までの距離を測ります。Arduinoは0.5秒ごとに距離をセンチメートル単位でコンピューターの画面に表示し、3〜100センチメートルの測定値を示します。駐車センサーや障害物を避けるロボットなどのプロジェクトの基礎になります。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

