こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Arduino elseで止まりifへ進まない

Nゲージ、Arduino共に初心者です。
図のようにレールは環状で列車の底にマグネット、レール上にリードスイッチを配置。スケッチは下記を試しました。

int PWMpin1 = 6; //環状レール
int PWMpin2 = 5;
void setup(){
pinMode(9,INPUT); //リードスイッチ
}
void loop() {
if(digitalRead(9)==HIGH){ //スイッチ感知
//停車
analogWrite(PWMpin1, 0);
analogWrite(PWMpin2, 0);
delay(4000);
}
else {
analogWrite(PWMpin1, 0); //右回り中速
analogWrite(PWMpin2, 100);
delay(5000); //ifが効かなくなる?

analogWrite(PWMpin1, 0); //右回り低速
analogWrite(PWMpin2, 40);
}
}

これを試すと減速されずリードスイッチでも停車せず走り続けるだけです。
スケッチの delay(5000); を消すと減速した速度で進みリードスイッチで4秒間停車はします。
スタートしてから5秒後に減速してリードスイッチで4秒停車させたいのですがどうしたら宜しいでしょうか?

減速することが目的ではなく図にはありませんがスタート5秒後にポイントAを切替、リードスイッチに着いたらポイントBを切換えたいと思ってますがその前に上記がわからず困っています。
どなたか宜しくお願いします。

投稿日時 - 2019-06-13 17:51:22

QNo.9625500

困ってます

質問者が選んだベストアンサー

エラーメッセージの言う通りです。
run = 1 にセミコロンがありません。

投稿日時 - 2019-06-14 21:03:48

お礼

何度も申し訳ありません。
思い通りに走りセンサーのところで停止できました。
このあとポイント切替とかで解らなくなったらまたお願いいたします。
今回は本当にご丁寧に有難うございました。

投稿日時 - 2019-06-14 21:56:35

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

No.2 補足 コンパイルのみ確認

int PWMpin1 = 6; //環状レール
int PWMpin2 = 5;
void pwm_out( unsigned char dat1 , unsigned char dat2 ){
analogWrite(PWMpin1, dat1 );
analogWrite(PWMpin2, dat2 );
}
#define train_stop() pwm_out( 0 , 0 )
#define train_right40() pwm_out( 0 , 40 )
#define train_right100() pwm_out( 0 , 100 )
char delay_3( unsigned long dat ){
unsigned long mi = millis();
while( ( millis() - mi ) < dat ){
if ( digitalRead(9) == HIGH ){ train_stop(); return 1; } // delay強制終了 列車停止
} // while
return 0; // delay正常終了
}
void setup() {
pinMode(9,INPUT); //リードスイッチ
}
void loop() {
train_right100();
if ( delay_3(5000) == 0 ){
// point A set
train_right40();
while( digitalRead(9) != HIGH ); // リードスイッチ検出まで前進
train_stop();
} // if
// point B set
delay(4000); // 4秒停止
}

投稿日時 - 2019-06-14 21:52:33

お礼

コピペで思うように動いてます。
見るからに難しそうなスケッチですが
// point A set
// point B set
のところを弄ると良いのですね。ここまで教えていただき有難うございます。じっくり勉強させていただきます。

お二人から回答をいただきましたが、私の理解力ではどちらがベストアンサーか判断できませんので先に教えていただいた方に決めさせていただきます。申し訳ありません。

投稿日時 - 2019-06-14 22:59:20

ANo.4

あ~書き方からですか。
補足としてざっくりなテンプレいれますね。
さっきの説明と少し変えて、走行中かそうで無いかの情報にします。申し訳無い。

int run;

setup(){
run = 0;
}

loop(){
if(run == 0){
// 停止中なので走り出す
run = 1
PWM = 100
delay5000
PWM = 40
}

else{
// 走行中
if(リードスイッチ == ON){
// 停止
run = 0
PWM = 0
delay4000
}
}

}

投稿日時 - 2019-06-14 16:28:44

補足

全くの初心者なもので毎回すみません。
以下の様に書きましたが analogWrite(PWMpin1, 0); のところで
expected ';' before 'analogWrite' というエラーになりました。


int PWMpin1 = 6; //環状レール
int PWMpin2 = 5;
int run;
void setup(){
pinMode(9,INPUT); //リードスイッチ
run = 0;
}
void loop() {
if(run == 0){ // 停止中なので走り出す
run = 1
analogWrite(PWMpin1, 0);
analogWrite(PWMpin2, 100);
delay(5000);
analogWrite(PWMpin1, 0);
analogWrite(PWMpin2, 40);
}
else {
if(digitalRead(9)==HIGH){
//停車
analogWrite(PWMpin1, 0);
analogWrite(PWMpin2, 0);
delay(4000);
}
}
}

投稿日時 - 2019-06-14 20:16:49

ANo.3

もうやったという情報を残す変数を用意する。
int yatta;

setupでまだやってないの意味の0を入れておく。
yatta = 0;

PWMを100にする前にyattaが0か確認するif文を追加。
0でなければPWMを100にもdelay(5000)もしない。
0ならば実行してyattaにもうやったの意味の1を入れる。

停車したらyattaを0に戻す。

これなら停車しない限り1回しかしないでしょう?

投稿日時 - 2019-06-13 23:07:04

補足

再度のご回答ありがとうございます。
スケッチの基本がわからずなので
時間がかかるかもしれませんが挑戦します。
理解ができたら御礼のコメントさせていただきます。

投稿日時 - 2019-06-14 14:36:53

ANo.2

delay(5000); 時間待ち中にリードスイッチを過ぎているのだと思います

void delay_2( unsigned long dat ){
unsigned long mi = millis();
while( ( millis() - mi ) < dat ){
if ( digitalRead(9) == HIGH ){ break; } // delay強制終了
} // while
}

に置き換えてみて下さい。

投稿日時 - 2019-06-13 21:15:45

補足

ご回答ありがとうございます。
エラーが出てしまうので置き換える場所が理解できていません。

投稿日時 - 2019-06-14 14:35:43

ANo.1

(1)スタート
(2)リードスイッチ感知なしなのでPWM100
(3)5秒待つ
(4)PWM40
(5)スタートに戻る

一瞬だけ40にしてるんですよ。
でも本当に一瞬だけでループして(2)でまた100にして5秒待つ。
見た目には常に中速です。
そしてリードスイッチを見るチャンスは5秒に一度だけです。delay中は眠ってるのと同じですから。

一度5秒間の100をやっちゃったなら、もう済んだという情報を残すのです。
そしてループして戻ってきたら「すでに終えてるから40のままにしておこう」という判断をしなくちゃなりません。

投稿日時 - 2019-06-13 20:39:17

補足

早速の回答ありがとうございます。
考え方は解りましたがどの様にしたら良いのでしょうか。

投稿日時 - 2019-06-13 21:31:58

あなたにオススメの質問