Arduino NANOを使ってステッピングモーターをいろいろと回転させてみました。
最終的に2台のステッピングモーターを同時に回転させてみました。
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の回路図を下記に示しますが、間違いがあるかもしれませんので、責任は負いかねます。
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.回路図(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.実験動画
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は正転しています。
そして、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は正転しています。
そして、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.実験動画