• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Arduino elseで止まりifへ進まない)

Arduinoでelseが効かない問題について

このQ&Aのポイント
  • NゲージとArduinoを使用している初心者ですが、ifとelseの動作に問題があります。
  • スケッチを試した結果、減速や停車がうまくできない状態になります。
  • スタート5秒後にポイントを切り替える方法についても教えていただきたいです。

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

  • ベストアンサー
  • kaba__san
  • ベストアンサー率45% (27/59)
回答No.5

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

ainame60
質問者

お礼

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

その他の回答 (5)

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.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秒停止 }

ainame60
質問者

お礼

コピペで思うように動いてます。 見るからに難しそうなスケッチですが // point A set // point B set のところを弄ると良いのですね。ここまで教えていただき有難うございます。じっくり勉強させていただきます。 お二人から回答をいただきましたが、私の理解力ではどちらがベストアンサーか判断できませんので先に教えていただいた方に決めさせていただきます。申し訳ありません。

  • kaba__san
  • ベストアンサー率45% (27/59)
回答No.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 } } }

ainame60
質問者

補足

全くの初心者なもので毎回すみません。 以下の様に書きましたが 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); } } }

  • kaba__san
  • ベストアンサー率45% (27/59)
回答No.3

もうやったという情報を残す変数を用意する。 int yatta; setupでまだやってないの意味の0を入れておく。 yatta = 0; PWMを100にする前にyattaが0か確認するif文を追加。 0でなければPWMを100にもdelay(5000)もしない。 0ならば実行してyattaにもうやったの意味の1を入れる。 停車したらyattaを0に戻す。 これなら停車しない限り1回しかしないでしょう?

ainame60
質問者

補足

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

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.2

delay(5000); 時間待ち中にリードスイッチを過ぎているのだと思います void delay_2( unsigned long dat ){ unsigned long mi = millis(); while( ( millis() - mi ) < dat ){ if ( digitalRead(9) == HIGH ){ break; } // delay強制終了 } // while } に置き換えてみて下さい。

ainame60
質問者

補足

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

  • kaba__san
  • ベストアンサー率45% (27/59)
回答No.1

(1)スタート (2)リードスイッチ感知なしなのでPWM100 (3)5秒待つ (4)PWM40 (5)スタートに戻る 一瞬だけ40にしてるんですよ。 でも本当に一瞬だけでループして(2)でまた100にして5秒待つ。 見た目には常に中速です。 そしてリードスイッチを見るチャンスは5秒に一度だけです。delay中は眠ってるのと同じですから。 一度5秒間の100をやっちゃったなら、もう済んだという情報を残すのです。 そしてループして戻ってきたら「すでに終えてるから40のままにしておこう」という判断をしなくちゃなりません。

ainame60
質問者

補足

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

関連するQ&A

専門家に質問してみよう