質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

XBee

XBeeは、Digiインターナショナル社が提供するZigBee規格対応の通信モジュール。IoTプロトタイプの無線化などに用いられます。PCの専用ソフトウェアから全てのモジュールの設定ができるため、比較的簡単に使用することが可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

4回答

4249閲覧

Arduinoで無線UART通信の遅延

PHENIXa

総合スコア47

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

XBee

XBeeは、Digiインターナショナル社が提供するZigBee規格対応の通信モジュール。IoTプロトタイプの無線化などに用いられます。PCの専用ソフトウェアから全てのモジュールの設定ができるため、比較的簡単に使用することが可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

1クリップ

投稿2020/04/18 14:20

編集2020/05/05 16:16

前提・実現したいこと

Arduino2台使用してXBeeを使用して無線のUART通信をしようとしてます

発生している問題・エラーメッセージ

有線UART通信の時はうまくいきますが無線UART(XBee経由)にすると通信に10ms〜15ms程度の遅延が発生してしまっていてうまく通信できない時があります。

動作はLチカプログラムが同じタイミングで受信側のLEDが点灯・消灯するというプログラムですが、点灯状態 or 消灯状態 or 時々点灯消灯
になってしまいます

リセットボタンも効きにくいです。(RX,TXピンの接続をはずすと直ります。

参考にしたプログラムは以下のサイトから引用しています。
https://shizenkarasuzon.hatenablog.com/entry/2018/09/23/145928
(回路図の赤色の配線がGNDに接続されていますが、3.3V電源端子に接続しています)

該当のソースコード

int LED = 13; int count = 0; void setup(){ Serial.begin(9600); pinMode(LED, OUTPUT); } void loop(){ count++; Serial.write(count); if((count % 2) == 1){ digitalWrite(LED, HIGH); }else{ digitalWrite(LED, LOW); } delay(1000); }
int LED = 13; void setup(){ Serial.begin(9600); pinMode(LED, OUTPUT); } void loop(){ while(Serial.available()){ byte inChar = (byte)Serial.read(); if((inChar % 2) == 1){ digitalWrite(LED, HIGH); }else{ digitalWrite(LED, LOW); } delay(10); } }

試したこと

ボー・レートをいくつか変更してみました

おそらく原因としては送信側のUARTのタイミングと受信側のUARTのタイミングが合わずにデータが正常に受信されていないのではないかと考えます。

補足情報(FW/ツールのバージョンなど)

UARTで絶対通信しないといけない訳ではないので、他に方法があれば教えていただきたいです。
ドローン・ルンバ系の類のものなので...

ダイオードクリップ方式を用いた受信側のTX波形
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/04/18 23:01

arduinoは何を使っていますか
PHENIXa

2020/04/19 21:20

Arduino unoです
ozwk

2020/04/19 22:31

XBeeは?
SHOMI

2020/05/05 10:11

遅延については、Zigbeeの通信はヘッダが付くので、通信効率が上がるよう一定量送信データがたまるか、ある程度間隔があいたところでまとめて送っているのだろうと思われます。
SHOMI

2020/05/05 10:31

どのArduinoを使用されているのかわかりませんが、信号線を誤ってDTRに接続しているということはありませんか?そうならリセットがかかってしまうので動作がおかしい状況を説明できそうですが…
PHENIXa

2020/05/05 10:35

XBee9番pinには何も接続されていません。 なので、リセットがかかっているということはないと思います。
SHOMI

2020/05/05 10:36

Arduino側のDTRです
PHENIXa

2020/05/05 10:40

RESETピンには何も接続されていません
ozwk

2020/05/05 10:45

arduinoとxbeeは直結ですか? 電圧レベル変換とか入れてますか?
SHOMI

2020/05/05 10:57 編集

リセットボタンが効きにくいというあたりどこか(VCCかGNDかRESET端子?)配線に問題がありそうですが…
SHOMI

2020/05/05 11:10

参考にされたサイトは配線図が間違っています(電源ラインが両方GND)が、正しく修正して接続したという事でよろしいですか?
SHOMI

2020/05/05 12:20

ozwkさんもかかれていますがXBeeは5Vトレラントではありません。TX/RXピンの電圧変換をしていますか?そのままTX/RXをつなぐと3.3Vラインに5Vがかかる危険性があります
PHENIXa

2020/05/05 15:26

確かに片方の信号が5Vな為、3.3Vに変換しましたが改善されませんでした
thkana

2020/05/05 22:01

オシロがあるのだから、時間軸を広げるか適切なトリガモードを設定して、 > 点灯状態 or 消灯状態 or 時々点灯消灯 の時に通信がどうなっているか見ると考えるべき情報が得られるんじゃないかしら? 送信側XBeeにデータが送られていない/受信側XBeeからデータが出てこない/受信側Arduinoがデータを受け取らない、の弁別は出来るはずですよね?(って前にも言ってるか。なんでやらないんだろう?)
SHOMI

2020/05/06 16:59

>おそらく原因としては送信側のUARTのタイミングと受信側のUARTのタイミングが合わずにデータが正常に受信されていないのではないかと考えます。 Serialのバッファは16バイトあるので1秒に1バイト送信のこのプログラムでタイミングが原因であふれることはまずあり得ません。
SHOMI

2020/05/06 17:26

thkanaさんも書かれていますが、XBeeの信号波形とArduinoが実際に送受信したデータを確認すべきでは?
PHENIXa

2020/05/07 01:05

ではArduino同士で「HelloWorld」と言う文字列を送信して受信側のシリアルモニタでデータが受信できてるか確認するべきなのでしょうか?
ozwk

2020/05/07 02:57

arduino側のHレベル入力電圧が3.0Vです。(Vcc=5V時) XBeeのHレベル出力電圧が2.6V~3.3Vです。 場合によっては正常に認識しません。
guest

回答4

0

ベストアンサー

送信側のUARTのタイミングと受信側のUARTのタイミング

どういうタイミングが存在すると考えていますか?

0ms〜15ms程度の遅延が発生してしまっていて

うまく通信できない時があります

は因果関係があるのでしょうか。

とりあえず、受信側のXbee TX/Arduino RXの電圧は十分に振れているのか、というのが気になります。


オシロがあるのなら、送信側TX/受信側RX/受信側LEDぐらいを観察してみて、ちゃんと通信が出来ているのかとか確認してみたら何らかの情報が得られるのでは?
サンプルは上からTX/RX/LED。5Vデバイス同士の有線接続なので、TX/RXは実は同じ線だけれど、送信して、受信して、LEDが変わったのか、という確認は出来るでしょう?
オシロ画面サンプル


とりあえずギブアップ...かな。
対症療法として、送信側をしつこく送るように

Arduino

1int LED = 13; 2unsigned long count = 0;//途中計算の値が大きくなりがちなのでunsigned longにしておく 3const int DLY=20;//受信側のdelayより小さくすると破綻する。そもそも受信側のdelay 必要? 4 5void setup(){ 6 Serial.begin(9600); 7 pinMode(LED, OUTPUT); 8} 9 10void loop(){ 11 count++; 12 int led=(count*DLY/1000)&1; 13 Serial.write(led); 14 digitalWrite(LED,led); 15 delay(DLY); 16}

とする、なんていうのを考えてはいたのですけれど。

投稿2020/04/18 14:33

編集2020/05/07 13:47
thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PHENIXa

2020/04/18 14:41

3.3V±3%の範囲です。
thkana

2020/04/18 21:33

それは実測値ですか?
PHENIXa

2020/04/19 00:26

はいそうです
thkana

2020/04/19 00:54

それが読めるということは、オシロかロジアナの類ですね。 それがあるなら、送信したデータが、レイテンシはあるにしてもちゃんと受信されているかどうか波形レベルで確認出来ますね。どうなっているでしょうか。 ・Xbee->Arduinoの波形に異常がある ・Xbeeからの出力波形は正しく出ているがArduinoに取り込まれていない ・その他
guest

0

最終的な目標はLEDを点灯させる命令を送ることではなくSWを押した状態を送りたいのでボタンが押される度に「helloworld」という文字列を送信するプログラムを作成して動作させると、正常に「helloworld」が受信されるので一旦は良しとしようと思います。
恐らくまだ未解決の部分があると思いますが、その時は再度質問させていただきます。

投稿2020/05/07 12:45

PHENIXa

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

シリアル通信の場合は電文化けする可能性があるので、それを考慮した通信仕様に変更してみてはどうでしょうか。簡単にできそうなものだと、送信を1秒周期ではなく100ms周期とすると、約10倍は電文化けに強くなるかと思います。
電文化けしたまま取り込むとまずい様な制御を行う場合は、通信電文にチェックサムやCRCを付与して本格的に対策する必要があると思います。

投稿2020/05/05 16:31

naitou

総合スコア141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/05/06 01:18

今回の問題はデータ化けというよりはデータの欠落の匂いがしますが、いずれにしてもいくら誤り検出をしても問題は解決しないのではないでしょうか? そういうレベルで提案するなら誤り検出してACK/NAKを返すようなハンドシェイクで応答がなければ再送信、でしょうか。今回のものであれば、もっと単純に複数回送信でもいいのかも知れませんが。 ただ、今回のような非常に単純なシステムでかなりの高頻度で(頻度は明示されていませんが)問題がある場合は、その原因をしっかり見定めてそれに対策すべきで、むやみに対症療法に走るのはいかがなものか、と思います。
naitou

2020/05/07 08:43

データ化けの結果、ドロップしているのではないかとも考えました。確かにあまりにも高頻度ということであれば、別の要因の可能性が高いですし、原因追及をした方がいいですね。
guest

0

arduinoのio電圧が5vでXBeeが3.3vです。
ロジックレベル変換icなどで電圧を合わせましょう。

遅延は原因ではないとおもいます。

投稿2020/04/18 23:05

編集2020/05/05 10:36
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問