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

このQ&Aのポイント
  • ArduinoとXbeeを使用した無線通信において、タクトスイッチを押したり離したりすると通信が途切れてしまい、LEDが数秒から十秒程固まってしまう問題が発生しています。
  • さらに、パソコンに接続したXbeeを使用して送信する場合でも同様のラグが発生しています。
  • また、アナログ入力を使用して可変抵抗の値を送信する際にも、送信された値が数秒間表示されずに一度にまとめて表示されるという問題が発生しています。
回答を見る
  • ベストアンサー

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秒毎に表示 の繰り返しです。 検索サイトで調べましたが、同様の症状が出でいる方が居られますが解決にまで至っていませんでした。また、同じような構成でラジコンを製作している方の動画ではラグも無く、ボタンやセンサーにすばやく反応している様でしたので何か設定などがあるのかと思い試していますがうまくいきません 何か解決策はないのでしょうか? お願いします。

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

XBee は、Series 1 と Series 2 の二種類ありますが、Series 2 の方をお使いではないですか? Series 1 と Series 2で互換性はありませんので、モジュールを買い換えるしかありませんが、タイムラグの問題に関しては Series 1 にすれば改善されるかもしれません。 (Series 2は、表面に「Series 2」もしくは「S2」の刻印があり、5×2の金メッキ端子があります) http://blog.goo.ne.jp/silvernetworks/e/175aeb53f68d16dabce5c61fe0b9617f Series 1 は独自プロトコルで通信するのに対し、Series 2 は標準化された Zigbee プロトコルで通信します。 Series 2の方が、中継(メッシュネットの構築)が可能であるなど高機能なのですが、その分タイムラグが大きい感じです。

fh932gk
質問者

お礼

回答ありがとうございます。 私の持っているXbeeはSeries2でした。また、特徴など分かりやすい説明をありがとうございます。 Series1も入手できたら試してみたいと思います。

