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

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


購入

Amazon 等で購入できます (購入時価格: ¥190)。

Stepper クラスが標準ライブラリにあるのに使う機会があまりありませんよね。



各部詳細

制御ボードとステッピングモーターで構成されます。

ステッピングモーターは 28BYJ-48 という 5V 駆動のものです。

See Also:



スケッチ

スケッチは [ファイル | スケッチ例: Stepper] にありますが、スケッチの通りに動かそうとすると、配線をちょっと変更しなくてはなりません。モーターの電源は別途供給する必要があります。

...ところが、どのスケッチを動かしてみても想定されている動作とは思えない動きにしかなりません。例えば stepper_oneRevolution というスケッチは、時計回りに一回転してから、反時計回りに一回転するスケッチだと思うのですが、そうなりません。データシートの通り、stepsPerRevolution を 64 に変更してもダメです。どうやらこのステッピングモーターは Arduino 標準のライブラリではうまく動かないようです。

Web を彷徨っていると、BYJ48 Stepper Motor (instructables) という記事があり、結果的にそのコードで正しく動作しました。

配線も素直になりました。そしてそこのコメント欄にあった改変コードが以下になります。

/*
BYJ48 Stepper motor code
Connect :
IN1 >> D8
IN2 >> D9
IN3 >> D10
IN4 >> D11
VCC ... 5V Prefer to use external 5V Source
Gnd
written By :Mohannad Rawashdeh
https://www.instructables.com/member/Mohannad+Rawashdeh/
28/9/2013
*/

#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11

const int NBSTEPS = 4096;
const int STEPTIME = 900;
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(9600);
  Serial.println("Starting...");
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, 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();
      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(IN1 + 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;
  }
}

インデントがなくなっていて読みづらかったので、整形して転載してみました。ちなみに、ステッピングモーターを2つ同時に使うサンプルもコメ欄にあります。そしてコメ欄をさらに読んでいると、New library for 28BYJ-48 stepper motors with ULN2003APG drivers なんてものがあるのを発見!もしやと思ってライブラリマネージャで "Stepper 28BYJ" を検索してみると...\(^o^)/

コードの書き方に互換性はなさそうなので、本当に必要になった時に選べばいいですかね。


ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。

メニュー: