Arduinoでステッピングモーター制御|28BYJ-48とULN2003の配線・コードを徹底解説
ステッピングモーターは、1ステップずつ正確に位置を決められるのが魅力です。DCモーターとはここが大きく違います。ただし、複数のコイルを順番に切り替える必要があるため、配線とコードにやや癖があります。本記事では、定番の組み合わせである28BYJ-48とULN2003ドライバボードを使います。回転方向・速度の設定方法から、初心者がつまずきやすいピン順序の落とし穴まで、順を追って解説します。
01なぜステッピングモーターにはドライバが必要か
DCモーターとの違い
DCモーターは、電圧をかけ続けるだけで回転し続けます。一方、ステッピングモーターは仕組みが異なります。内部の複数のコイルへ、決まった順番で電流を流します。そうすることで、少しずつ角度を進めていく方式です。この方式のおかげで、ステッピングモーターには強みがあります。「今何ステップ回したか」を数えるだけで、正確な位置決めができるのです。エンコーダーのようなセンサーがなくても、狙った角度で正確に止められます。
Arduinoのピンだけでは電流が足りない
とはいえ、複数のコイルを切り替えるには電流が必要です。本記事で扱う28BYJ-48は、1相あたり約240mAを消費します。一方、Arduino Unoのピンから安全に取り出せる電流は、公式仕様で1本あたり20mAです。つまり、ピンに直結するのはまったく現実的ではありません。だからこそ、コイルの切り替えを肩代わりする「ドライバ」が必要になります。今回使うULN2003は、その役割を担う定番の部品です。
Arduinoで小型ロボットを作りたいTさんは、最初にDCモーターとL298Nを試した。しかし、アームの角度を正確に止めたいという要件には合わなかった。そこで、位置決めが得意なステッピングモーターに切り替えた。すると、狙った角度でぴたりと止まるようになった。用途に応じてモーターの種類を選ぶことが、遠回りを防ぐコツです。
0228BYJ-48とULN2003とは|基礎知識
28BYJ-48の仕様
28BYJ-48は、5V駆動のユニポーラ型ステッピングモーターです。コイルの共通端子を含めて5本の線が出ています。内部には減速用のギアが組み込まれています。おおよそ64:1の比率で減速されます。モーター自体は32ステップで1周しますが、出力軸はその64倍動かないと1周しません。Arduino公式のStepperライブラリでは、実務上2048ステップで1回転として扱うのが一般的です。個体差でこの数値が多少前後することもあります。
ULN2003ドライバボードの役割
ULN2003は、7組のダーリントントランジスタを内蔵した集積回路(IC)です。Texas Instruments社の製品情報によると、1チャンネルあたり最大500mAの電流を扱えます。
駆動ボードに実装されている部品
28BYJ-48用の駆動ボードには、このICに加えていくつかの部品があります。モーター用の5線コネクタと、電源端子があらかじめ実装されています。そのため、部品同士を個別に配線する手間がありません。役割はシンプルです。Arduinoからの信号(IN1〜IN4)を受け取ります。そして、モーターの4本のコイル線へ電流を流し分けます。
主要ピンの一覧
| ピン名 | 役割 | 接続先の目安 |
|---|---|---|
| IN1〜IN4 | Arduinoからのコイル駆動信号 | ArduinoのデジタルピンD8〜D11 |
| +(VCC) | モーター駆動用の電源入力 | Arduinoの5V、または外部5V電源 |
| -(GND) | グラウンド | ArduinoのGND |
| モーターコネクタ | 28BYJ-48の5線プラグの差し込み口 | 28BYJ-48本体(キー付きで挿し間違いなし) |
※モーターコネクタは向きが決まっています。逆挿しの心配はありません。
03配線方法:Arduino・ULN2003・28BYJ-48・電源
配線自体はシンプルです。ULN2003のIN1〜IN4をArduinoのデジタルピンにつなぎます。電源端子は5Vへ、GNDはArduinoのGNDへつなぎます。最後に、28BYJ-48のコネクタをULN2003ボードに差し込めば完了です。

配線手順
| 接続元 | 接続先 | 備考 |
|---|---|---|
| Arduino D8 | ULN2003のIN1 | — |
| Arduino D9 | ULN2003のIN2 | — |
| Arduino D10 | ULN2003のIN3 | — |
| Arduino D11 | ULN2003のIN4 | — |
| Arduinoの5V | ULN2003の+端子 | 外部5V電源を使う場合はそちらへ(次項参照) |
| ArduinoのGND | ULN2003の-端子 | 必須。外部電源を使う場合も共通化する |
| 28BYJ-48のコネクタ | ULN2003のモーター端子 | キー付きなので挿し間違いの心配なし |
※配線自体はIN1・IN2・IN3・IN4の順で問題ありません。順序が重要になるのは、次章で説明するコード側の指定です。
電源はArduinoの5Vで足りるのか
28BYJ-48は5V駆動です。そのため、Arduino本体の5Vピンからそのまま給電できます。1個のモーターを低速で動かすだけなら、USB給電でも動くことが多いです。ただし、モーターは1相あたり約240mAを消費します。パソコンのUSBポートによっては、電流の供給能力が心もとない場合もあります。複数のモーターを同時に使う場合は、外部の5V電源を用意してください。この場合も、ULN2003のGNDとArduinoのGNDは必ず1本の線でつないでおきます。
編集部の見解として、まずはArduinoのUSB給電だけで動作を確認するのがおすすめです。もし動きがぎこちなければ、それは電流不足のサインかもしれません。あるいは、Arduino自体が不安定になる場合も同様です。その段階で外部電源に切り替えれば、原因の切り分けがしやすくなります。
04基本のコード|Stepper.hライブラリで回してみる
最重要ポイント:配線順序とコードの指定順序は別
28BYJ-48でもっとも多いつまずきが、このポイントです。配線こそIN1・IN2・IN3・IN4の順で単純です。しかし、Arduino公式のStepperライブラリに渡す際は順序が変わります。具体的には、IN1・IN3・IN2・IN4の順で指定する必要があります。真ん中の2つ、IN2とIN3だけを入れ替えるとイメージすると覚えやすいです。この順序を間違えると、モーターは振動するだけで回転しません。配線順序とコード側の順序の対応関係を、次の図解でも確認しておきましょう。

1回転させる最小コード
このルールをコードに反映すると、次のようになります。Arduino IDEに標準搭載されているStepper.hライブラリを使います。時計回りに1回転、反時計回りに1回転する動作を繰り返す、シンプルな例です。
// 28BYJ-48ステッピングモーターを1回転させる最小構成コード
#include <Stepper.h>
const int stepsPerRevolution = 2048; // 1回転あたりのステップ数(実務上の目安)
// 配線はD8,D9,D10,D11の順だが、指定はIN1,IN3,IN2,IN4の順にする
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
void setup() {
myStepper.setSpeed(10); // 回転速度(RPM)
}
void loop() {
// 時計回りに1回転
myStepper.step(stepsPerRevolution);
delay(500);
// 反時計回りに1回転
myStepper.step(-stepsPerRevolution);
delay(500);
}
振動して回らないときの一番の確認ポイント
モーターが振動するだけで回らない場合は、まずこのピン順序を疑ってください。ほとんどのケースは、これで解決します。なお、コードの基本文法については、下記の記事でも詳しく解説しています。
05回転方向と速度を制御するコード
回転方向はstep()の正負で決まる
step()関数に渡す数値の符号が、回転方向を決めます。正の数を渡すと時計回りに、負の数を渡すと反時計回りに回転します。ただし、この対応は配線の向きによって入れ替わることがあります。実機を動かしながら、自分の環境での対応を確認してください。
速度はsetSpeed()で指定する
setSpeed()には、RPM(1分あたりの回転数)を指定します。28BYJ-48は内部にギアを持っています。そのため、速度を上げすぎると脱調(追従できず止まってしまう現象)が起きやすくなります。多くのチュートリアルでは、10〜15RPM程度を目安に使っています。まずは低めの速度から試してみましょう。実機の様子を見ながら調整するのがおすすめです。
// 回転方向と速度を切り替えて動かすコード
#include <Stepper.h>
const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
void setup() {
myStepper.setSpeed(10); // まずは低速から試す
}
void loop() {
// ゆっくり半回転(時計回り)
myStepper.setSpeed(8);
myStepper.step(stepsPerRevolution / 2);
delay(1000);
// ややスピードを上げて半回転(反時計回り)
myStepper.setSpeed(14);
myStepper.step(-stepsPerRevolution / 2);
delay(1000);
}
速度と滑らかさのバランス
速度と滑らかさはトレードオフの関係にあります。速く回そうとするほど、脱調やモーターの発熱のリスクが上がります。位置決めの正確さが重要な用途では、安定して動く速度に設定することをおすすめします。多少遅くても構いません。
06電源・発熱・脱調の注意点
保持電流に注意する
1. 止まっていても電流を消費している
ステッピングモーターは、位置を保持するために電流を流し続けます。動いていないときも同様です。これを保持電流と呼びます。長時間同じ位置で止めたままにすると、モーターやドライバがほんのり熱を持つことがあります。異常ではありません。ただし、触れないほど熱い場合は配線や電源を見直してください。
不要なときは電源を切ることも検討する
2. 位置保持が不要なら出力を止める
常時位置を保持する必要がない用途もあります。その場合は、動作が終わったタイミングでモーターへの電源供給を止めるのも一つの方法です。発熱と消費電力の両方を抑えられます。AccelStepperなど拡張ライブラリには、出力を止める関数が用意されているものもあります。
速度を上げすぎない
3. 脱調(ステップの追従失敗)に気をつける
設定速度が高すぎると、モーターがコイルの切り替えについていけなくなります。この現象を脱調と呼びます。脱調すると、内部では回転しているつもりでも実際の角度とずれが生じます。位置決めの精度が重要な用途では、速度を上げすぎないことが何より大切です。
4. より速く・強く動かしたいときは別のモーターを検討する
28BYJ-48は、内部ギアで速度を犠牲にしてトルク(力)を得る設計です。そのため、そもそも高速回転や重い負荷には向いていません。速度やトルクを重視するプロジェクトでは、別の選択肢を検討しましょう。NEMA17のようなバイポーラ型ステッピングモーターと、専用ドライバICの組み合わせが適しています。
07よくあるトラブルと対処法

症状別の対処早見表
| 症状 | 主な原因 | 対処法 |
|---|---|---|
| モーターが振動するだけで回らない | Stepper()のピン指定順序の間違い | IN1・IN3・IN2・IN4の順に指定し直す(4章参照) |
| コードを書き込んでも全く反応しない | 配線ミス、またはモーターコネクタの挿し忘れ | IN1〜IN4の配線と、モーターコネクタの接続を再確認する |
| 回転が不安定、途中で止まる | 電流不足、または速度設定が高すぎる | 外部5V電源に切り替える、setSpeed()の値を下げる |
| 回転方向が意図と逆になる | step()の符号の解釈が想定と逆 | step()に渡す数値の符号を反転させる |
| Arduinoごとリセットされる、USBが不安定 | USB給電の電流不足 | 外部5V電源とGND共通化に切り替える(3章参照) |
| 長時間動かすと熱を持つ | 保持電流による通常の発熱 | 触れないほど熱い場合のみ配線・電源を見直す(6章参照) |
原因を素早く切り分けるコツ
Nさんはコードを書き込んだが、モーターがブルブルと震えるだけだった。配線を何度確認しても間違いは見当たらない。そこで、Stepper()の引数を見直してみた。すると、IN2とIN3の順序を入れ替えていなかったことに気づいた。順序を修正すると、モーターは滑らかに回り始めた。振動=配線ミスと思い込まず、コード側の引数順序も疑うことが大切です。
08よくある質問
基本のQ&A
応用のQ&A
関連記事・参考資料
基礎を学べる記事
- YOFUKASI LAB「Arduinoに必要な工具・部品リスト」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-tools-parts/
- YOFUKASI LAB「Arduinoのコード・プログラムの書き方(コピペ可20選)」2026年, https://yofukasi-lab-wp.com/2026/07/18/arduino-cord/
- YOFUKASI LAB「Arduinoライブラリの入れ方・作り方・管理方法まとめ」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-library-install-create-manage/
応用・トラブルシューティング記事
- YOFUKASI LAB「ArduinoでDCモーター制御|L298N配線とコード」2026年, https://yofukasi-lab-wp.com/2026/08/27/arduino-dc-motor-l298n/
- YOFUKASI LAB「Arduinoでサーボモーターを制御する方法」2026年, https://yofukasi-lab-wp.com/2026/08/18/servo/
- YOFUKASI LAB「Arduinoのシリアルモニタ活用術」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-serial-monitor-debugging/
- YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/
参考資料(外部・一次情報)
- Arduino Documentation「Stepper library」, https://docs.arduino.cc/libraries/stepper/
- Arduino Documentation「Stepper Motors」, https://docs.arduino.cc/learn/electronics/stepper-motors
- Texas Instruments「ULN2003A Product Information」, https://www.ti.com/product/ULN2003A
※本記事は個人の学習・電子工作用途を対象にしています。実際の製品や医療機器へ組み込む場合は、電気安全・製品規格の専門家に別途ご相談ください。
コメント