電子工作で使う「モーター」というと、DCモーターだけでなく、サーボモーターやステッピングモーターなどがある。
DCモーターはただ適切な電圧を電源として繋げるだけで動くし、サーボモーターも適切な電源につなぎ、制御信号線にパルスを送るとその角度に動いてくれる。(どれくらいのパルス幅のときサーボの回転角度がどれくらいなのかは、データシートに書いてるのでそれに従うだけで良い)
ただ、僕はステッピングモーターを今まで使ってこなかったので、使い方がよくわからなくて苦手意識がある。
使い方の学習メモとしてブログ記事に残しておく。
28BYJ-48とULN2003の場合
まずは電子工作で定番(らしい)ステッピングモーター、28BYJ-48と、これをコントロールするためのステッピングモータードライバIC、ULN2003を使ってみる。

こいつらである。
ULN2003は、IC単体ではなく写真のようにモジュールになったものが売られている。
お試しで使ってみる際、モーター本体とコントロールボードをうまいこと収納しておくケースがあったほうが便利なため、東京バード氏の設計したケースの3Dモデルを使わせていただく。
3Dモデルの公開ページはこちら:https://www.thingiverse.com/thing:5145361
モーターのコネクタには正しい挿す向きがあり、逆向きには入らないようになっているので特に問題はない。
+、ーと書かれているピンには電源を接続する。今回はモーター側は5Vに対応しているので、+を5Vに、ーをGNDに繋ぐ。
IN1~4の4つの端子は、それぞれマイコンのデジタル出力可能なGPIOにつなぐ。(後述)
さて、ステッピングモーターの何がめんどくさいって、ちゃんとしたパルスタイミングでの制御をしないとまともに動いてくれないところ……繋ぐ線もサーボやDCモーターに比べて多くてよくわかんないし……
そのへんをあまり気にせず使えるようにArduinoにライブラリもあるんだけど、今回はステッピングモーターに慣れ親しむため、あえてライブラリは使わないで回転させてみる。
ステッピングモーター回転の仕組み(ユニポーラ)
ステッピングモーターには大きく分けてユニポーラとバイポーラという2種類があるらしく、今回使うモーター28BYJ-48はユニポーラである。
ざっくり説明すると、ユニポーラの場合モーター内のコイルの状態は『電流が流れている』か『流れていない』の2状態があって、どちらのコイルが電流の流れている状態なのか?と、電流の向きはどっち向きなのか?で回転制御をしている。
バイポーラの場合は、コイルの状態は『電流がプラス方向に流れている』か『マイナス方向に流れている』の2状態であり電流自体は常に流れていて、電流が流れていないという状態は(停止時を除き)存在しない。どちらのコイルがそれぞれどちら向きの電流が流れているのかで回転制御する。
言葉で説明しても全然わからんので、秋月電子に載っている28BYJ-48の配線図を見てみる。

うーん、わからん。
ただ、コントロールボードの配線を辿って見ると”赤”は電源のプラス側に直結されている。つまり、今回は電源電圧は5Vなので、赤のところには常に5Vが印加されていると考えて良い。
今回はユニポーラなので、先程の「どちらか一方のコイルに電流が流れているとき、もう片方には電流が流れていない」というヒントをもとに、順番に考えてみることにする。
フェイズ1:赤→ピンク方向に電流を流す。
このとき、「コイルは片方しか電流を流さない」の法則により、図の下側のコイルは電流が流れていないオフの状態である。

これによって左のコイルがN極になったとする。(なんでSじゃなくてNとわかるの?と思うかもしれないがここでS極になるとしても本質的に考え方は変わらないのでN極と仮定する。)
すると、内部の磁石のS極が左コイルに引き寄せられて、上図の状態になる。
フェイズ2:赤→黄 方向に電流を流す。
このとき、左コイルはオフである。

赤→黄 方向の電流によって下のコイルがN極になるため、内部の磁石は反時計回りに90度回転して下のコイルに引き寄せられる。
フェイズ3:赤→橙 方向に電流を流す。
くどいようだが、左コイルに電流を流すため、下コイルはオフである。

