Arduinoでステッピングモーター制御|28BYJ-48配線

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






Arduinoでステッピングモーター制御|28BYJ-48配線







実装 / Arduino

Arduinoでステッピングモーター制御|28BYJ-48とULN2003の配線・コードを徹底解説

ステッピングモーターは、1ステップずつ正確に位置を決められるのが魅力です。DCモーターとはここが大きく違います。ただし、複数のコイルを順番に切り替える必要があるため、配線とコードにやや癖があります。本記事では、定番の組み合わせである28BYJ-48とULN2003ドライバボードを使います。回転方向・速度の設定方法から、初心者がつまずきやすいピン順序の落とし穴まで、順を追って解説します。

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

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

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

Chapter 01 / Basics

01なぜステッピングモーターにはドライバが必要か

DCモーターとの違い

DCモーターは、電圧をかけ続けるだけで回転し続けます。一方、ステッピングモーターは仕組みが異なります。内部の複数のコイルへ、決まった順番で電流を流します。そうすることで、少しずつ角度を進めていく方式です。この方式のおかげで、ステッピングモーターには強みがあります。「今何ステップ回したか」を数えるだけで、正確な位置決めができるのです。エンコーダーのようなセンサーがなくても、狙った角度で正確に止められます。

Arduinoのピンだけでは電流が足りない

とはいえ、複数のコイルを切り替えるには電流が必要です。本記事で扱う28BYJ-48は、1相あたり約240mAを消費します。一方、Arduino Unoのピンから安全に取り出せる電流は、公式仕様で1本あたり20mAです。つまり、ピンに直結するのはまったく現実的ではありません。だからこそ、コイルの切り替えを肩代わりする「ドライバ」が必要になります。今回使うULN2003は、その役割を担う定番の部品です。

編集部想定シナリオ

Arduinoで小型ロボットを作りたいTさんは、最初にDCモーターとL298Nを試した。しかし、アームの角度を正確に止めたいという要件には合わなかった。そこで、位置決めが得意なステッピングモーターに切り替えた。すると、狙った角度でぴたりと止まるようになった。用途に応じてモーターの種類を選ぶことが、遠回りを防ぐコツです。



Chapter 02 / Component

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本体(キー付きで挿し間違いなし)

※モーターコネクタは向きが決まっています。逆挿しの心配はありません。

Chapter 03 / Wiring

03配線方法:Arduino・ULN2003・28BYJ-48・電源

配線自体はシンプルです。ULN2003のIN1〜IN4をArduinoのデジタルピンにつなぎます。電源端子は5Vへ、GNDはArduinoのGNDへつなぎます。最後に、28BYJ-48のコネクタをULN2003ボードに差し込めば完了です。

ArduinoとULN2003と28BYJ-48ステッピングモーターの配線図

配線手順

接続元 接続先 備考
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自体が不安定になる場合も同様です。その段階で外部電源に切り替えれば、原因の切り分けがしやすくなります。



Chapter 04 / Code

04基本のコード|Stepper.hライブラリで回してみる

最重要ポイント:配線順序とコードの指定順序は別

28BYJ-48でもっとも多いつまずきが、このポイントです。配線こそIN1・IN2・IN3・IN4の順で単純です。しかし、Arduino公式のStepperライブラリに渡す際は順序が変わります。具体的には、IN1・IN3・IN2・IN4の順で指定する必要があります。真ん中の2つ、IN2とIN3だけを入れ替えるとイメージすると覚えやすいです。この順序を間違えると、モーターは振動するだけで回転しません。配線順序とコード側の順序の対応関係を、次の図解でも確認しておきましょう。

28BYJ-48の配線順序とStepper関数のピン指定順序の違い

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);
}

振動して回らないときの一番の確認ポイント

モーターが振動するだけで回らない場合は、まずこのピン順序を疑ってください。ほとんどのケースは、これで解決します。なお、コードの基本文法については、下記の記事でも詳しく解説しています。

Chapter 05 / Direction & Speed

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);
}

速度と滑らかさのバランス

編集部見解

速度と滑らかさはトレードオフの関係にあります。速く回そうとするほど、脱調やモーターの発熱のリスクが上がります。位置決めの正確さが重要な用途では、安定して動く速度に設定することをおすすめします。多少遅くても構いません。



Chapter 06 / Power & Care

06電源・発熱・脱調の注意点

保持電流に注意する

!

1. 止まっていても電流を消費している

ステッピングモーターは、位置を保持するために電流を流し続けます。動いていないときも同様です。これを保持電流と呼びます。長時間同じ位置で止めたままにすると、モーターやドライバがほんのり熱を持つことがあります。異常ではありません。ただし、触れないほど熱い場合は配線や電源を見直してください。

不要なときは電源を切ることも検討する

!

2. 位置保持が不要なら出力を止める

常時位置を保持する必要がない用途もあります。その場合は、動作が終わったタイミングでモーターへの電源供給を止めるのも一つの方法です。発熱と消費電力の両方を抑えられます。AccelStepperなど拡張ライブラリには、出力を止める関数が用意されているものもあります。

