ステッピングモーターを回す


 ArduinoとCNCシールド4を使ってステッピングモーターを回す。

Arduino NANO、A4988モジュール、CNCシールド4を使ってステッピングモーターを回す。


  Arduino NANOを使ってステッピングモーターをいろいろと回転させてみました。
 最終的に2台のステッピングモーターを同時に回転させてみました。


  CNCシールドV4について

 Arduino NANOとモータードライバーモジュールA4988を使用することにしました。
AliexpressでArduino NANO用CNCシールドV4(190円+送料)を購入して使用しました。

1.CNCシールドV4の写真です。

 このボードは、ステッパードライバーのMS0、MS1、MS2ピンを+ 5VではなくGNDに接続する ジャンパーのため、マイクロステッピングをサポートしていません。
 したがって、このCNCシールドV4をマイクロステッピングに使用する場合は、プリント基板の 修正が必要です。
基板の修正は、 「クローン化されたArduinoNANOCNCシールドを修正」 を参考にしてみてください。

 次の写真のArduino UNOとCNCシールドV3(Aliexpressで160円+送料)では、マイクロステッピングに 使用できます。


  今回は、ステッピングモーターを回転させるだけで、マイクロステッピングを行いませんので Gコードも使用せず、Arduino NANOとCNCシールドV4(HW-702)を使用してスケッチでプログラムしました。

2.CNCシールドV4(HW-702)の回路図
 一応、V4の回路図を下記に示しますが、間違いがあるかもしれませんので、責任は負いかねます。





  モータードライバーモジュールA4988について

1.A4988モジュールを写真のようにCNCシールドV4にそのまま差し込んで使います。

 A4988モジュール

 A4988モジュールをCNCシールドV4に差し込む


2.A4988モジュールのピン配置は次のようになっています。
(1)/ENABLE はこのピンをGNDに落とした時にこのモジュールが動作状態になります。

(2)MS1、MS2、MS3 はステッピングモーターに与える波形のパターンを決めるためのピンですが、

  CNCシールドV4では、GNDに接続されていますので、フルステップでモーターを回転させます。

(3)/RESET はピンをGNDに落とすとリセット。LOWのときトランスレータ(STEP, DIR, MS1, MS2, MS3)への
  入力をリセットします。

(4)/SLEEP はGNDに落とすとスリープモードにします。今回はこの2つを互いに接続した状態で使用します。
  V4ではこの2つを互いに接続した状態で使用します。

(5)STEP にパルスを与えることで、ステッピングモーターに1ステップ回転する信号が送られます。

(6)DIR は回転方向を決めます。HIGHかLOWにします。

(7)VDD は、Arduino側の+5Vを接続。

(8)VMOT はモーター駆動用電源+12Vを接続。モーターの駆動電流を確認してください。





  ステッピングモーターを回転させる

 使用するステッピングモーターは、SM-42BYG011-25です。これを回転させてみました。

1.使用しているステッピングモーターは、1回のステップで1.8度回転しますので、
 360 [deg] / 1.8 [deg/step] = 200 ステップで 1 回転します。
  したがって、1ステップを送るのにONが2ミリ秒とOFFが2ミリ秒とすると、計4ミリ秒必要ですので、
 1回転するのに4ミリ秒×200ステップ(=0.8秒)となります。

2.回路図(CNCシールドV4を使用)



3.スケッチプログラム

const int DIR  = 2;
const int STEP = 5;

void setup() {
  pinMode(DIR,OUTPUT);
  pinMode(STEP,OUTPUT);
}

void loop() {
  digitalWrite(DIR,HIGH);
  
  digitalWrite(STEP,HIGH);
  delay(2);
  digitalWrite(STEP,LOW);
  delay(2);
}
						

(1)CNCシールドV4ではArduinoのD5がSTEPに、D2がDIRに接続されています。

(2)setup関数内でGPIOの2番ピンと5番ピンを出力に設定、5番ピンがSTEP、2番ピンがDIR接続されています。

(3)loop関数内ではまず2番ピンをHIGHにします。これによりステッピングモーターの回転方向を決定します。

(4)次のSTEPに対してON/OFFを送ります。このときdelay関数でONを2ミリ秒、そのあとOFFを2ミリ秒の時間で 波形を生成します。

(5)このdelayで設定する時間によりステッピングモーターの回転速度が決まります。

(6)delayの時間を小さくすると回転数は増します。これらの動作を繰り返します。

4.実験動画
モーターを回転させている動画です。




  1個のプッシュスイッチでモーターの正転、逆転を行う。

 プッシュスイッチを押している間、モーターの回転が逆転するようにしました。
プッシュスイッチを離すと元の正転に戻ります。

1.回路図(CNCシールドV4を使用)
 CNCシールドV4の+X端子(Arduino NANOの9番ピン)にプッシュスイッチを接続しました。



2.スケッチプログラム

#define DIR 2
#define STEP 5
#define PBSW 9


void setup() {
  pinMode(DIR,OUTPUT);
  pinMode(STEP,OUTPUT);
  pinMode(PBSW,INPUT);
}

void loop() {
  int dirState = digitalRead(PBSW);
  digitalWrite(DIR,dirState);
  
  digitalWrite(STEP,HIGH);
  delay(2);
  digitalWrite(STEP,LOW);
  delay(2);
}					
						

3.実験動画




  2台のステッピングモーターを同時に回転させる

 delay()関数を使わないで、タイミングを制御するためにmicros()を使って、マルチタスク的に motor1とその半分の回転速度でmotor2をほぼ同時に回転させます。

1.回路図(CNCシールドV4を使用)
 使用するステッピングモーターは、SM-42BYG011-25と42SHD4002です



