Arduino 入門
Lesson 28
【ステッピングモーター編】
「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。
少しずつ、子供と一緒に楽しみながら気長にアップしてく予定です。
本記事はLesson 28 【ステッピングモーター編】です。
ステッピングモーターはモーターです。
ただし、Lesson 09、Lesson 26で解説したモーターとは異なります。


パルス電力に同期して動作するモーターです。
そのため、パルスモーターとも呼ばれます。
このパルスと呼ばれる電力信号がステッピングモーターの肝となります。
「パルスの電力信号って何?」と思うかもしれません。
これは、モーターをパルスで制御するというだけです。
これは以前に学習した「PWM」で制御するということとほぼ同義になります。
※Pulse Width Modulation(パルス幅変調)
Lesson 04 【RGBダイオード制御編】にて学習しました。
本Lessonに入る前に、一度復習しておくと理解の助けとなると考えます。

Arduino入門編の解説にて使用しているArduinoは互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
はじめに
まず、ステッピングモーターの意味、原理をWikipediaで確認してみましょう。
ステッピングモーター(Stepper motor)は、パルス電力に同期して動作する同期電動機である。したがってパルスモーター(Pulse motor)とも言われる。簡単な回路構成で、正確な位置決め制御を実現できるので、装置の位置決めを行う場合などによく使われる。
「パルス電力に同期して動作する」とあります。
ステッピングモーターの動作は以下の2つで制御されます。
- 回転角度:パルスの数で制御
- 回転速度:パルスの速度(周波数)で制御
PWM制御でと考えると複雑に思うかもしれません。
Arduinoの良いところはライブラリを使用するため制御を意識することはありません。
ライブラリを使ってしまうと、実際の制御を理解できないという欠点があります。
しかし、まずは動かして遊んでみたいのでライブラリを使います。
次回Lessonにて、ライブラリを使わない制御にも取り組んでいきます。
これまで学習したモーターとの違いを簡単に記載しておきます。
サーボモーター :信号によって0度~N度の角度を制御できる。
ステッピングモーター:信号によって回転範囲に制限なく回転角を制御できる。
といったところでしょうか。
また、DCモーター同様に駆動させるためには一定の大きさの電流が必要になります。
そのため、Arduinoの出力信号では能力不足となります。
駆動能力を補うため、ステッピングモーター用のドライバICを使用するのが一般的です。
Lesson 28 目標
本Lessonの目標は以下です。
2.ライブラリを使った制御方法を理解する。
3.ドライバモジュール(ULN2003A)の使い方を理解する。
今回も遊ぶことを最大の目標に楽しみましょう!
準備
ではLessonの準備に取り掛かりましょう。
部品点数は多くないため、接続は簡単です。
頑張って組み上げていきましょう。
必要なもの
- USB接続用のPC(IDE統合環境がインストールされたPC)
→管理人が勝手に比較したBTOメーカーを紹介しています。 - UNO R3(以下UNO)、おすすめUNO互換品(ELEGOO)
- PCとUNOを接続するUSBケーブル
- ブレッドボード安価(大)、ブレッドボード安価(中)
※おすすめブレッドボード(大)、おすすめブレッドボード(中) - ステッピングモーターとドライバモジュール 安価品
- 電源モジュール
- 電源モジュールに供給する電源(9Vの電池、ACアダプタなど)
ACアダプタ 9V/1A
Amazonでは、ステッピングモーターとドライバモジュールがセットで売られています。
こちらAmazon発送です。
Jumper wire、抵抗は今後も頻繁に利用します。
Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。
短めが使いやすい場合も。
抵抗も単品で揃えるよりはセットをおすすめします。
抵抗、LEDなどを個別でセット品を購入しても、そんなに使わない!
という方は、「電子工作基本部品セット」が使い勝手が良い。
使用部品説明
新たに登場した部品について説明していきます。
本Lessonで新しく登場する部品は以下となります。
- 28BYJ-48 ステッピングモーター
- ULN2003ドライバモジュール
以下の部品に関しては、Lesson 26にて解説していますのでご確認ください。
ステッピングモーター 実物写真
下の写真が、ステッピングモーターです。
型名:28BYJ-48
制御用のドライバモジュールに接続できるようにコネクト端子がついています。
ちなみに、ELEGOO UNO キットには合わせて梱包されています。
ステッピングモーター原理
ステッピングモーターの原理を解説すると膨大になります。
膨大すぎて、管理人には説明しきれません・・・。
そこで、学習できるサイトをさがしました。
下記サイトはe-ラーニングでステッピングモーターについて学習できます。
興味のある方はご確認ください。
東芝半導体&ストレージ製品情報サイト 「ステッピングモータ」
ここでは簡単に分類だけ解説しておきます。
●回転子(軸)の種類で分類
- PM型(Permanent Magnet Type、永久磁石)
- VR型(Variable Reluctance Type、歯車状鉄心形)
- HB型(Hybrid Type、複合形)
●コイルへの電流の流し方での分類
- ユニポーラ型(単極性)
- バイポーラ型(双極性)
本Lessonで使用する「28BYJ-48」は、PM型/ユニポーラ型となります。
ステッピングモーター 仕様
本Lessonで使用してるステッピングモーター型番は「28BYJ-48」。
ELEGOO UNO キットに梱包されているモーターとなります。
データシートはDigi-keyなどで確認ができます。
https://www.digikey.jp/ja/datasheets/mikroelektronika/mikroelektronika-step-motor-5v-28byj48-datasheet
ここでは代表的な仕様のみ記載します。
詳細はデータシートをご確認ください。
●ステッピングモーター仕様「28BYJ-48」
項目 | 仕様 |
---|---|
型名 | 28BYJ-48 |
種類 | ユニポーラ型 |
定格電圧 | 5V |
フェーズ数 | 4 |
ギア比 | 64:1 |
ステップ角 | 64ステップで5.625度回転 ハーフステップモード |
周波数 | 100Hz |
DC抵抗 | 50Ω±7% |
結線 | 5線式 |
※ハーフステップモード:ステップ角が基本ステップ角度の1/2の角度で駆動する方式
※ギア比:ローター(中心軸)が64回転で車軸(表に出ている軸)が1回転
●励磁方式
「28BYJ-48」は下図に示すようにフェーズ数が4相となっています。
この相への電流のかけ方は3種類あります。
- 1相励磁(4 step が1つの動作のかたまり)
パルス(電流)を順番に与えていく方式
制御が簡単だが、安定性が良くない。
step → | 1 | 2 | 3 | 4 |
---|---|---|---|---|
IN1(青) | ON | – | – | – |
IN2(桃) | – | ON | – | – |
IN3(黄) | – | – | ON | – |
IN4(橙) | – | – | – | ON |
- 2相励磁(4 step が1つの動作のかたまり)
次の相と1パルスずつずらして同時に励磁する方式
1相励磁に比べて安定しているが消費電力も2倍
step → | 1 | 2 | 3 | 4 |
---|---|---|---|---|
IN1(青) | ON | ON | – | – |
IN2(桃) | – | ON | ON | – |
IN3(黄) | – | – | ON | ON |
IN4(橙) | ON | – | – | ON |
- 1-2相励磁(8 step が1つの動作のかたまり)
1相励磁と2相励磁を交互に繰り返す方式
1相励磁、2相励磁に対して回転角度が半分
step → | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
IN1(青) | ON | ON | ON | – | – | – | – | – |
IN2(桃) | – | – | ON | ON | ON | – | – | – |
IN3(黄) | – | – | – | – | ON | ON | ON | – |
IN4(橙) | ON | – | – | – | – | – | ON | ON |
以上、簡単に励磁方式の特徴を羅列してみました。
それぞれ、必要に応じて選択ということでしょうか。
- 1相励磁方式:
- トルクが弱い
- 回路が簡単(低コスト)
- 2相励磁方式
- トルクが強い
- 回路が多少複雑
- 1-2相励磁方式
- 細かいモーター制御が可能
- 回路が複雑(高コスト)
●回転角度について
ステッピングモーターの仕様から以下のことが言えます。
●1-2相励磁の場合
8 step × 8 = 64 stepで中心軸が1回転。
そのため、実際の車軸(外に出ている軸)を1回転させるのに必要なstep数は下記となります。
64 step × 64(ギア比) = 4096 step
となり、4096 stepで1回転することになります。
●2相励磁方式の場合(1相も同じ)
4 step × 8 = 32 stepで中心軸が1回転。
そのため、実際の車軸(外に出ている軸)を1回転させるのに必要なstep数は下記となります。
32 step × 64(ギア比) = 2048 step
となり、2048 stepで1回転することになります。
本Lessonでは2相励磁方式での制御となります。
2048 stepで1回転を頭の片隅に置いておいてください。
ドライバーモジュール 実物写真
こちらが、ドライバモジュール実物写真。
ULN2003AのドライバICが搭載されています。
ドライバモジュール 仕様
本Lessonで使用してるドライバーモジュールは「ULN2003AのICを使用」。
ELEGOO UNO キットに梱包されているドライバモジュールとなります。
ここでは代表的な仕様のみ記載します。
詳細はデータシートをご確認ください。
●ドライバモジュール仕様「ULN2003A」
項目 | 仕様 |
---|---|
型名 | ULN2003A |
コレクタ定格電流 | 500mA |
出力クランプ・ダイオード ※保護ダイオードのことです。 |
あり |
※詳細仕様はTexas Instrumentsで確認ができます。
http://www.tij.co.jp/product/jp/ULN2003A/technicaldocuments
●接続例
下記にULN2003Aとステッピングモーターの接続例を示します。
●ドライバモジュール概要
下記にドライバーモジュールの概要を示します。
基本構成は、下記4つをまとめたモジュールです。
- ULN2003AのドライバIC
- Arduinoから出力を受け取る入力
- ステッピングモーターへの出力
- 動作状態を確認できるLED
- 電源
実践 回路作成とコード作成
最初に回路図を確認してください。
次に、回路図に合わせて部品を接続します。
最後にコードを書いて、ステッピングモーターを動かしていきましょう。
Arduinoのピン配置を確認したい方は番外編02を参照してください。
回路図
ドライバモジュールのコネクトピンにステッピングモーターを接続。
Arduinoはデジタル入出力ピンの8,9,10,11番ピンを使用しドライバーモジュールに接続。
8番ピン ⇒ IN4(ドライバモジュール)
9番ピン ⇒ IN3(ドライバモジュール)
10番ピン ⇒ IN2(ドライバモジュール)
11番ピン ⇒ IN1(ドライバモジュール)
回路図がこちら。
こちらがブレッドボード図。
回路図は「fritzing」を利用しています。
「fritzing」の使い方は下記を参照してください。
接続
下図に示すように、用意した部品を使用して接続しましょう。
部品はステッピングモーター、ドライバモジュール(ULN2003A)、電源モジュールとなります。
部品点数が少ないため、接続は簡単です。
使用するポートは、デジタルピンは「8,9,10,11」です。
穴に挿入しづらいときは、ラジオペンチなどを使用してください。
コードの書き込み
接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。
コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。
本Lessonではライブラリ「Stepper.h」を使用します。
このライブラリは標準ライブラリです。
IDEに標準で搭載されていますので、そのまま使用できるはずです。
使用できない場合は、下記を参照して使えるようにしておきましょう。

