M5StickC Plus2 × ステッピングモーター 28BYJ-48
(ULN2003ドライバ使用)
1. 何をするか
- 28BYJ-48:安価でよく使われる小型ステッピングモーター
- ULN2003:モーターを直接マイコンから動かせないための電流増幅ドライバ
- M5StickC Plus2:制御信号だけを出す(電力は出さない)
2. なぜドライバ(ULN2003)が必要?
- ステッピングモーターはコイルに比較的大きな電流が必要
- ESP32(M5)のGPIOは 電流が足りない+壊れる
- ULN2003は
- GPIOの信号 →
- モーターを回せる電流に変換
する役割
👉 M5 → 頭脳、ULN2003 → 筋肉
3. 超重要な注意(必ず入れる)
モーターの電源はM5から取らない
- 28BYJ-48:5V・数百mA
- M5StickC Plus2:そんな電流は出せない
👉 ULN2003のVCCは外部5V
👉 GNDはM5と共通にする
4. 配線(最小・安全)
電源
| ULN2003 | 接続先 |
|---|---|
| VCC | 外部5V |
| GND | M5 GND |
制御信号(例)
| M5StickC Plus2 | ULN2003 |
|---|---|
| GPIO26 | IN1 |
| GPIO0 | IN2 |
| GPIO32 | IN3 |
| GPIO25 | IN4 |
※ GPIO番号は空いていれば変更可
5. モーターの基本
- 28BYJ-48は1回転=2048ステップ
- 少し動かす=ステップ数を減らす
- 例
- 512 → 約90°
- 256 → 約45°
6. サンプルコード
#include <M5Unified.h>
const int IN1 = 26;
const int IN2 = 0;
const int IN3 = 32;
const int IN4 = 25;
const uint8_t seq[8][4] = {
{1,0,0,0},
{1,1,0,0},
{0,1,0,0},
{0,1,1,0},
{0,0,1,0},
{0,0,1,1},
{0,0,0,1},
{1,0,0,1}
};
void setCoils(int a,int b,int c,int d){
digitalWrite(IN1,a);
digitalWrite(IN2,b);
digitalWrite(IN3,c);
digitalWrite(IN4,d);
}
void setup() {
M5.begin();
M5.Display.setTextSize(2);
M5.Display.setCursor(0,0);
M5.Display.println("STEP TEST");
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
for (int step = 0; step < 8*256; step++) { // そこそこ回す
int i = step % 8;
setCoils(seq[i][0], seq[i][1], seq[i][2], seq[i][3]);
delay(3); // まず遅く(速いと脱調してブルブル)
}
setCoils(0,0,0,0);
delay(1000);
}
7. よくあるハマりどころ
モーターが震えるだけ
- 回転速度が速すぎ
→setSpeed(5)くらいに下げる
全く動かない
- GND共通忘れ
- 電源がM5から取られている
熱くなる
- 静止中も通電している
→ stopMotor() を必ず呼ぶ
8. 教材的においしいポイント
- 角度をプログラムで制御できる
- DCモーターとの違いが明確
- 「電流を扱うにはドライバが必要」という重要概念
9. 一言まとめ
ステッピングモーターは
「決まった角度を正確に回せるモーター」
その代わり、電流制御のためにドライバが必須
確認
なんだかIN4を外すとうまく回った。多分何か見落としがあるとは思うのですが、一旦動いたことは動いたのでシェア。ちょっとまだ時間ある時にチェックします。M5から電源を絶対に取らないことだけ注意です。
