28BYJ-48 ステッピングモーター

中国から密輸した小さくて安いギアードステッピングモーター。
2015年に買って放置してたのを動かしてみました。


![IMG_20180630_160343.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/eb7d89b8-0ab1-4bd9-dac9-6f6f436b3b5a.jpeg)

5V駆動のユニポーラ。
4096パルスで1回転らしい。

https://ht-deko.com/arduino/stepper_motor.html
を参考に、ESP32に繋いで動かしてみました。


http://akizukidenshi.com/catalog/g/gP-13256/
最近秋月電子からも扱い始めたらしいですが、僕が買ったのは
ULN2003を使ったドライバボードとセットでした。


![IMG_20180630_164228.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/b42878b2-53ea-4701-0fa9-9cfd3151e93e.jpeg)

ULN2003はTIのトランジスタアレイ。最大50Vのものを駆動することができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/7679879f-ce79-5942-e5e8-0e224c8fc70c.png)

逆起電力防止用のダイオードが入っていて、モータやリレーのようなコイル負荷を動かすのにぴったりです。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/6f35992e-ce81-f303-58ed-0dc911e64534.png)
こんな感じに、Hi入力するとLoが出力されます。

これには、何ボルトの電圧で信号を入力しなければいけないでしょうか？

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/c7f222d8-839a-00a4-3b8b-9bacdfda5f06.png)

3Vで信号入力できそうです。
しかしながらかなりの損失がありますね。今回は、テストとしてUSBポートからの5Vで動かしますし、100円のUSBケーブル→マイコンボードの5V端子を経由して動かすので、モーターにかかる電圧は3V程度になるかと思います。

本来のパワーを発揮できないはずですが、USBポートの保護にはちょうどいい？

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/a2b7290b-35b2-49de-50d0-ec612d73fe42.png)

この図のCOMが、モータドライバ電源の＋につながります。
今回は、安直にUSBポートにつなげますが、本来は逆流防止ダイオードなどを入れないと危険が危ないです。

ESP-32ボードで動かしてみました。以下はArduino化して作ったスケッチです。

```

/* 
STM32
Stepping morter 28BYJ-48 + Driver ULN2003  
from 
https://ht-deko.com/arduino/stepper_motor.html
*/

int pin_IN[4] = {5,18,23,19};

/*
 * 
 IN1 5
 IN2 18
 IN3 23
 IN4 19
*/

const int NBSTEPS = 4096;
const int STEPTIME = 2500;
int Step = 0;
boolean Clockwise = true;

int arrayDefault[4] = {LOW, LOW, LOW, LOW};

int stepsMatrix[8][4] = {
    {LOW, LOW, LOW, HIGH},  
    {LOW, LOW, HIGH, HIGH}, 
    {LOW, LOW, HIGH, LOW},
    {LOW, HIGH, HIGH, LOW}, 
    {LOW, HIGH, LOW, LOW}, 
    {HIGH, HIGH, LOW, LOW},
    {HIGH, LOW, LOW, LOW},  
    {HIGH, LOW, LOW, HIGH},
};

unsigned long lastTime;
unsigned long time;

void setup() {
  Serial.begin(115200);
  Serial.println("Starting...");
  pinMode(pin_IN[0], OUTPUT);
  pinMode(pin_IN[1], OUTPUT);
  pinMode(pin_IN[2], OUTPUT);
  pinMode(pin_IN[3], OUTPUT);
}

void loop() {
  unsigned long currentMicros;
  int stepsLeft = NBSTEPS;
  time = 0;
  while (stepsLeft > 0) {
    currentMicros = micros();
    if (currentMicros - lastTime >= STEPTIME) {
      stepper();
      time += micros() - lastTime;
      lastTime = micros();
//      Serial.println(stepsLeft);
      stepsLeft--;
    }
  }
  Serial.println(time);
  Serial.println("Wait...!");
  delay(2000);
  Clockwise = !Clockwise;
  stepsLeft = NBSTEPS;
}

void writeStep(int outArray[4]) {
  for (int i = 0; i < 4; i++) {
    digitalWrite(pin_IN[i], outArray[i]);
  }
}

void stepper() {
  if ((Step >= 0) && (Step < 8)) {
    writeStep(stepsMatrix[Step]);
  } else {
    writeStep(arrayDefault);
  }
  setDirection();
}

void setDirection() {
  (Clockwise) ? (Step++) : (Step--);

  if (Step > 7) {
    Step = 0;
  } else if (Step < 0) {
    Step = 7;
  }
}

```
最初はSTEPTIMEが900でしたが動きませんでした。恐らく適切な電源ではないためでしょう。2500で動くようになりましたが、
やはり、かなり遅いし指で強く押さえると止まる感じです。


![IMG_20180630_175850.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/335c7129-7563-afd9-fb04-ab554ec9a0e4.jpeg)


LEDが付いているので動作の確認、学習用に便利！　STEPTIMEをもっと大きくすると励磁相が目に見えるようになって嬉しいです。




# バイポーラとして使用する

通常のユニポーラ式のステッピングモータは6線ですが、そのうちの4線だけを使うことでバイポーラとして使うことも出来ます。


ところが、この28BYJ-48は中点線同士をコモンとして結線して５線しか出ていないので、そういったゴマカシができません。

ケーブルカバーを切り開くと、中身はこんなになってました。


![IMG_20180630_160951.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/fe81b625-4f69-149e-524d-4ec77ea09935.jpeg)

パターンカットして

![IMG_20180630_161053.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/d22e7958-995f-f1e3-0349-415f1e82b489.jpeg)

赤の線を取り外しました。

![IMG_20180630_164501.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/e5e7713e-fca8-a497-5cc0-722866cfdaed.jpeg)


これで4線式のバイポーラとして使えます。