ステッピングモーターをArduino等で駆動する場合、A4988やDRV8825等のモータードライバーを使う事が主流で、使い方も簡単だし中華製3DプリンターやCNCも大体A4988が使われている。
しかし、小型のステッピングモーターを動かすにはA4988は最低電圧が8V程度必要なため使い勝手が悪い。
Pololuから出ているSTSPIN220であれば、1.8~10Vと低電圧で動作するため、Arduinoの5V電源で小型のステッピングモーターを動かす事も出来る。
https://akizukidenshi.com/catalog/g/gK-14790/
使い方はA4988等と同様、AccelStepper等のライブラリが利用できる。しかし、マイクロステップの設定が少し特殊である。
STSPIN220は通電時と、スタンバイ解除時のMODE1~MODE4のピン状態がマイクロステップの設定となる。その後、MODE3/MODE4ピンはSTEP/DIRピンとして動作する。ただし、MODE1 / MODE2両方LOWに設定していると必ずフルステップ設定になる。
つまり、起動時に下記手順でマイクロステップの設定を行う事になる。
- スタンバイモードにする
- MODE1~MODE4ピンをマクロステップの設定に合わせる
- スタンバイモード解除する
後はA4988等と同じ。以下、サンプルコード。
#define PIN_MODE1 5
#define PIN_MODE2 6
#define PIN_STBY 7
#define PIN_STEP 8
#define PIN_DIR 9
#define STEP_FULL 0
#define STEP_HALF 1
#define STEP_4 2
#define STEP_8 3
#define STEP_16 4
#define STEP_32 5
#define STEP_64 6
#define STEP_128 7
#define STEP_256 8
#include <AccelStepper.h>
AccelStepper stepper(1, PIN_STEP, PIN_DIR);
int stepperspeed = 1500;
int movetopos;
char cmd;
void set_mstep_pin(int mode1, int mode2, int mode3, int mode4) {
digitalWrite(PIN_MODE1, mode1);
digitalWrite(PIN_MODE2, mode2);
digitalWrite(PIN_STEP, mode3);
digitalWrite(PIN_DIR, mode4);
}
void set_microstep(int mstep) {
//STSPIN220は通電時かstby解除時にMODE1~4の組み合わせでマイクロステップが設定される
//mode1とmode2は両方lowにしているとfull stepになってしまうので、両方lowは避ける
pinMode(PIN_MODE1, OUTPUT);
pinMode(PIN_MODE2, OUTPUT);
pinMode(PIN_STBY, OUTPUT);
pinMode(PIN_STEP, OUTPUT);
pinMode(PIN_DIR, OUTPUT);
//Standby状態にする
digitalWrite(PIN_STBY, LOW);
//microstep設定
if (mstep == STEP_FULL)
set_mstep_pin(LOW, LOW, LOW, LOW);
else if (mstep == STEP_HALF)
set_mstep_pin(HIGH, LOW, HIGH, LOW);
else if (mstep == STEP_4)
set_mstep_pin(LOW, HIGH, LOW, HIGH);
else if (mstep == STEP_8)
set_mstep_pin(HIGH, HIGH, HIGH, LOW);
else if (mstep == STEP_16)
set_mstep_pin(HIGH, HIGH, HIGH, HIGH);
else if (mstep == STEP_32)
set_mstep_pin(LOW, HIGH, LOW, LOW);
else if (mstep == STEP_64)
set_mstep_pin(HIGH, HIGH, LOW, HIGH);
else if (mstep == STEP_128)
set_mstep_pin(HIGH, LOW, LOW, LOW);
else if (mstep == STEP_256)
set_mstep_pin(HIGH, HIGH, LOW, LOW);
delay(10);
//Standby解除
digitalWrite(PIN_STBY, HIGH);
delay(10);
//後は通常動作
}
void setup() {
Serial.begin(115200);
set_microstep(STEP_4);
stepper.setMaxSpeed(2000);
stepper.setAcceleration(1000.0);
stepper.move(1);
stepper.setSpeed(stepperspeed);
Serial.println("Ready [s###]/[m###]");
}
void loop() {
if (Serial.available()) {
cmd = Serial.read();
movetopos = Serial.parseInt();
if (cmd == 's') {
stepperspeed = movetopos;
Serial.print("speed ");
Serial.println(movetopos);
} else if (cmd == 'm') {
Serial.print("move ");
Serial.println(movetopos);
stepper.move(movetopos);
stepper.setSpeed(stepperspeed);
}
}
stepper.run();
}