- 最終更新日
- 記事公開日
[Arduino]Stepper.hライブラリを使わずにステッピングモーターを制御する
今回は[Stepper.h]のようなArduinoライブラリを使わずに、自力でステッピングモーターを動かすためのプログラムを紹介します。
「もっと細かくステッピングモーターの動作をカスタマイズしたい」
「違う種類の励磁方式でステッピングモーターを動かしてみたい」
という方、ぜひ参考にしてみて下さい。
目次
励磁方式の違い
- 1相励磁方式 ・・・ 消費電力が低いが、その分、トルクも小さい。高速回転には不向きで振動が発生しやすい。
- 1-2相励磁方式 ・・・ ステップ角が細かく、最も滑らかに動く。
- 2相励磁方式 ・・・ 消費電力が大きいが、その分、トルクも大きい。回転が安定しており、動きも滑らか。
回路図
使用するもの
- マイコン(Arduino Uno R3)
- モータードライバ(DRV8835)
- ステッピングモーター(ST-42BYH1004)
- スイッチ
- 抵抗(1kΩ)×2
- 外部電源(コンセント - USB ACアダプタ - 自作ケーブルで供給)
※PCとのUSB接続だけでは電流不足ですぐにモーターが停止してしまいます。PCと繋いでいるときも、必ず外部電源を用意してVINラインに接続して下さい。
プログラム
#define BIN2 8 // 青
#define BIN1 9 // 赤
#define AIN2 10 // 緑
#define AIN1 11 // 黒
// [1] 1相励磁方式 / 右回転
// [2] 1相励磁方式 / 左回転
// [3] 1-2相励磁方式 / 右回転
// [4] 1-2相励磁方式 / 左回転
// [5] 2相励磁方式 / 右回転
// [6] 2相励磁方式 / 左回転
int mode = 6;
// 停止間隔(大きくするほどスピードが遅くてトルクが大きい)
int speed = 30;
// スイッチの入力Pin
int sw_pin = 12;
// SWの状態
volatile int sw;
void sw_on(void);
void setup() {
pinMode(BIN2, OUTPUT); // デジタルピンを出力に設定
pinMode(BIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(sw_pin,INPUT);
// 立ち上がりで割り込み処理開始
attachInterrupt(1,sw_on, RISING);
}
void loop() {
// スイッチを長押し中かどうか
sw = digitalRead(sw_pin);
// スイッチがONのときのみモーターを回転
if(sw == 1) {
// 励磁方式
switch (mode) {
// 1相励磁方式(右回転)
case 1:
// STEP1
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
// STEP2
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP3
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP4
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, LOW);
delay(speed);
break;
// 1相励磁方式(左回転)
case 2:
// STEP1
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP2
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP3
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP4
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
break;
// 1-2相励磁方式(右回転)
case 3:
// STEP1
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
// STEP2
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
// STEP3
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
// STEP4
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP5
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP6
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP7
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP8
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, LOW);
delay(speed);
break;
// 1-2相励磁方式(左回転)
case 4:
// STEP1
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP2
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP3
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP4
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP5
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP6
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
// STEP7
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
// STEP8
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
break;
// 2相励磁(右回転)
case 5:
// STEP1
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
// STEP2
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
// STEP3
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP4
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
break;
// 2相励磁(左回転)
case 6:
// STEP1
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP2
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, HIGH);
digitalWrite(AIN1, LOW);
delay(speed);
// STEP3
digitalWrite(BIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
// STEP4
digitalWrite(BIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(AIN2, LOW);
digitalWrite(AIN1, HIGH);
delay(speed);
break;
}
}
}
// スイッチが押されたときの割り込み処理
void sw_on(void) {
sw = 1;
}
「mode」の値を書き換えることで、励磁方式が変更されます。
ボタンを押しっぱなしにしている間、ステッピングモーターが回転します。