がじぇるねボード(GR-SAKURA-FULL)でステッピングモーター
Arduinoのライブラリ(Stepper)は気軽に使えてらくらくなのですが、モーター回転中に、別な処理をさせるのがちょっと難しいようなので、独自にポート制御するようにしました。
今回は珍しく回路図も書きました。
モータードライブするIC TA7774PGを利用しています。触れない程ではありませんが少し発熱があります。
ステッピングモーターは、秋月のSM-42BYG011を使ってみました。ブレッドボードのケーブルがゴチョゴチョしていますが、それほど面倒な配線ではありませんでした。
ステッピングモーターは、秋月のSM-42BYG011を使ってみました。ブレッドボードのケーブルがゴチョゴチョしていますが、それほど面倒な配線ではありませんでした。
モーター停止中に500mA程度消費しているので、もう少し考えた方が良いかもしれません。
モーター制御用のソースを貼っておきます。
※変数とか省略されていたりしますので、そのままではビルドできません。
※変数とか省略されていたりしますので、そのままではビルドできません。
void stepper_init(int pin_1, int pin_2, int steps)
{
{
pinMode(pin_1, OUTPUT);
pinMode(pin_2, OUTPUT);
steps_max = steps;
}pinMode(pin_2, OUTPUT);
steps_max = steps;
void stepper_setpos(int pos, int dir)
{
{
steps_target = pos % steps_max;
steps_dir = dir;
steps_turn = false;
}steps_dir = dir;
steps_turn = false;
void stepper_turn(int dir)
{
{
steps_dir = dir;
steps_turn = true;
}steps_turn = true;
void stepper_turn_stop()
{
{
steps_turn = false;
}void stepper_fore()
{
{
int work = (steps_now & 0x03);
if(work == 0){
steps_now += 1;
}if(work == 0){
digitalWrite(PIN_PC2, 1);
digitalWrite(PIN_PC3, 1);
}else if(work == 1){digitalWrite(PIN_PC3, 1);
//digitalWrite(PIN_PC2, 1);
digitalWrite(PIN_PC3, 0);
}else if(work == 2){digitalWrite(PIN_PC3, 0);
digitalWrite(PIN_PC2, 0);
//digitalWrite(PIN_PC3, 0);
}else if(work == 3){//digitalWrite(PIN_PC3, 0);
//digitalWrite(PIN_PC2, 0);
digitalWrite(PIN_PC3, 1);
}digitalWrite(PIN_PC3, 1);
steps_now += 1;
void stepper_back()
{
{
int work = (steps_now & 0x03);
if(work == 0){
steps_now -= 1;
}if(work == 0){
digitalWrite(PIN_PC2, 1);
digitalWrite(PIN_PC3, 1);
}else if(work == 1){digitalWrite(PIN_PC3, 1);
digitalWrite(PIN_PC2, 1);
//digitalWrite(PIN_PC3, 0);
}else if(work == 2){//digitalWrite(PIN_PC3, 0);
//digitalWrite(PIN_PC2, 0);
digitalWrite(PIN_PC3, 0);
}else if(work == 3){digitalWrite(PIN_PC3, 0);
digitalWrite(PIN_PC2, 0);
//digitalWrite(PIN_PC3, 1);
}//digitalWrite(PIN_PC3, 1);
steps_now -= 1;
void stepper_proc()
{
}
{
if*1
{
if(steps_dir > 0){
if(steps_now < 0){
EXIT:;{
goto EXIT;
}if(steps_dir > 0){
stepper_fore();
}else{
stepper_back();
}if(steps_now < 0){
steps_now = steps_max - 1;
}else if(steps_now >= steps_max){
steps_now = 0;
}}
*1:steps_now == steps_target) && (steps_turn != true