Program Resource

開発者向け各種コード、アルゴリズム、リソース情報ライブラリ もしくはねふぁの覚え書き

ステッピングモーターを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に設定していると必ずフルステップ設定になる。

つまり、起動時に下記手順でマイクロステップの設定を行う事になる。

  1. スタンバイモードにする
  2. MODE1~MODE4ピンをマクロステップの設定に合わせる
  3. スタンバイモード解除する

後は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();
}

Print Friendly, PDF & Email

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


*

CAPTCHA