関連するQ&A

  • Arduino シリアル通信でのバイナリ受信

    詳しい方教えてください。 送信元のPCから、受信側のArduinoへ、シリアル通信によってバイナリデータを送ることで、Arduino側でのサーボモータのシリアル駆動を試みています。 PC側からのバイナリデータ送信はVB.NET側で作成済みで、USB-TTLコンバータ(FTDI Basic Breakout 5V)を使ってのサーボモータのシリアル駆動は問題ありません。 (http://micono.cocolog-nifty.com/blog/2011/04/arduino11-17d5.html と同じ処理と思ってください。) 同様な処理を、PC-Arduinoで駆動させようと思っていますが、 void loop() { int c; if (Serial.available() > 0){ c = Serial.read(); ・・・・ こちらでは、Cの値がint型の為かうまくいきません。(キャストも試しましたが・・) そもそも1バイトデータの受信Serial.read()が、int型(2バイト)なのか判りません。 方法はありますでしょうか。

  • Arduinoのアナログ入力とシリアル通信

    Arduino UNOにシールドを乗っけて電圧をアナログピンで測っているのですが, シリアルモニタに表示される値に謎のノイズ?が乗ります. でもノイズだったら+と-どっちにも触れそうなものなのに, たまに+側に揺れるだけというのもよくわかりません. 一応パスコンを挟んだり移動平均取ったりしても改善されなくて, 最終的にシリアル通信するときの値の表示がおかしいのか?ってなったのですが なにか,こういう原因じゃないのか?とか改善案とか,教えて頂きたいです. ふわっとした質問でごめんなさい. ご回答よろしくお願いします.

  • Arduino wifiについて

    http://labs.infoalive.com/tag/%E8%BB%8A のサイト内にあるネットワーク構成図のようにやりたいのですが、Xbeeではなく Wifiモジュールによる通信をする予定です。 (localnet上でJava(webブラウザ)を使いサーバからWifi→WifiモジュールからArduino操作する予定です。) どういう風に Arduino側とサーバ側をコネクトして良いのか解りません。。。(プログラム的に) よろしければ、教えてほしいです。。。

  • arduinoでのシリアル通信速度の影響

    arduinoで◯ミリ秒後に13番ピンを△ミリ秒間HIGHにする、というプログラムを組みたいと思い、できたことはできたのですが、シリアルモニターで確かめようとすると、◯ミリ秒後の設定がその影響を受けてか狂ってしまいます。 具体的には以下の様なプログラムです。 #include <MsTimer2.h> //カウント用定数 unsigned long static int i = 0; static int j = 0; //待ち時間(秒) unsigned long wtime = 252000000; //稼働時間(秒) unsigned int mtime = 900000; void func(){ i++; Serial.println(i); Serial.println(j); if(i == wtime){ digitalWrite(13,HIGH); i=0; j=1; } if(j > 0 & j < mtime){ i=0; j++; } else if(j == mtime){ digitalWrite(13,LOW); i=0; j=0; } } void setup() { pinMode(13,OUTPUT); MsTimer2::set(1,func); MsTimer2::start(); Serial.begin(9600); } void loop() { } MsTimerを使って、1ミリ秒ごとにfuncを呼び出し、カウント用変数をインクリメントして間隔を制御する、というものです。 シリアル通信をするコードを削除すれば問題ないのですが、上記のようにすると、カウントが9.6分の1の速さになってしまうようです。 これはなぜでしょうか。 なお、当方arduinoをいじるのは初めてで、C言語はほぼ素人です。 ご存知のかたいらっしゃいましたら教えて下さいませ。 よろしくお願い致します。

  • Arduinoのリモコン信号出力

    以下参考にして、Arduinoでリモコンを実現しようとしていますが送信部分がうまくいきませんので教えてください。 ・受信部は問題なく動いています ・配線は間違いないと思います ・LED LAMPS OS15LA5113A (秋月) Vf:1.35-1.6V, Typ 55mW@50mA ・LED接続抵抗:41Ω ・携帯のカメラでLED見ましたが、光っていますが0.5秒程度間隔で着いたり消えたりを繰り返します。(信号の出力には思えません…) http://www.geocities.jp/zattouka/GarageHouse/micon/InfraredCOM/InfraredCOM2.htm すみませんが、ご回答よろしくお願いいたします。

  • Arduino

    Arduinoのシリアル通信を用いてLCDに文字列を表示しようと思っています。 以下コード #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //初期設定 void setup() { //LCDの初期設定(縦横のスケール) lcd.begin(16, 2); //起動後一回のみ表示 lcd.setCursor(2, 0); lcd.print("Hello world!"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } //動作開始 void loop() { lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Voltage = "); //データを受信時のみの動作 if (Serial.available()) { delay(100); lcd.clear(); while (Serial.available() > 0) { Serial.println("LCD Received!"); lcd.setCursor(10, 1); lcd.print(Serial.available()); } } } このコードでコンパイル後モニタを開き文字列を送信すると、 例 100を送信したとき⇒”0”のみ表示   101を送信したとき⇒”1”のみ表示 のように、最後の文字しか反映されません。 どのように修正したらよいでしょうか。

  • KinectのC++でのプログラミングについて

    KinectとマイコンのArduinoを使用して、体の動きによって動くラジコンを作りたいと思っています。 動作環境はvisual c++ 2010 expressです。 シリアル通信のプログラムがわかりません。 Kinectで骨格を認識し、その位置によって1や2などの数値をArduinoに送信し、その値によって前進や後退、旋回をしたいです。 この時のシリアル通信でc++からの送信の仕方のプログラムとArduinoでの受信のプログラムを教えてください。

  • Arduino×LEDマトリクス×BA823

    秋月のLEDマトリクス(赤単色)をローム社のシフトレジスタBA823と接続し、Arduinoで制御しようと試みていますが、配線方法が分からず困っています・・・。 BA823を使用する理由は、LEDマトリクスのドット単位で明るさを制御したいからです。74HC595などでも試みたのですが、最終的に映像を出力させたいと考えており多くのLEDマトリクスを使用した際、74HC595では表示速度に難があるかと感じました。 現在は、LEDマトリクスのアノード側とカソード側に、それぞれ1台ずつBA823を接続し、データシートに従いVCC、GND、STROBE(LATCH)、SHIFT PULSE(CLOCK)、DATAをArduinoへ繋いでいますが、全く点灯しない状況です。 どなたか少しでも情報を持っている方がいましたら、是非アドバイスお願いします。 また、ドット単位で明るさが制御できるシフトレジスタの情報がある方がおられましたら、是非ご教示下さい。 よろしくお願いします。

  • C++でArduinoをコントロールしたいのですが

    VC++から数値データ(0-100)を送信し、Arduinoに接続されているファンを受信した数値でPWMコントロールしたいのですが、接続を確立したその後からプログラミングの仕方がわかりません。 どのようにしてデータを送信すればよいのでしょうか? 以下のようにして接続を行っています。 //COMポートハンドル HANDLE hComm; hComm = CreateFileA("\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); //ポートの接続確認 printf("Arduino COM") ; if (hComm == INVALID_HANDLE_VALUE) printf(":not opened\n") ; else{ DCB lpTest; GetCommState(hComm,&lpTest); lpTest.BaudRate = CBR_9600; lpTest.ByteSize = 8; lpTest.Parity = NOPARITY; lpTest.StopBits = ONESTOPBIT; SetCommState(hComm,&lpTest); printf(":OPENED\n") ; WriteFile(hComm, buf,strlen(buf),&write, NULL); } //COMポートハンドルの解放 CloseHandle(hComm); なおArduino側のプログラムは以下のものを使用しています。 //読み取り値の変数 int val=0; void setup(){ //シリアル通信開始 Serial.begin(9600); } void loop(){ //データが0個より多いときの時 if(Serial.available()>0){ //データの読み込み val=Serial.read(); //合図用データ送信(1バイト) Serial.print(65,BYTE); } //アナログ出力(11番ピン)に読み込み値を入れる analogWrite(11,val); }

  • Arduino互換機によるシリアル通信機機器制御

    Arduino互換、Japaninoでシリアル通信による蛍光表示管(VFD)モジュールの制御を行いたいのですが、どうすればいいでしょうか。 蛍光表示管(VFD)モジュールはFUTABA製のGP-1150Aという製品で、PCとはRS-232Cのシリアル通信にて制御できます。 例えば、 HyperTerminalで、あいうえおと入力すれば、VFDに「あいうえお」と表示され、 ESCを押して、[2J(消去コマンド)を入力すれば、モジュールがコマンドと認識して、画面が消去されます。 また、バイナリ形式で上記コマンドを16進に置き換えた、1B5B324Aというバイナリデータを送信しても画面を消すことが出来ます。 今、分かっていること ・VFDモジュールはPCとシリアル通信にて制御が出来る ・バイナリエディタで、コマンド+日本語データを作り、バイナリデータを送ればVFDモジュールを意のままに操作できる。 ・Japaninoと、VFDモジュールは、そのままでは通信が出来ない。 ・JapaninoとVFDモジュールの通信には、MAX232互換チップ等のレベル変換ICが必要 分からないこと ・どのようにJapaninoとMAX232を接続すればよいか ・スケッチをどのように書けば、バイナリデータを送ることが出来るのか。 ・Japanino上に設置されたボタン or 追加したボタンを押すことにより、データがVFD側に送られるようにする。 です。 アドバイス等、頂ければ幸いです。 どうぞよろしくお願いします。