ArduinoでDCモーターを制御|L298Nの配線とコードを解説

プログラミング・電子工作






ArduinoでDCモーター制御|L298N配線とコード







実装 / Arduino

ArduinoでDCモーター制御|L298Nの配線とコードを徹底解説

Arduino UnoとL298N、DCモーター、外部電源の接続関係を示したDCモーター制御の全体図

ArduinoのピンにDCモーターを直結すると、正しく動きません。それどころか、Arduino本体を壊しかねません。そのため、間にモータードライバICを挟む必要があります。本記事では、代表的なモータードライバ「L298N」を使います。DCモーターの正転・逆転・速度制御を行う配線とコードを、外部電源の注意点とあわせて解説します。

YOFUKASI LAB編集部
公開日:2026年8月27日
読了目安:12分

執筆・実機検証:YOFUKASI LAB運営者

理学療法士/Arduino・Pythonを使った医療機器制作・学会発表経験あり

Chapter 01 / Basics

01なぜDCモーターはArduinoに直結できないのか

ArduinoにDCモーターを直結できない理由として電流不足、始動電流、逆起電力を示した図解

ピンの許容電流を超えてしまう

LEDの点灯なら、Arduinoのピンに抵抗を挟んで直接つなぐだけで動きます。しかし、DCモーターの場合は事情が異なります。結論から言うと、Arduinoのピンから出せる電流には限りがあります。DCモーターを安全に駆動するには、その電流だけでは足りません。だからこそ、間に「モータードライバ」と呼ばれる部品を挟む必要があるのです。

Arduino Uno(ATmega328P搭載)の場合、1本のデジタルピンから安全に取り出せる電流はわずかです。公式の技術仕様によると、その上限は20mAとされています。一方、小型のDCモーターであっても油断はできません。動き始めの瞬間(始動電流)や負荷がかかった状態では、数百mAから場合によっては1A以上の電流が流れます。つまり、ピンの許容量を10倍以上超えてしまう可能性があるのです。この電流を直接流すと、Arduino内部の回路に想定以上の負荷がかかります。結果として、ピンやマイコン自体が破損する恐れがあります。

逆起電力というもう一つの落とし穴

さらに注意したいのが「逆起電力」です。DCモーターは、電源を切った瞬間にコイルの性質上、高い電圧を一瞬だけ発生させます。この逆起電力は、モーター用ではない回路にとって大きなダメージ要因になります。だからこそ、モーターの大きな電流と逆起電力を安全に扱える部品が必要です。それが「モータードライバIC」で、ArduinoとDCモーターの間に挟むのが定石です。

編集部想定シナリオ

Arduino初心者のKさんは、工作用のミニDCモーターを試しに配線してみた。デジタルピンとGNDに直接つないだのだ。一瞬だけモーターが弱く回った直後、Arduinoが反応しなくなってしまった。原因は、モーターの始動電流と逆起電力がピンの許容量を超えたことによる故障だった。このように、DCモーターは必ずモータードライバを経由させるのが鉄則です。



Chapter 02 / Component

02L298Nモータードライバとは|ピン配置の基礎知識

L298Nは、DCモーターやステッピングモーターの制御に使われます。電子工作の定番モータードライバICです。STMicroelectronics社のデータシートによると、1チャンネルあたりの電流容量は連続動作で最大2Aです。瞬間的には最大3Aまで扱えます。価格が安く、Arduino向けの作例も豊富です。そのため、初めてモーター制御を学ぶ人の教材として広く使われています。1枚のモジュールに2チャンネル分の回路が載っているのも特徴です。この構成により、DCモーターを2個まで独立して制御できます。

覚えておきたい主要ピン

ピン名 役割 接続先の目安
12V(+) モーター駆動用の外部電源入力 ACアダプターや電池パックの+
GND 外部電源のマイナス、かつArduinoとの共通グラウンド 外部電源の- + Arduinoの GND
5V(出力/入力兼用) ロジック用電源。オンボードレギュレータの出力 基本は未接続でOK(後述のジャンパー参照)
ENA モーターA(OUT1/OUT2)の有効化・速度制御(PWM) ArduinoのPWM対応ピン(例:D9)
IN1 / IN2 モーターAの回転方向を決める信号 ArduinoのデジタルピンD8 / D7
OUT1 / OUT2 モーターAの出力端子 DCモーターの端子2本
ENB / IN3 / IN4 / OUT3 / OUT4 モーターB用(構成はA系統と同じ) 2個目のモーターを使う場合に接続

※ピン名の表記は基板シルクによって多少異なります。手元の基板の印字も確認してください。

基板上の「5Vジャンパー」に注意

