前に戻る

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
GNDM5 GND

制御信号(例)

M5StickC Plus2ULN2003
GPIO26IN1
GPIO0IN2
GPIO32IN3
GPIO25IN4

※ 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から電源を絶対に取らないことだけ注意です。