今夜のスラニュー実験室では、ステッピングモーターを使ってアナログメーター的なものを作ってみます。

いつものM5StickCではなく、今回はESPr32 Developerを使っていますが特に理由はなく、気まぐれです。基本的にはM5StickCでも同じように動作するはずです。
用意したもの
- 28BYJ-48 ステッピングモーター
- ULN2003ステッピングモータードライバーユニット
- ESPr® Developer 32 開発ボード
- ブレッドボードとワイヤー類
- MB102 電源ユニットとACアダプタ
- 3Dプリンタで出力したメーターのフレーム
まずは配線しましょう

ESPr32とULN2003の間の接続
- IN1 – IO13
- IN2 – IO12
- IN3 – IO14
- IN4 – IO15
ESPr32側のポートは他の場所でも大丈夫ですが、一部使えないポート(6〜11・34・35)があるので注意が必要です。詳しくはこちらのサイトに掲載されています。
ULN2003への給電
また、ステッピングモーターの駆動にはある程度の電流値が必要なので、開発ボードからではなく、5V電源から給電します。上記の配線例ではMB102 電源ユニットから、ULN2003に別途直接5V給電しています。
メーターらしきものを作ってみよう

このメーターのフレームやニードルは、Ender-3 Pro 3Dプリンターで作成しました。元データはThingiverseからダウンロードさせていただきました。

文字盤はまだ作っていませんが、とりあえずCDラベル用のシールを丸く切り抜いて貼り付けてあります。
プログラムを書いてみよう
まずはULN2003ボード用のライブラリをインストールします。

Arduino IDEの、スケッチ – ライブラリをインクルード – ライブラリを管理 から、「CheapStepper」をインストールします。ULN2003用のライブラリは他にもありますが、アップデートされていそうなものを選択しました。
#include <CheapStepper.h>
CheapStepper stepper(13,15,12,14); // IN1,IN2,IN3,IN4 ①
boolean clockwise = true;
void setup() {
stepper.setRpm(10); //②
}
void loop() {
// モーターの全Steps = 4096
clockwise = true; //③
stepper.moveTo (clockwise, 0); //④
delay(1000);
stepper.moveDegrees (clockwise, 360); //⑤
delay(1000);
stepper.moveDegrees (clockwise, 90); //⑥
delay(1000);
stepper.moveDegrees (clockwise, 90);
delay(1000);
stepper.moveDegrees (clockwise, 90);
delay(1000);
stepper.moveDegrees (clockwise, 90);
delay(3000);
}
① 開発ボードのIOを指定します
配線した通りに、IN1,IN2,IN3,IN4の順番でコンストラクタに引数を渡します。
② モーターの動作速度を指定します
CheapStepperのチュートリアルには以下のように書かれています。
Note: CheapStepper library assumes you are powering your 28BYJ-48 stepper.using an external 5V power supply (>100mA) for RPM calculations.don’t try to power the stepper directly from the Arduino.accepted RPM range: 6RPM (may overheat) – 24RPM (may skip).ideal range: 10RPM (safe, high torque) – 22RPM (fast, low torque)
これによると
- 5V電源は100mA以上必要だから、開発ボードからはとらないで
- RPMの範囲は6RPM(過熱するかも)-24RPM(動作が飛ぶかも)
- 普通は10RPM(無難・トルクあり)-22RPM(速いけどトルクなし)
ということなので、無難に10RPMを指定しています。
③ 回転方向を指定
moveDegrees()メソッドには回転方向をBOOLで渡します。Trueが時計回りです。この例では時計回り方向に回転させています。
④ まずは0ステップの位置に移動
基本的に電源を入れた状態の位置が0ステップ(このモータードライバーは全部で4096ステップなので、0-4096のポジションがある)のはずですが、一応0ステップに動かしています。
⑤ 360°針を回転
まずは360°ぐるっと時計回りに針を回転させてみます。
⑥ 90°ずつ回転
1,000msecのインターバルをはさんで、次は90°ずつ4回動かします。
さあ、動かしてみよう。
このように動作しました。ちゃんとプログラムした通りの動作が確認できると思います。
今回できなかったこと
ステッピングモーターの原理を勉強しながら組んでみましたが、ステッピングモーターというのは、サーボと違って絶対的な開始位置をもっていないということがわかりました。
つまり、メーターのゼロ位置が合わせられないということです。これは、例えばセンサーを使って位置合わせをする方法があるようなので、次回は実用的なメーターの制作を目指して、そのあたりトライしてみようと思います。
この記事へのコメントはありません。