L298Nモジュールの多くには「5V-ENジャンパー」が付いています。これは、12V入力からオンボードのレギュレータで5Vを作り出す仕組みです。外部電源が12V以下であれば、このジャンパーを付けたままにしておくのが基本です。ただし、12Vを超える電源を使う場合は注意が必要です。なぜなら、オンボードレギュレータの発熱・故障につながるためです。この場合はジャンパーを外してください。ロジック用の5VはArduino側から別途供給します。初めての場合は、9V〜12V程度の電源とジャンパー装着状態から試すと安全です。

Chapter 03 / Wiring

03配線方法:Arduino・L298N・DCモーター・外部電源

ここでは、DCモーター1個を制御する最もシンプルな配線を解説します。使うのは、Arduino Uno、L298N、DCモーター、外部電源の4点です。外部電源には、モーターの定格電圧に合う電池ボックスやACアダプターを用意します。

配線手順

接続元 接続先 備考
外部電源の+ L298Nの「12V」端子 モーターの定格電圧に合わせる(例:6〜12V)
外部電源の- L298Nの「GND」端子
L298NのGND ArduinoのGND 必須。忘れると正しく動作しません(詳しくは6章)
Arduino D9 L298NのENA PWM対応ピン(~マーク付き)を使用
Arduino D8 L298NのIN1
Arduino D7 L298NのIN2
L298NのOUT1 / OUT2 DCモーターの端子2本 逆に接続しても後述のコードで回転方向を調整可能

※Arduino本体はこれまで通りUSB給電・書き込みで問題ありません。モーター駆動用の電源とArduinoの給電元は別で構いません。ただし、GND同士は必ずつなぎます。

データ・編集部見解

編集部の見解として、多くの人はOUT側とIN側を混同してつまずきます。IN1・IN2は制御信号(入力)、OUT1・OUT2はモーターへの出力です。ブレッドボードのときと同様、電気の流れを指でなぞって確認しましょう。配線ミスが大幅に減ります。

2つ目のモーターを追加する場合

2個目のモーターを使う場合も、考え方は同じです。ENB・IN3・IN4・OUT3・OUT4を、空いているArduinoのピンに接続します。これだけで、1枚のL298Nで2つのモーターを独立制御できます。この構成は、後述のFAQで触れる2輪駆動ロボットカーの製作にそのまま応用できます。

Chapter 04 / Code

04正転・逆転を制御するコード

L298NでDCモーターの正転と逆転をIN1・IN2、速度をENAのPWMで制御する仕組みの図解

方向とEnableの役割を切り分けて理解する

L298Nの動作は、2つの信号の組み合わせで決まります。IN1・IN2が方向を、ENAが有効化・速度を担います。データシートの真理値表をもとに、まずはこのルールを整理しておきましょう。

ENA IN1 IN2 モーターの動作
LOW 停止(フリーラン。惰性で止まる)
HIGH HIGH LOW 正転
HIGH LOW HIGH 逆転
HIGH HIGH/HIGH または LOW/LOW(同じ値) 急停止(ブレーキ)

※「正転」「逆転」は、OUT1/OUT2とモーター端子の接続方向で入れ替わります。実機で動かしながら確認してください。

つまり、ENAがLOWのときはIN1・IN2の値は関係ありません。モーターは自由に空転しながら止まります。一方、ENAがHIGHのときだけ、IN1・IN2の組み合わせで方向が決まります。

正転・逆転を切り替えるコード例

この表をもとに、最小限のコードを見てみましょう。モーターを2秒間正転させ、1秒停止し、2秒間逆転させる動作を繰り返します。

// DCモーターの正転・逆転を切り替える最小構成コード
const int ENA = 9;  // 有効化・速度制御用(PWM)
const int IN1 = 8;  // 回転方向1
const int IN2 = 7;  // 回転方向2

void setup() {
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
}

void loop() {
  // 正転(フルスピード)
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(ENA, HIGH);
  delay(2000);

  // 停止(ENAをLOWにしてフリーラン)
  digitalWrite(ENA, LOW);
  delay(1000);

  // 逆転(フルスピード)
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(ENA, HIGH);
  delay(2000);

  // 停止
  digitalWrite(ENA, LOW);
  delay(1000);
}

ここではENAをdigitalWriteでON/OFFしているだけです。そのため、モーターは「全力で回るか止まるか」の2択になります。次の章では、このENAピンをPWM制御に置き換えます。これにより、速度を自由に調整できるようになります。なお、方向の切り替えや条件分岐の書き方は、下記の記事で詳しく解説しています。



Chapter 05 / PWM

05PWMで速度を制御するコード

PWMの仕組みをおさらいする