フェイズ1のときと左コイルに流れる電流の向きは逆なので、コイルの極性もフェイズ1とは逆になり、左コイルはS極になる。
すると、内部の磁石は左コイルに引き寄せられて、また反時計回りに90度回転する。
フェイズ4:赤→青 方向に電流を流す。

こちらもフェイズ2とは逆向きの電流の向きであることから、下コイルはS極となり、内部の磁石は下コイルに引き寄せられて、また反時計回りに90度回転する。
これで、無事に内部の磁石が1回転した。
この後はまたフェイズ1の向きに電流を流してやればまた回転を始めるので、ユニポーラステッピングモーターはフェイズ1→2→3→4→1→2→……と繰り返すことによって、ぐるぐる回転させ続けることができる。
つまり、ピンク、橙、黄、青の端子はそれぞれ、電源供給元である赤からやってきた電流を流す下流の出口となっていて、この出口を順に開いて・閉じて……と繰り返していくことで、モーターを回転させることができる。
ここで、モーターコントローラーICのULN2003のデータシートを見てみる。

ボード左側のIN1~4は、このICの1ピン~4ピンとつながっている。機能ブロック図を見ると、

推測通り、入力ピンがハイになると下流の出口となって電流をせき止めていた内部のトランジスタがオンになり、出力ピンからICの内部に電流が引き込まれて流れるような回路になっているらしい。
というわけでマイコン側のパルス制御としては、
ピンクをハイ → ピンクをロー → 黄色をハイ → 黄色をロー → 橙をハイ → 橙をロー → 青をハイ → 青をロー → 以降は初めに戻って繰り返し
というふうに出力ピン電圧を変えてあげれば良さそうである。

配線コネクタの順番はちゃんと考えられていて、出力側は上記の通りの色順になっているので、入力側もシンプルに1→2→3→4→1→……の順にハイ/ローを繰り返していけば良い。
Arduinoコード
というわけで、コードを書いてみる。
基本的には上で説明した通り、出力のIOピンを順番にハイ・ローを切り替えていくだけなので、digitalWrite関数をひたすら使っていくだけの単純なコードである。ピン電圧をハイにしてコイルに電流が流れたあと、内部の磁石が回転して安定するまでは待ったほうが良いのかな?と思い、2ミリ秒待機させている。パルスの問題か磁石の応答速度の問題かはわからないが、1ミリ秒では短すぎて動かなかった。長くすると回るのだが、連続的な動き方ではなくなるのでなんかガクガクした回転になる。
今回は、ピンクの線に電流を流すための信号をマイコンのD32ピンに設定した。同様に、黄色はD33、橙はD27、青は26にした。マイコン側のD32はコントロールボードのIN2に、D33はIN3に、D27はIN4に、D26はIN1に接続する。
(※さっきの回転の説明図の色順と説明を統一させるため、変な順番となってしまった。各接続を1つずつずらして、D32をIN1に、D33をIN2に……としてもよい。)
#include <Arduino.h> #define pink 32 #define yellow 33 #define orange 27 #define blue 26 void setup() { pinMode(pink, OUTPUT); pinMode(yellow, OUTPUT); pinMode(orange, OUTPUT); pinMode(blue, OUTPUT); } int delayTime = 2; void loop() { digitalWrite(pink, HIGH); delay(delayTime); digitalWrite(pink, LOW); delay(delayTime); digitalWrite(yellow, HIGH); delay(delayTime); digitalWrite(yellow, LOW); delay(delayTime); digitalWrite(orange, HIGH); delay(delayTime); digitalWrite(orange, LOW); delay(delayTime); digitalWrite(blue, HIGH); delay(delayTime); digitalWrite(blue, LOW); delay(delayTime); }
これを書き込んで実行すると……

動いた!
上のコードのハイ・ロー切り替え順を逆にして、青→橙→黄→ピンクとなるように変更してみると……

逆回転した!
まとめ
・ユニポーラステッピングモーターは2つのコイルで内部の磁石を駆動する。
・どちらのコイルに、どの向きで電流を流すかをコントロールして、内部の磁石を90度ごとに動かす。
苦手意識のあったステッピングモーターも、なんとか使えそうだ。
次回はバイポーラステッピングモーターの使い方を学んでみる。
おわり