dポイントプレゼントキャンペーン実施中!

arduinoでステッピングモーターを回すスケッチを書きました。
ネットで拾ったスケッチを自分の工作用にアレンジしてみたものですが、思った通りに実行されません。
というか、途中で行き詰りました。
どのようにすれば希望通りの動きをしてくれるでしょうか?
スケッチは以下の通りです。

#include <Stepper.h>

#define MOTOR_1 (4) // blue
#define MOTOR_2 (5) // pink
#define MOTOR_3 (6) // yellow
#define MOTOR_4 (7) // orange

#define SW (3)

#define MOTOR_STEPS (2048)
#define INTERVAL 5 //最初の戻りスピード、下げれば速度は上がるが2以下だと脱調する


// ライブラリが想定している配線が異なるので2番、3番を入れ替える
Stepper myStepper(MOTOR_STEPS, MOTOR_1, MOTOR_3, MOTOR_2, MOTOR_4);

void setup() {
pinMode(0,INPUT_PULLUP); //0ピンを入力に設定し、内蔵プルアップ抵抗を有効にする
pinMode(SW, INPUT);
myStepper.setSpeed(15); //回転速度の設定
}

void loop() {


while(digitalRead(0)==LOW); { //0ピンのスイッチがOFFの間はモーターは回転 ・・・①

// 1ステップ目
digitalWrite(4,HIGH);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(7,HIGH);
delay(INTERVAL);
// 2ステップ目
digitalWrite(4,LOW);
digitalWrite(6,HIGH);
digitalWrite(5,LOW);
digitalWrite(7,HIGH);
delay(INTERVAL);
// 3ステップ目
digitalWrite(4,LOW);
digitalWrite(6,HIGH);
digitalWrite(5,HIGH);
digitalWrite(7,LOW);
delay(INTERVAL);
// 4ステップ目
digitalWrite(4,HIGH);
digitalWrite(6,LOW);
digitalWrite(5,HIGH);
digitalWrite(7,LOW);
delay(INTERVAL);
}
// 停止動作 0ピンのスイッチがONになったらモーターを停止    ・・・・・・②
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
delay(1000);

///////////////////////////////////////////////////////////////////////////

// スイッチを押して離すとモーターを45°回転させる 1ステップ=0.17578125°
while (!digitalRead(SW)) { delay(50); }  //・・・・・・③
while (digitalRead(SW)) { delay(50); }
myStepper.step(256); //・・・・・④

// 静止時の負荷が無く勿体無いので電流を止める
stopMotor();  //・・・・・・⑤

}

// モーターへの電流を止める
void stopMotor() {
digitalWrite(MOTOR_1, LOW);
digitalWrite(MOTOR_2, LOW);
digitalWrite(MOTOR_3, LOW);
digitalWrite(MOTOR_4, LOW);
}

//終わり

というものです。
希望の動作としては、まず、①のwhile文で0ピンのスイッチ入力の有無を調べます。
入力がなければモーターを回転させ再びスイッチ入力を調べます。
入力があれば②の部分を実行し、モーターを停止します。
②を実行し、モーターを停止したら次に③の2つのwhile文を実行し、SWのスイッチがONされてOFFになったら④を実行しモーターを指定の角度分回転、指定の角度分回転したら⑤で停止。
停止したら再び③に戻り、SWのスイッチ入力を待つ。

といった動作です。
(①②は一度だけ実行、その後は③④⑤をスイッチ入力で繰り返す。ということです。)

①②の部分だけ、または③④⑤の部分だけでそれぞれ別に書き込んで動作させるときちんと動いたので、後はこれをいかにして合体させるかだと思うのですが、どこを直せばよいのか分かりません。
{ }の使い方でしょうか?
詳しい方、よろしくお願いいたします。

A 回答 (3件)

>①②は一度だけ実行、その後は③④⑤をスイッチ入力で繰り返す。

ということです。

それなら③以降をfor(;;)なりwhile(1)なりで無限ループさせる。

この関数loop()を繰り返し呼び出せば①②を実行するのは当たりまえです。
    • good
    • 0

「loop」という名前の関数の中身を繰り返しているんじゃない? 「loop」って名前であることからして, そう考えるのが妥当だと思うんだけど.



で, 多分「setup」はそのループに入る前に 1回だけ実行するんじゃないか, と.

「問題が起きたときに自分で解決できるようになりたい」んだとしたら, 見よう見真似で書くだけじゃなくちゃんとした資料を読むことも必要だよ.
    • good
    • 0

えぇっと,


while(digitalRead(0)==LOW); { //0ピンのスイッチがOFFの間はモーターは回転 ・・・①
のところ, 「;」があるように見えるのは私の目が絶望的に悪いだけ?
    • good
    • 0
この回答へのお礼

ありがとうございます。「;」削除しました。
一応動いたのですが、現在のスケッチだと、⑤まで実行した後①まで戻っているようです。
これを①②③④⑤③④⑤③④⑤・・・という風に①②は一度だけ、そのあとは③④⑤を繰り返す、という風にしたいです。
よろしくお願いします。

お礼日時:2019/10/01 22:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!