ENAピンにPWM(Pulse Width Modulation:パルス幅変調)信号を送ります。すると、モーターの回転速度を0〜255の256段階で調整できます。PWMとは、ON/OFFを高速に繰り返す時間の比率(デューティ比)を変える仕組みです。見かけ上、「弱く・強く」電圧をかけているように振る舞います。下の図は、デューティ比の違いによって波形がどう変化するかを示したものです。

Arduinoでは、ENA・ENBのように~マークが付いたピンを使います。analogWrite()関数を呼び出すことで、この制御が行えます。

加速・減速を再現するコード例

// PWMでDCモーターの速度を段階的に変化させるコード
const int ENA = 9;
const int IN1 = 8;
const int IN2 = 7;

void setup() {
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);

  // 正転方向に固定
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
}

void loop() {
  // ゆっくり加速(0→255)
  for (int speed = 0; speed <= 255; speed++) {
    analogWrite(ENA, speed);
    delay(15);
  }

  delay(1000); // フルスピードで少しキープ

  // ゆっくり減速(255→0)
  for (int speed = 255; speed >= 0; speed--) {
    analogWrite(ENA, speed);
    delay(15);
  }

  delay(1000); // 停止状態を少しキープ
}

このコードでは、for文を使ってENAに送るPWM値を0から255まで少しずつ増やしています。そのため、モーターがゆっくり加速していく様子を再現できます。急に最高速度で回転させると、モーターやギアに負荷がかかります。同時に、消費電流のピークも大きくなります。したがって、ロボットカーなどの実用プロジェクトでは注意が必要です。このようになめらかに速度を変化させる書き方が、安全面でも有効です。

方向と速度は別の仕組み

編集部見解

方向(IN1/IN2)と速度(ENAのPWM値)は、別々の仕組みです。そう考えると理解しやすくなります。「どちらに回すか」はデジタル信号のHIGH/LOWで決まります。「どれくらいの速さで回すか」はアナログ的なPWM値で決まる、という役割分担です。

Chapter 06 / Power

06外部電源の注意点|壊さないための必須知識

DCモーターの制御でトラブルが起きる原因は、コードの間違いとは限りません。多くの場合、原因は「電源まわりの配線」にあります。ここで紹介する5つのポイントは、L298Nを使う上で必ず押さえておいてください。

電源の分離とGND共通化

!

1. モーター用電源はArduinoの5VピンやUSBから取らない

Arduinoの5VピンやUSB給電から取り出せる電流には上限があります。モーターの始動電流はその上限を簡単に超えます。そのため、モーターの定格電圧・電流に合った外部電源を用意しましょう。電池ボックスやACアダプターを、必ずL298Nの「12V」端子に接続してください。

!

2. GND(グラウンド)は必ず共通化する

外部電源とArduinoの給電元が別でも構いません。ただし、L298NのGNDとArduinoのGNDは必ず1本の線でつないでください。GNDが共通化されていないと、電気的な基準点がずれてしまいます。その結果、IN1/IN2/ENAの信号がモーター側に正しく伝わりません。

電圧・電流の管理

!

3. モーターの定格電圧を超える電源を使わない

モーター本体に記載された定格電圧を超える電源をつなぐと、寿命が縮みます。さらに、過大な電流によってL298Nが発熱・破損する原因にもなります。事前にモーターの仕様(定格電圧・定格電流)を確認しておきましょう。

発熱対策

!

4. 連続運転で熱くなる場合はヒートシンクを検討する

L298Nは電圧降下による発熱が比較的大きいICです。負荷の大きいモーターを長時間動かし続けると、ICが熱を持ちます。触れないほど熱くなる場合は、一度電源を切って冷ましてください。必要なら、ヒートシンクの追加や消費電力の少ないドライバへの変更も検討しましょう。

ノイズ対策

!

5. ノイズが気になる場合はモーター端子にコンデンサを追加する

DCモーターはブラシの接点で火花(スパークノイズ)を発生させることがあります。これが、Arduinoの誤動作の原因になる場合があります。改善しない場合は、モーター端子間に0.1μF程度のコンデンサを追加してみてください。ノイズが軽減されることがあります。

これらのポイントを押さえておきましょう。L298Nを使ったDCモーター制御で、電源まわりのトラブルはほとんど防げます。特に「外部電源の用意」と「GND共通化」の2点は、最優先で確認してください。



Chapter 07 / Troubleshooting

07よくあるトラブルと対処法

ArduinoとL298NでDCモーターを安全に動かすための外部電源、GND共通、定格電圧、発熱、ノイズ対策の図解

症状別の対処早見表