速度を上げすぎない

!

3. 脱調(ステップの追従失敗)に気をつける

設定速度が高すぎると、モーターがコイルの切り替えについていけなくなります。この現象を脱調と呼びます。脱調すると、内部では回転しているつもりでも実際の角度とずれが生じます。位置決めの精度が重要な用途では、速度を上げすぎないことが何より大切です。

!

4. より速く・強く動かしたいときは別のモーターを検討する

28BYJ-48は、内部ギアで速度を犠牲にしてトルク(力)を得る設計です。そのため、そもそも高速回転や重い負荷には向いていません。速度やトルクを重視するプロジェクトでは、別の選択肢を検討しましょう。NEMA17のようなバイポーラ型ステッピングモーターと、専用ドライバICの組み合わせが適しています。



Chapter 07 / Troubleshooting

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

Arduinoで28BYJ-48が回らないときの原因と対処法

症状別の対処早見表

症状 主な原因 対処法
モーターが振動するだけで回らない Stepper()のピン指定順序の間違い IN1・IN3・IN2・IN4の順に指定し直す(4章参照)
コードを書き込んでも全く反応しない 配線ミス、またはモーターコネクタの挿し忘れ IN1〜IN4の配線と、モーターコネクタの接続を再確認する
回転が不安定、途中で止まる 電流不足、または速度設定が高すぎる 外部5V電源に切り替える、setSpeed()の値を下げる
回転方向が意図と逆になる step()の符号の解釈が想定と逆 step()に渡す数値の符号を反転させる
Arduinoごとリセットされる、USBが不安定 USB給電の電流不足 外部5V電源とGND共通化に切り替える(3章参照)
長時間動かすと熱を持つ 保持電流による通常の発熱 触れないほど熱い場合のみ配線・電源を見直す(6章参照)

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

編集部想定シナリオ

Nさんはコードを書き込んだが、モーターがブルブルと震えるだけだった。配線を何度確認しても間違いは見当たらない。そこで、Stepper()の引数を見直してみた。すると、IN2とIN3の順序を入れ替えていなかったことに気づいた。順序を修正すると、モーターは滑らかに回り始めた。振動=配線ミスと思い込まず、コード側の引数順序も疑うことが大切です。

Chapter 08 / FAQ

08よくある質問

基本のQ&A

Q.モーターが振動するだけで回りません。原因は何ですか?
A.最も多い原因は、Stepper()のピン指定順序の間違いです。28BYJ-48は配線こそIN1・IN2・IN3・IN4の順です。しかし、Stepper()にはIN1・IN3・IN2・IN4の順で渡す必要があります。真ん中の2つを入れ替えるのを忘れると、モーターは振動するだけで回転しません。

Q.28BYJ-48はArduinoの5Vピンから電源を取っても大丈夫ですか?
A.1個だけを低速で動かす軽い用途なら、USBの5V給電で動くことが多いです。ただし、28BYJ-48は1相あたり約240mAを消費します。複数のモーターを同時に使う場合は、外部の5V電源を用意してください。その際もGNDの共通化は必須です。

応用のQ&A

Q.1回転に必要なステップ数はいくつですか?
A.Arduino公式のStepperライブラリでは、一般的に2048ステップで1回転として扱います。28BYJ-48は内部に約64:1のギアを持ちます。モーター自体は32ステップで1回転しますが、出力軸は2048ステップかかる計算です。個体差で多少前後することがあります。

Q.もっと速く、力強く回したい場合はどうすればいいですか?
A.28BYJ-48は内部ギアで速度を犠牲にして力を得る設計です。そのため、高速回転や大きな負荷の駆動には向いていません。速度やトルクを重視する場合は、NEMA17のようなバイポーラ型ステッピングモーターと、専用のドライバICを検討してください。

関連記事・参考資料

基礎を学べる記事

  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「Arduinoライブラリの入れ方・作り方・管理方法まとめ」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-library-install-create-manage/

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

  1. YOFUKASI LAB「ArduinoでDCモーター制御|L298N配線とコード」2026年, https://yofukasi-lab-wp.com/2026/08/27/arduino-dc-motor-l298n/
  2. YOFUKASI LAB「Arduinoでサーボモーターを制御する方法」2026年, https://yofukasi-lab-wp.com/2026/08/18/servo/
  3. YOFUKASI LAB「Arduinoのシリアルモニタ活用術」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-serial-monitor-debugging/
  4. YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/

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

  1. Arduino Documentation「Stepper library」, https://docs.arduino.cc/libraries/stepper/
  2. Arduino Documentation「Stepper Motors」, https://docs.arduino.cc/learn/electronics/stepper-motors
  3. Texas Instruments「ULN2003A Product Information」, https://www.ti.com/product/ULN2003A

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


関連記事

特集記事

コメント

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

TOP
CLOSE