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.実験動画