症状 主な原因 対処法
モーターが全く回らない 外部電源が未接続、またはGNDが共通化されていない 12V端子への外部電源接続と、ArduinoとのGND共通化を確認する
常にフルスピードでしか回らない ENAがGNDやジャンパーで直結され、PWM制御が効いていない ENAをArduinoのPWM対応ピン(~マーク)に接続し直す
コードを書き込んでも一切反応しない IN1/IN2/ENAの配線ミス、またはピン番号とコードの不一致 配線とコード内の定数(ENA・IN1・IN2)を再確認する
回転方向が意図と逆になる OUT1/OUT2とモーター端子の接続順が逆 配線を入れ替えるか、コード側のHIGH/LOWを入れ替えて調整する
L298Nがすぐに熱くなる モーターの消費電流が定格を超えている、連続運転時間が長い モーター選定を見直す、休止時間を挟む、ヒートシンクを追加する
Arduinoが再起動・誤作動する モーターのノイズや電源分離不足 GND共通化とコンデンサの追加(6章参照)を行う

原因を素早く切り分けるコツ

編集部想定シナリオ

Rさんは配線通りにつないだつもりだったが、モーターがうんともすんとも言わなかった。そこで、シリアルモニタでIN1/IN2/ENAの値を1行ずつ出力させてみた。すると、ENAのピン番号をコード内で書き間違えていたことに気づいた。このように、値そのものを可視化しながら切り分けると、原因特定が格段に速くなります。

Chapter 08 / FAQ

08よくある質問

基本のQ&A

Q.ArduinoのピンやUSB給電だけでDCモーターを動かせますか?
A.おすすめできません。Arduino Unoのピンの許容電流は、公式仕様で1本あたり20mAです。DCモーターの始動電流はこれを大きく上回ります。直結すると、Arduino本体が故障する恐れがあります。必ずL298Nなどのモータードライバと、定格に合った外部電源を用意してください。

Q.L298N以外に使えるモータードライバはありますか?
A.あります。代表例はTB6612FNGです。発熱が少なく、小型ロボットに向いています。さらに小型のDRV8833は、モバイル用途に使われます。L298Nは電圧降下が大きく発熱しやすい面がある一方、価格が安く情報量も多いため、初めてモーター制御を学ぶ教材として扱いやすい選択肢です。

トラブル・応用のQ&A

Q.L298Nで2つのモーターを同時に制御できますか?
A.できます。L298Nは1枚のボードに2チャンネル分の回路を搭載しています。IN1・IN2・ENAが1つ目のモーターを、IN3・IN4・ENBが2つ目のモーターを担当します。それぞれ独立して正転・逆転・速度制御が可能です。この仕組みは、左右の車輪を制御する2輪駆動ロボットカーにそのまま応用できます。

Q.モーターを動かすとArduinoが再起動したり誤作動したりします。原因は何ですか?
A.多くの場合、モーターの起動・停止時に発生するノイズや電圧変動が原因です。モーター用の電源とArduinoのGNDが共通化されていない場合に起きやすい症状です。あるいは、モーター端子にノイズ抑制用のコンデンサが入っていない場合にも発生します。本文で解説したGND共通化とコンデンサの追加を見直せば、多くのケースは改善します。

関連記事・参考資料

基礎を学べる記事

  1. YOFUKASI LAB「Arduinoに必要な工具・部品リスト」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-tools-parts/
  2. YOFUKASI LAB「Arduinoのコード・プログラムの書き方(コピペ可20選)」2026年, https://yofukasi-lab-wp.com/2026/07/18/arduino-cord/
  3. YOFUKASI LAB「analogRead・analogWriteの使い方」2026年, https://yofukasi-lab-wp.com/2026/07/30/analog-read-analogwrite/

応用・トラブルシューティング記事

  1. YOFUKASI LAB「Arduinoでサーボモーターを制御する方法」2026年, https://yofukasi-lab-wp.com/2026/08/18/servo/
  2. YOFUKASI LAB「Arduinoのシリアルモニタ活用術」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-serial-monitor-debugging/
  3. YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/
  4. YOFUKASI LAB「【保存版】Arduinoロードマップ|初心者からリハビリ機器自作まで完全ガイド」2026年, https://yofukasi-lab-wp.com/arduino-roadmap

参考資料(外部・一次情報)

  1. Arduino Documentation「UNO R3 Tech Specs」, https://docs.arduino.cc/hardware/uno-rev3
  2. Arduino Documentation「analogWrite()」, https://docs.arduino.cc/language-reference/en/functions/analog-io/analogWrite/
  3. STMicroelectronics「L298 Datasheet(DS0218)」, https://www.st.com/resource/en/datasheet/l298.pdf

※本記事は個人の学習・電子工作用途を対象にしています。実際の製品や医療機器へ組み込む場合は、電気安全・製品規格の専門家に別途ご相談ください。


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE