実用的なステッピングモーターのプログラム その4

10回押したら、一定ステップ回転する。
----
//StepMotor sample
//2009.6.2

//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;

//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
signed int Count=0;
signed int Dimmention=1;
int Switch_status=0;
int Switch_count=0;


void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}

void loop(){
if(digitalRead(Switch)==1){
//Debounce
delay(25);
if(Switch_status==0){
Dimmention=1;
Switch_status=1;
Switch_count=Switch_count+1;
digitalWrite(ledPin, HIGH);
}
}else{
if(Switch_status==1){
Dimmention=-1;
Switch_status=0;
digitalWrite(ledPin, LOW);
}
}

if(Switch_count>=10){
Switch_count=0;
for(Count=0; Count<96; Count=Count+1){
MoveMotor(Count);
}
}

}


void MoveMotor(int stp){
int s;
s=stp%8;

switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}

void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}

マリオの音が鳴るプログラム(おまけ)

ちょっと気分転換で。

ハンダ付けの上からスピーカーをつけるのが難しいので、Arduinoから基板を外してください。
スピーカーのピンを、10番ピンと、GNDピンに差し込んで準備完了。

----
int SpeakerPin = 10;
unsigned int i;

unsigned int j;

void setup(){
pinMode(SpeakerPin, OUTPUT);
}

void mario_1up(){
for (i=0; i<97; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(379);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(379);
}
for (i=0; i<235; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(319);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(319);
}
for (i=0; i<396; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(189);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(189);
}
for (i=0; i<315; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(238);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(238);
}
for (i=0; i<353; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(212);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(212);
}
for (i=0; i<471; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(159);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(159);
}

}

void get_coin(){
for (i=0; i<250; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(253);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(253);
}
for (i=0; i<500; i++){
digitalWrite(SpeakerPin,HIGH);
delayMicroseconds(189);
digitalWrite(SpeakerPin,LOW);
delayMicroseconds(189);
}
delay(50);

}


void loop(){

for(j=0; j<10; j++){
get_coin();
delay(50);
}

mario_1up();
delay(500);

}

実用的なステッピングモーターのプログラム その3

スイッチを押して、回転方向を切り替えます。

こちらで解説

----
//StepMotor sample
//2009.6.2

//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;

//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
signed int Count=0;
signed int Dimmention=1;
int Switch_status=0;


void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}

void loop(){
if(digitalRead(Switch)==1){
if(Switch_status==0){
Dimmention=1;
Switch_status=1;
}
}else{
if(Switch_status==1){
Dimmention=-1;
Switch_status=0;
}
}

Count=Count+Dimmention;

if(Count>96){
Count=0;
}else if(Count<0){
Count=96;
}

MoveMotor(Count);

}


void MoveMotor(int stp){
int s;
s=stp%8;

switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}

void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}

実用的なステッピングモーターのプログラム その2

スイッチを押している間、逆回転します。

こちらで解説

---

//StepMotor sample
//2009.6.2

//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;

//PotentionMeter
int Pot=5;
//Switch
int Switch=6;
int dly;
signed int Count=0;
signed int Dimmention=1;


void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);
//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}

void MoveMotor(int stp){
int s;
s=stp%8;

switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}

void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}

void loop(){
if(digitalRead(Switch)==1){
Dimmention=1;
}else{
Dimmention=-1;
}

Count=Count+Dimmention;

if(Count>96){
Count=0;
}else if(Count<0){
Count=96;
}

MoveMotor(Count);

}

実用的なステッピングモーターのプログラム その1

モーターの回転を、指定したステップ数で行うプログラムです。
こちらに解説

----
//StepMotor sample
//

//PinAssign
int ST_X1=2;
int ST_X2=4;
int ST_Y1=3;
int ST_Y2=5;
int ledPin=13;

//PotentionMeter
int Pot=5;
//Switch
int Switch=6;

int dly;
int Count=0;

void setup(){
pinMode(ST_X1, OUTPUT);
pinMode(ST_X2, OUTPUT);
pinMode(ST_Y1, OUTPUT);
pinMode(ST_Y2, OUTPUT);
pinMode(ledPin, OUTPUT);

//POT is Default AnalogInput
pinMode(Switch,INPUT);
dly = analogRead(Pot)/4;
}

void MoveMotor(int stp){
int s;
s=stp%8;

switch(s){
case 0:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 1:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 2:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 3:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 4:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 5:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 6:
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;

case 7:
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);
dly = analogRead(Pot)/4;
delay(dly);
break;
}
}

void StopMotor(){
digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);
}


void loop(){

if(digitalRead(Switch)==1){
Count=Count+1;
MoveMotor(Count);

}
else{
StopMotor();
}
}

ステッピングモーターの回転について

いままで、ステッピングモーターを回すのに、モーターの中の4つの電磁石をArduinoの4つのピンをつかって切り替えてきました。
厳密にいうと違いますが(2相の磁石を切り替えてるので個数が4つじゃない)、こんな感じでイメージしておいていいと思います。

さて、今までは、4つの電磁石のうち1つだけを磁石にして、回転させてきましたが、これだといろいろ問題が出てきてしまうので、実用的に使われてはいません。

どんな問題かというと、、

バケツリレーを思い浮かべてください。
隣の人に、水のたっぷり入ったバケツを渡すとき、自分と隣の人の2人が一瞬だけバケツを持ち合うことで、水をこぼすことなく、スムーズにリレーできます。

これが、自分と隣の人が完全に分かれて、バケツを持つのは1人だけにしてしまうと、どうなるでしょうか。
おそらく、バケツリレーは成り立つと思いますが、バケツを落としたり、重さが全部自分にかかるので、やたら疲れてしまいます。

ステッピングモーターの中でもこんなことが起きてます。

なので、通常は、2つの電磁石をオンにする瞬間も必要になります。

参考サイト


▼今までのプログラム(抜粋)
-----
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);

delay(25);

digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);

delay(25);

digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);

delay(25);

digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);

delay(25);
----

▼改良したプログラム(抜粋)
----
digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);

delay(25);

digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);

delay(25);

digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, LOW);

delay(25);

digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, HIGH);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);

delay(25);

digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, LOW);

delay(25);

digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, HIGH);
digitalWrite(ST_Y2, HIGH);

delay(25);

digitalWrite(ST_X1, LOW);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);

delay(25);

digitalWrite(ST_X1, HIGH);
digitalWrite(ST_X2, LOW);
digitalWrite(ST_Y1, LOW);
digitalWrite(ST_Y2, HIGH);

delay(25);
----