コマンド説明
本Lessonでは、「Stepper.h」のライブラリを使用します。
このライブラリのコマンドについて解説します。
コマンド | 内容 |
Stepper(steps, pin1, pin2, pin3, pin4) | Arduinoボードに接続されているステッパモータを表すStepperクラスのインスタンスを新たに生成。 setup()とloop()より前で定義。steps:1回転あたりのステップ数 (int) pin1, pin2, pin3, pin4:モータに接続されているピンの番号 戻り値:作成したインスタンス例 myStepperというインスタンスを生成。 100ステップ、Arduinoのピンは8,9,10,11を定義。 Stepper myStepper(100, 8, 10, 9, 11); |
Stepper:setSpeed(rpms) | モータの速さを毎分の回転数(RPM)で設定。
rpms:1分間あたりの回転数 正の数 (long) 例 |
Stepper:step(steps) | setSpeed()で設定した速さで、指定したステップ数だけモータを回す。
steps:モーターが回転するステップ数。逆回転は負を設定(int) 例 1000ステップモーターを回す。 |
ライブラリを使用することで、励磁方式等々を意識することなく使用できます。
これがArduinoの良いところですね。
ただし、実際の動作シーケンスを理解できないという欠点があります・・・。
サンプルコード
GitHubにステッピングモーターを動かすサンプルコードがあります。
参考にしてみてください。
本Lessonでは、上記のサンプルコードを参考にわかりやすくするために簡潔にしました。
一定のスピードで90度づつ回転するスケッチとなります。
また、スケッチ内で電流を遮断するコードを記載しています。
これは、静止状態が「その状態を維持する」という状態であり、維持するために電流が流れ続けてしまうからです。
それなりに電流が流れ発熱しますので、90度回転後はその状態を維持するのではなく電流を遮断するようにしています。
//Lesson 28 ステッピングモーター編 //ライブラリ使用によるスケッチ //https://omoroya.com/ // 電子部品 // 電源モジュール,ドライバモジュール(ULN2003A),ステッピングモーター //ライブラリインクルード #include <Stepper.h> // ステッピングモータが1回転するのに必要なステップ数を定義 //2相励磁方式で制御するため2048 step で1回転 const int MOTOR_STEPS = 2048; //1回転あたりのステップ数と接続するピンの設定 Stepper myStepper(MOTOR_STEPS, 8, 10, 9, 11); void setup() { myStepper.setSpeed(10); // 10回転/1分に設定 rpm(1分あたりの回転数) } void loop() { myStepper.step(512); // 512ステップで90度回転 // 静止時には電流を遮断する。 digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); delay(500); //90度回転したら500ms待つ }
動作確認
では、さっそく動作を確認していきます。
90度回転、0.5秒止まる → 90度回転、0.5秒止まる → ・・・
の繰り返しとなるはずです。
※gifで作成しているため、容量圧縮のため画像サイズは小さくしてあります。
まとめ
今回は以下の内容について理解してもらいました。
2.ライブラリを使った制御方法を理解する。
3.ドライバモジュール(ULN2003A)の使い方を理解する。
4.楽しんで遊ぶ。
いかがだったでしょうか。
ステッピングモーターは3Dプリンタなどでも使われています。
使い方をマスターできれば、色々なもの作りに応用ができそうです。
Lesson 28 【ステッピングモーター編】 はここまで。
ステッピングモーター
応用するにはもっと理解する必要がありそうです。
疑問点、質問などありましたら気軽にコメントください。
次回、Lesson 29は【ステッピングモーター編 その2】 です。
本Lessonではライブラリを使用しましたが、動作理解のためにライブラリを使用しないスケッチにも挑戦ます。