2.スケッチプログラム

class Motor {
  int DIRpin;
  int STEPpin;
  long updateInterval;
  int motorState;
  unsigned long previousMicros;

  public:
  Motor( int pin1, int pin2, long interval) {
    DIRpin = pin1;
    STEPpin = pin2;
    pinMode(DIRpin,OUTPUT);
    pinMode(STEPpin,OUTPUT);
    updateInterval = interval;
    
    motorState = LOW;
    previousMicros = 0;
  }
  
  void Update(){
    digitalWrite(DIRpin,HIGH);
    unsigned long currentMicros = micros();
    if((motorState == HIGH)&&(currentMicros - previousMicros >= updateInterval)) {
        motorState = LOW;
        previousMicros = currentMicros;
        digitalWrite(STEPpin,motorState);
    }
    else if((motorState == LOW)&&(currentMicros - previousMicros >= updateInterval)) {
        motorState = HIGH;
        previousMicros = currentMicros;
        digitalWrite(STEPpin,motorState);  
    }
    
  }
};

Motor motor1(2, 5, 2000);
Motor motor2(3, 6, 4000);

void setup() {
  Serial.begin(9600);  //確認するときに使用
}

void loop() {
  motor1.Update();
  motor2.Update();
}					
						

3.実験動画




  motor1はずっと正転、motor2は、1個のプッシュスイッチで正転・逆転をさせる。

 motor1はずっと正転し、その半分の回転速度でmotor2は正転しています。
そして、motor2は、1個のプッシュスイッチを押している間は逆転し、離すと元の正転に戻ります。

1.回路図(CNCシールドV4を使用)
 CNCシールドV4の+Y端子(Arduino NANOの10番ピン)にプッシュスイッチを接続しました。



2.スケッチプログラム

class Motor {
  int DIRpin;
  int STEPpin;
  long updateInterval;
  int motorState;
  unsigned long previousMicros;

  public:
  Motor( int pin1, int pin2, long interval) {
    DIRpin = pin1;
    STEPpin = pin2;
    pinMode(DIRpin,OUTPUT);
    pinMode(STEPpin,OUTPUT);
    updateInterval = interval;
    
    motorState = LOW;
    previousMicros = 0;
  }
  
  void Update(int dirState){
    digitalWrite(DIRpin,dirState);
    unsigned long currentMicros = micros();
    if((motorState == HIGH)&&(currentMicros - previousMicros >= updateInterval)) {
        motorState = LOW;
        previousMicros = currentMicros;
        digitalWrite(STEPpin,motorState);
    }
    else if((motorState == LOW)&&(currentMicros - previousMicros >= updateInterval)) {
        motorState = HIGH;
        previousMicros = currentMicros;
        digitalWrite(STEPpin,motorState);  
    }
    
  }
};

Motor motor1(2, 5, 2000);
Motor motor2(3, 6, 4000);

int PSW1 = 1;

void setup() {
  pinMode(10,INPUT);
  Serial.begin(9600);  //確認するときに使用
}

void loop() {
  motor1.Update(PSW1);
  int PSW2 = digitalRead(10);
  motor2.Update(PSW2);
  
}					
						

3.実験動画




  motor1はずっと正転、motor2は、2個のプッシュスイッチで正転・逆転をさせる。

 motor1はずっと正転し、その半分の回転速度でmotor2は正転しています。
そして、motor2は、プッシュスイッチR_SWを押すと逆転します。スイッチを押してすぐに離しても逆転したままです。 (自己保存をプログラムに施してあります。)
 次に、もう1つのプッシュスイッチF_SWを押すとmotor2は、正転に戻ります。この場合も押してすぐに離しても
正転したままです。(スイッチのチャタリング防止は施していません)

1.回路図(CNCシールドV4を使用)
 CNCシールドV4の+Y端子(Arduino NANOの10番ピン)にプッシュスイッチR_SWを接続し、
+Z端子(Arduino NANOの11番ピン)にプッシュスイッチF_SWを接続しました。


2.スケッチプログラム

	
class Motor {
  int DIRpin;
  int STEPpin;
  long updateInterval;
  int motorState;
  unsigned long previousMillis;

  public:
  Motor( int pin1, int pin2, long interval) {
    DIRpin = pin1;
    STEPpin = pin2;
    pinMode(DIRpin,OUTPUT);
    pinMode(STEPpin,OUTPUT);
    updateInterval = interval;
    
    motorState = LOW;
    previousMillis = 0;
  }
  
  void Update(int dirState){
    digitalWrite(DIRpin,dirState);
    unsigned long currentMillis = micros();
    if((motorState == HIGH)&&(currentMillis - previousMillis >= updateInterval)) {
        motorState = LOW;
        previousMillis = currentMillis;
        digitalWrite(STEPpin,motorState);
    }
    else if((motorState == LOW)&&(currentMillis - previousMillis >= updateInterval)) {
        motorState = HIGH;
        previousMillis = currentMillis;
        digitalWrite(STEPpin,motorState);  
    }
    
  }
};

Motor motor1(2, 5, 2000);
Motor motor2(3, 6, 4000);

int R_val;
int F_val;
int state = 0;

void setup() {
  pinMode(10,INPUT);
  pinMode(11,INPUT);
  Serial.begin(9600);  
}

void loop() {
  motor1.Update(1);
  R_val = digitalRead(10);
  F_val = digitalRead(11);
  if((R_val == 0)&&(state == 0)){
    state = 1 - state;
  }
  if((F_val == 0)&&(state == 1)){
    state = 1 - state;
  }
  if(state == 1){
    motor2.Update(0);
  }else{
    motor2.Update(1);  
  }
}
						

3.実験動画