Stepperライブラリでモータを動かす その2 複数個

 前回、Arduino UNOにステッピング・モータを1個つなげて、動作を確認しました。Steppingライブラリに用意されたコマンドは次の二つです。

  • 回転数の指定 setSpeed(rpms)
  • 指定したステップ数だけモータを回すstep(steps)

 前回のスケッチではstep数は200、60rpmで回転させました。ゆっくり回ります。よく見ていると、CCW(反時計回り)が正常でないです。回転数を120に増やしてみます。今度はCCWも正常です。しかし、stepを400にすると回転しません。どうも二つのパラメータは相互に関連があるうえ、単独で指定してもこのステッピング・モータに対しては正常な動作が望めないようです。

 Stepper_28BYJ_48のライブラリでは、回転速度は固定されています。step()でステップ数を512に指定すると360°回転しました。

 Arduino UNOにはディジタル入出力はあまり多くはありません。前回、ステッピング・モータを1個利用するのに、2、3、4、5番の四つのポートを利用しました。6~9番にもう一つ、10~13番にされにもう一つのステッピング・モータをつなぎます。

接続

Steppingライブラリを使って三つのモータを動かすスケッチ

 三つのモータは、それぞれ約36°回転し終わると次のモータが約36°回転するという状態を繰り返します。一度に動くモータは一つだけです。CCW方向の回転はしませんでした。

#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
Stepper myStepper0(stepsPerRevolution, 2,3,4,5);
Stepper myStepper1(stepsPerRevolution, 6,7,8,9);
Stepper myStepper2(stepsPerRevolution, 10,11,12,13);

void setup() {
myStepper0.setSpeed(60);
myStepper1.setSpeed(60);
myStepper2.setSpeed(60);
}

void loop() {
myStepper0.step(stepsPerRevolution);
myStepper1.step(stepsPerRevolution);
myStepper2.step(stepsPerRevolution);
delay(500);
myStepper0.step(-stepsPerRevolution);
myStepper1.step(-stepsPerRevolution);
myStepper2.step(-stepsPerRevolution);
delay(500);
}

Stepper_28BYJ_48ライブラリを使って三つのモータを動かすスケッチ

 三つのモータは、それぞれ360°回転し終わると次のモータが360°回転するという状態を繰り返します。一度に動くモータは一つだけです。

#include "Stepper_28BYJ_48.h"
Stepper_28BYJ_48 stepper0(5,4,3,2);
Stepper_28BYJ_48 stepper1(9,8,7,6);
Stepper_28BYJ_48 stepper2(13,12,11,10);

void setup() {
}

void loop() {
stepper0.step(512);
stepper1.step(512);
stepper2.step(512);
}

新しいライブラリUNISTEP2を利用する

  • move(int steps)ステップ量だけ移動、負のときはCCW。
  • moveTo(unsigned int pos)0~posまで絶対量を移動
  • currentPosition()現在の位置を返す
  • stop()ストップ

 三つのモータがそれぞれ同時に動きました。マニュアル;https://en.reven.org/2018/01/29/unistep2/

#include <Unistep2.h>
Unistep2 stepperX(2, 3, 4, 5, 4096, 1000);
Unistep2 stepperY(6, 7, 8, 9, 4096, 1000);
Unistep2 stepperZ(10, 11, 12, 13, 4096, 1000);

void setup(){
}

void loop(){
// We need to call run() frequently during loop()
stepperX.run();
stepperY.run();
stepperZ.run();
if ( stepperX.stepsToGo() == 0 ){ // If stepsToGo returns 0 the stepper is not moving
stepperX.move(random(-4000,4000));
}
if ( stepperY.stepsToGo() == 0 ){
stepperY.move(random(-4000,4000));
}
if ( stepperZ.stepsToGo() == 0 ){
stepperZ.move(random(-4000,4000));
}
}

前へ

Stepperライブラリでモータを動かす その1 1個だけ

次へ

マスタリングWireライブラリ その1 スタートとストップ・コンディション