最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
初めまして。
興味深く読ませていただきました。
小生50にしてArduinoを勉強しようとしており、一点教えて頂きたく存じます。
ステッピングモーターを下記のように制御するのは複雑なプログラミングが必要でしょうか?
プッシュスイッチで一定角度回転し、自動停止後5秒後に、逆回転し、指定角度まで回転して、停止。
停止時は回転速度を落とす。と言うものです。
お忙しい中恐れ入りますが、ご教示いただけますと幸いでございます。
コメントありがとうございます。
記載のステッピングモーターの動作ですが、それほど難しくなくできるかと思います。
細かい、内容となるとスケッチを一通り記載する必要があるためコメント欄には書きづらいのですが・・・
まずは、連続する動作ではなく1つ1つの動作を試してみて、連続する動作のスケッチを書くのが良いかと思います。
これはarduino UNOでも、動かせますか?
コメントありがとうございます。
ステッピングモーターはある程度大きな電流を必要とするため
Arduino UNOのみで動かすのは厳しいと考えます。
駆動能力を補うため、ステッピングモーター用のドライバICを使用するのが一般的です。
こんにちは。arduinoをamazonで買ったばかりの超初心者です。
とても読みやすい記事で本当に助かっています。
以下、質問なのですが
3〜4時間ごとにステッピングモーターを回転させるということは可能でしょうか。
色々なサイトを見ても秒単位で制御しているスケッチしかないのですが、
arduinoでは数時間単位で同じ実行を繰り返すということはあまりしないのでしょうか。
お忙しいところ恐れ入りますが、教えていただけると嬉しいです!
コメントありがとうございます。
長時間のデータ取得等に利用されている方もいます。
ただ、長時間利用する場合
暴走したり、停止したりといったことを回避するために
ウォッチドッグタイマを使用するのが良いかと思います。
初めまして。
時々、おもろ家さんのサイトのお世話になっております。(^^;
Stepperライブラリの中のsrcフォルダの中に、cppファイルがありますが、
その中に以下の記述があります。
当方、意味が理解できず悩んでおります。
/*
* Sets the speed in revs per minute
*/
void Stepper::setSpeed(long whatSpeed)
{
this->step_delay = 60L * 1000L * 1000L / this->number_of_steps / whatSpeed;
}
以上、記述の抜粋ですが、this->number_of_stepsは、2相励磁なので2048でよいかと。
whatSpeedは、必要とする回転数(例えば毎分10回転なら、10)でよいかと。
一番悩んでいるところが60L * 1000L * 1000Lなのですが、全く意味が判らず、
質問をしてみようと思いコメント差し上げました。(^^;
よろしくお願いします~~
コメントありがとうございます。
setSpeedは「1分間あたり何回転するかを設定する」項目で
Stepper()を呼び出した時のスピードを設定しています。
ということで、
全体のステップ数と、回転速度を元に
動かした後の待ち時間を決めていると思うのですが・・・
もう少し考えておきます。
質問です。
ULN2003ドライバモジュールはPM型/ユニポーラ型のステッピングモーターであれば汎用的に使えるのでしょうか、
それとも28BYJ-48専用でしょうか?
コメントありがとうございます。
>ULN2003ドライバモジュールはPM型/ユニポーラ型のステッピングモーターであれば汎用的に使えるのでしょうか、
ドライバーモジュールはあくまでも、ただのドライバーですので定格電流など仕様範囲内での使用であれば使えると考えます。
あの・・・へんじしてくれませんか?
コメントありがとうございます。
数日~1週間、サイトを確認できないことが多々あります。
空いた時間でサイト管理をしているためご了承ください。