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

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

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を切換えたいと思ってますがその前に上記がわからず困っています。 どなたか宜しくお願いします。

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

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

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

ainame60
質問者

お礼

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

その他の回答 (5)

  • koujikuu
  • ベストアンサー率43% (428/992)
回答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
  • ベストアンサー率46% (27/58)
回答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
  • ベストアンサー率46% (27/58)
回答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% (428/992)
回答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
  • ベストアンサー率46% (27/58)
回答No.1

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

ainame60
質問者

補足

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

関連するQ&A

  • arduinoで7セグメントを使いたい

    arduinoで下記のスケッチを使って7セグメントledを動かしているのですが、 /////////////////////////////////////////////////////////////////////////////////////////////////////// //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } /////////////////////////////////////////////////////////////////////////////////////////////////////// (1)この部分がどのような動作をしているのかわかりません。 (2)また、arduinoMEGAを使用して22~29番ピンを出力にして動かそうとしても上手くいきません。 (1)についての説明と(2)の解決法を知りたいです。 よろしくお願いしますm(._.)m ↓使っているスケッチ(1~8番ピンが出力のもので上手く動作します) void setup(){ //1~8番ピン デジタル出力へセット for (int i=1; i<=8; i++){ pinMode(i,OUTPUT); } } //LEDレイアウトを定義 //0,1,2,3,4,5,6,7,8,9,0,. の順。 boolean Num_Array[11][8]={ {0,0,0,1,0,0,0,1},{1,1,0,1,0,1,1,1},{0,0,1,1,0,0,1,0},{1,0,0,1,0,0,1,0}, {1,1,0,1,0,1,0,0},{1,0,0,1,1,0,0,0},{0,0,0,1,1,0,0,0},{1,1,0,1,0,0,0,1}, {0,0,0,1,0,0,0,0},{1,0,0,1,0,0,0,0},{1,1,1,0,1,1,1,1} }; //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } void loop(){ for(int t=0;t<=10;t++){ NumPrint(t); delay(500); } }

  • Arduino 条件式

    Arduinoでシリアルモニタを使用しています。 それで、入力した数字を条件式で判断し、真ならLEDを光らせるプログラムを作りたいのですが、入力した数字をどのようなコードで描いたらいいでしょうか? ちなみに、if (Serial.readString() <= 40) { と書いたらダメでした。 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); int RST = 3; int RstFlag = 0; int Tr = 4; int TrFlag = 0; int LED = 2; //初期設定 void setup() { pinMode(RST, INPUT); pinMode(Tr, INPUT); pinMode(LED, OUTPUT); lcd.init(); lcd.backlight(); //起動後一回のみ表示 lcd.setCursor(2, 0); lcd.print("Lab"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } void loop() { RstFlag = digitalRead(RST); TrFlag = digitalRead(Tr); lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Trigger = "); //シリアルポートにデータがあるか判断 if (Serial.available()) { delay(100); lcd.clear(); //データがある場合の動作 if (Serial.available() > 0) { //print"ln"はモニタに入力後改行するコマンド Serial.println("LCD Received!"); //Serial.readString():データを”文字列”として読み込む lcd.setCursor(10, 1); lcd.print(Serial.readString() + "s"); } } if (RstFlag == 0) { delay(100); lcd.clear(); Serial.println("LCD Clear!"); } /*if ( ○○○ <= 40) { //仮に40とする delay(100); Serial.println("Trigger Out!"); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); } */ length(readString()); }

  • Arduino LEDを任意に点灯させたい

    LEDが3個とプッシュスィッチ1個の構成で LED1とLED2が10秒毎交互に点灯し続けプッシュスィッチを押した時だけLED3が5秒間点灯するスケッチを教えて下さい。 delayを使うとLED1とLED2の動作が終わるまでLED3が点灯しません スィッチを押したら直ぐにLED3が点灯しその間もLED1とLED2は交互に点灯し続けるようにしたいのですがどなたか宜しくお願いします。

  • C言語プログラミングについて…Arduinoを用い

    C言語プログラミングについて…Arduinoを用いて、以下の文でスイッチ「RedSwitch(赤スイッチ)」が押された回数だけ後で光るというプログラミングを作りました。次にその使用した「switch case」文を「if」文、もしくは「if else」に変換して同じプログラミングを作りなさいという課題が出て、いろいろと変えてみたのですが、シリアルモニタを見るとif文を用いた時に「RedSwitch」が押された「回数」ではなく連続的に?押した「秒数」をカウントして困ってます。どうやったら改善できるのでしょうかか?ご教授お願いしたします。 void sw_check(void) { switch(SW_RedSwitch) { case 0: if ( digitalRead(2)==SW_ON ) { SW_RedSwitch=1; } break; case 1: if ( digitalRead(2)==SW_OFF ) { SW_RedSwitch=2; } break; } } void blink(void) { digitalWrite(13,LED_ON); delay(500); digitalWrite(13,LED_OFF); delay(500); } void loop() { unsigned char SW_CNT=0,SW_TIME=0,i; while( (SW_TIME<100) || (SW_CNT==0) ) { sw_check(); if ( SW_RedSwitch==2 ) { SW_RedSwitch=0; SW_CNT++; SW_TIME=0; } SW_TIME++; delay(20); } for (i=1 ; i<=SW_CNT ; i++) { blink(); } }

  • ARDUINOで5つのLEDをそれぞれ点滅させたり、フェードインさせた

    ARDUINOで5つのLEDをそれぞれ点滅させたり、フェードインさせたりしたい!! ARDUINO初心者です。5つのLEDをそれぞれ上記の様に制御したいと思っています。点滅は点灯、消灯が一定の点滅ではない効果を持たせたく、5つのLEDのうち、2つはフェードインフェードアウトで蛍のような効果にしたいと思っております。 以下、途中まで3つのLEDで試行錯誤してスケッチを構築したのですが、なかなかこれ以上、前へすすみません。 まず、このスケッチでの第一関門はプログラムの並列処理ができない、ということでした。 int ledPina = 9; int ledPinb = 10; int ledPinc = 11; void setup(){ pinMode(ledPina, OUTPUT); pinMode(ledPinb, OUTPUT); pinMode(ledPinc, OUTPUT); //LedPin a b cを出力に設定。 } void loop() { digitalWrite(ledPina, HIGH); // aのLEDをオン delay(500); //待機 digitalWrite(ledPina, LOW); //aをオフ delay(500); digitalWrite(ledPinb, HIGH); // bのLEDをオン delay(800); // 待機 digitalWrite(ledPinb, LOW); //bをオフ delay(300); digitalWrite(ledPinc, HIGH); // cのLEDをオン delay(100); // 待機 digitalWrite(ledPinc, LOW); //cをオフ delay(50); } おわかりの方、いらっしゃいましたら、お教え願えますでしょうか? よろしくお願い致します!!

  • Arduino プログラミングのエラーについて

    現在、Arduino、4桁7セグメントLED(カソードコモン)、タクトスイッチ3つで、3人クイズ対決で利用する得点加算機を作成しています。 プログラムで、下記のようなエラーが出てしまいます。 invalid types 'int[int]' for array subscript このエラーに対して、何か解決策があればご教授お願い致します。 下記にプログラムを載せます。 const int first_BUTTON = 0; //プレイヤー1の得点ボタン const int second_BUTTON = 1; //プレイヤー2の得点ボタン const int third_BUTTON = 4; //プレイヤー3の得点ボタン const int anode_a = 12; //アノードに接続するArduinoのピン const int anode_b = 8; const int anode_c = 5; const int anode_d = 3; const int anode_e = 2; const int anode_f = 11; const int anode_g = 6; const int cathode_first = 7; // カソードに接続するArduinoのピン const int cathode_second = 9; const int cathode_third = 10; int val_1= 0; int val_2= 0; int val_3= 0; int old_val_1 = 0; int old_val_2 = 0; int old_val_3 = 0; // LEDの状態(0ならオフ、1ならオン) int state_first=0; int state_second=0; int state_third=0; int w; int N; // setup() は、最初に一度だけ実行される void setup () { // ピンを出力モードに設定する pinMode(first_BUTTON, INPUT); pinMode(second_BUTTON, INPUT); pinMode(third_BUTTON, INPUT); pinMode(anode_a, OUTPUT); pinMode(anode_b, OUTPUT); pinMode(anode_c, OUTPUT); pinMode(anode_d, OUTPUT); pinMode(anode_e, OUTPUT); pinMode(anode_f, OUTPUT); pinMode(anode_g, OUTPUT); pinMode(cathode_first, OUTPUT); pinMode(cathode_second, OUTPUT); pinMode(cathode_third, OUTPUT); } //LEDレイアウトを定義 boolean Num_Array[11][7]={ {1,1,1,1,1,1,0},//0 {0,1,1,0,0,0,0},//1 {1,1,0,1,1,0,1},//2 {1,1,1,1,0,0,1},//3 {0,1,1,0,0,1,1},//4 {1,0,1,1,0,1,1},//5 {1,0,1,1,1,1,1},//6 {1,1,1,0,0,1,0},//7 {1,1,1,1,1,1,1},//8 {1,1,1,1,0,1,1},//9 {0,0,0,0,0,0,0} //space }; //LED表示関数を定義 void NumPrint (int Number){ for (int w=0; w<=6; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } boolean Led_Array[3][3]={ {1,0,0,}, //LED1 {0,1,0}, //LED2 {0,0,1} //LED3 }; void Led_Active(int Number){ for(w=0;w<=2;w++){ digitalWrite(w+11,Led_Array[Number][w]); } } // loop() は、setup ()実行後、無限に実行される void loop(){ for(int i=0;i<=2;i++){ NumPrint(N[i]) } Led_Active(i); delay(5); } val_1 = digitalRead(first_BUTTON); NumPrint(state_first); //変化があるかどうかチェック if((val_1 == HIGH) && (old_val_1 == LOW)) { state_first = (state_first+1) % 10; NumPrint(state_first); delay(300); } delay(100); old_val_1 = val_1; val_2 = digitalRead(second_BUTTON); NumPrint(state_second); //変化があるかどうかチェック if((val_2 == HIGH) && (old_val_2 == LOW)) { state_second = (state_second+1) % 10; NumPrint(state_second); delay(300); } delay(100); old_val_2 = val_2; val_3 = digitalRead(third_BUTTON); NumPrint(state_third); //変化があるかどうかチェック if((val_3 == HIGH) && (old_val_3 == LOW)) { state_third = (state_third+1) % 10; NumPrint(state_third); delay(300); } delay(100); old_val_3 = val_3; }

  • Arduinoのスケッチで「変化が有った時」に変更

    お世話になります。 このスケッチを見るとHIGHの時に記録するようになっていると考えていますが、HIGHかLOWの変化の有った時に記録したいのですが、どのように変更すれば良いか教えて下さい。 また、記録上の0000 0000 0000のようにスペースを開けて記録する場合のスケッチも教えていただけますか。 参考にしたHP http://www.mauroalfieri.it/en/elettronica/data-logging-con-arduino.html 元のスケッチのチャンネル数はアナログ4chですがこれにデジタル12chを加え合計16chにしてみました。 実機では、まだ検証していませんがソフト上ではエラーは発生していません。 その他、改善点なども有りましたら、ご教授お願い致します。 皆様、よろしくお願い致します。 // Date and time functions using a DS1307 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h" #include <SD.h> #define readButton 16 #define CS 10 RTC_DS1307 RTC; char buffer[40]; File myFile; void setup () { Serial.begin(57600); Serial.print("Initializing SD card..."); pinMode(CS, OUTPUT); pinMode(readButton, INPUT); if (!SD.begin(CS)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); Wire.begin(); RTC.begin(); RTC.sqw(1); //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop () { DateTime now = RTC.now(); sprintf(buffer, "%02d/d/%d d:%02d:%02d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), digitalRead( A1 ), digitalRead( A2 ), digitalRead( A3 ),digitalRead( A4 ), digitalRead( A5 ), digitalRead( A6 ), digitalRead( A7 ),digitalRead( A8 ), digitalRead( A9 ), digitalRead( A10 ), digitalRead( A11 ),analogRead( A0 ), analogRead( A1 ), analogRead( A2 ), analogRead( A3 )); Serial.println( buffer ); myFile = SD.open("dati.log", FILE_WRITE); if (myFile) { myFile.println(buffer); myFile.close(); } else { Serial.println("error opening dati.log"); } if ( digitalRead( readButton ) == HIGH ) { Serial.println(" "); Serial.println("Log Reading Saved ----------- "); Serial.println(" "); myFile = SD.open("dati.log"); if (myFile) { while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } delay( 5000 ); } delay(1000); }

  • Arduino のプログラムについて

    下のプログラムはArduinoで、4個のバッテリーの電圧を取得して、あるバッテリー電圧が14.5V以上だったら、充電を停止し、14.5Vよりも低いバッテリーには充電をするようにしたいのです。例えば、4個のバッテリーの取得電圧が下の図の様な状況の時、それぞれのバッテリーに充電、充電停止を行いたいのです。 AnalogPin 0 → 14.8V → digitalPin 10 を充電停止(LOWにする) AnalogPin 1 → 12.8V → digitalPin 11 を充電(HIGHにする) AnalogPin 2 → 13.7V → digitalPin 12 を充電(HIGHにする) AnalogPin 3 → 13.0V → digitalPin 13 を充電(HIGHにする) 質問:下のプログラムでArduinoに書き込んで動作させてみると、バッテリーの電圧は読み取っているのですが、digitalPin10~13のHIGH、LOWがうまくいきません。良い方法を教えてください。 void setup() { Serial.begin(9600); pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); } void loop() { float battery_v[4];            for(int i=0;i<4;i++){ float convert_v=analogRead(i)*5./1024; battery_v[i]=convert_v/30*130; delay(100); Serial.print(i); Serial.print(" is "); Serial.println(battery_v[i]); delay(100); for(int r=9;r<14;r++){  // ここから下の命令がうまく動作しません。 if(battery_v[i]>14.5){ // digitalPin は10~13です。 digitalWrite(r,LOW); // すべてのdigitalWriteが }else { // LOWのままか、HIGHのままになってしまいます。 digitalWrite(r,HIGH); // } }   } delay(1000); } 以上、宜しくお願い致します。

  • 機器のI/OをArduinoでSDに記録したい

    皆様、お世話になります。 Arduinoでデーターロガーのスケッチを作成しています。 スケッチしてみましたが動くかどうか確認とこう直した方が良いなど改善点が有れば、お願い致します。 2番ピンに変化が有った時(ONかOFF)に時間と2番ピンの状態をSDカードに記録したいのです。 これが、うまくいけば系統を増やしていきたいです。 書いたスケッチ #include <SD.h> // この値は使用しているシールドや基板に合わせて変更すること。たとえば、 // イーサーネットシールドは 4 // Adafruit のSDシールドは 10 // Sparkfun のSDシールドは 8 const int chipSelect = 4; void setup() { // シリアルポート初期化 Serial.begin(9600); while (!Serial) { ; // USBケーブルが接続されるのを待つ。この待ちループは Leonardo のみ必要。 pinMode(2,INPUT) ; //スイッチに接続ピンをデジタル入力に設定A } Serial.print(F("Initializing SD card...")); // SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要があります。 // そうしないと、SPIがスレーブモードに移行し、SDライブラリが動作しなくなります。 pinMode(SS, OUTPUT); // SDライブラリを初期化 if (!SD.begin(chipSelect)) { Serial.println(F("Card failed, or not present")); // 失敗、何もしない while(1); } Serial.println(F("ok.")); // 日付と時刻を返す関数を登録 SdFile::dateTimeCallback( &dateTime ); } void loop() { // ファイルを開く File dataFile = SD.open("datalog.txt", FILE_WRITE); // もし2番ピンに変化が有れば書き込む if (digitalRead(2)==HIGH) { int value = digitalRead(2); dataFile.println(value); dataFile.close(); // シリアルポートにも出力 Serial.println(value); } if (digitalRead(2)==LOW) { int value = digitalRead(2); dataFile.println(value); dataFile.close(); // シリアルポートにも出力 Serial.println(value); } // ファイルが開けなかったらエラーを出力 else { Serial.println(F("error opening datalog.txt")); } } void dateTime(uint16_t* date, uint16_t* time) { uint16_t year = 2014; uint8_t month = 7, day = 22, hour = 14, minute = 0, second = 0; // GPSやRTCから日付と時間を取得 // FAT_DATEマクロでフィールドを埋めて日付を返す *date = FAT_DATE(year, month, day); // FAT_TIMEマクロでフィールドを埋めて時間を返す *time = FAT_TIME(hour, minute, second); } よろしくお願い致します。

  • ArduinoとXbee、通信によるラグ、遅延

    ArduinoとXbeeによる無線通信を利用して複数の散水ポンプを遠隔操作でON/OFFしようとしていますがラグ(遅延時間)が生じて困っています。 構成としてArduinoとXbee間でシリアル通信を行い、それを二つ使って無線通信をしています。 ([Arduino←シリアル通信→Xbee]←無線通信→[Xbee←シリアル通信→Arduino]) 使用機器等 AVRマイコンはATmega168Pを使用し、互換性のある回路で動作させています。 XbeeRFモジュールはProではありません。 現状として思い通りに通信できているのは 送信側:シリアル通信で「h」,「j」を3秒経つ毎に繰り返し送信 受信側:「h」の時赤色LED出力、「j」の時黄色LED出力 この時はLEDが交互にラグもなく光ってくれます。 しかし、 送信側:デジタル入力でタクトスイッチのON/OFFを検出し、タクトスイッチを押した時にシリアル通信で「h」を、それ以外の場合(押していない時)は「j」を送信 受信側:「h」の時赤色LED出力、「j」の時黄色LED出力(変更なし) とした時、タクトスイッチを押したり離したりしてLEDで確認をするのですが、3回程押すと通信が途切れてしまうのかLEDが光っていたなら光ったまま数秒から十秒程固まってしまいます。 上記の送信側スケッチ例(プログラム) int button = 13; void setup() { Serial.begin(9600); pinMode(button, INPUT); } void loop() { if (digitalRead(button) == HIGH) { Serial.print('h'); } else { Serial.print('j'); } delay(1000); } 規則的な値を送信し、受信できているといった症状から問題は送信側のスケッチ(プログラム)だと思い、ダメもとでif else文ではなくswitch case文で書きましたが症状は変わりませんでした。 反応速度を上げて使用したいと考えておりdelay(100)等にするとラグが大きくなりました。 また、Xbeeの送信側をパソコンに繋ぎ 送信側:パソコンにXbeeを接続してXbeeの設定ソフトX-CTUのterminalから 「h」,「j」を交互に適当な間隔で送信 受信側:「h」の時赤色LED出力、「j」の時黄色LED出力(変更なし) とした時も同様にラグが発生しています さらに、 送信側:[ArduinoとXbee]アナログ入力に可変抵抗を繋ぎその値をシリアル通信で1秒毎に送信 受信側:パソコンにXbeeを接続してX-CTUのterminalでシリアル通信をモニタリング とした場合 シリアル通信で送ってきた値を1秒毎に表示→数秒後に値の表示が停止→数秒後、止まっていた間の値がまとめて表示→シリアル通信で送ってきた値を1秒毎に表示 の繰り返しです。 検索サイトで調べましたが、同様の症状が出でいる方が居られますが解決にまで至っていませんでした。また、同じような構成でラジコンを製作している方の動画ではラグも無く、ボタンやセンサーにすばやく反応している様でしたので何か設定などがあるのかと思い試していますがうまくいきません 何か解決策はないのでしょうか? お願いします。