ボード間の通信を可能にするために、シリアルピンを介して複数のArduinoメガボードを接続しようとしています。任意の数の arduino をデイジー チャンニングして接続できるようにしたいのですが、1 つのボードをマスターにして、他のボードの動作を制御したいと考えています。マスターは、ボードによって動的に決定される必要があります。デイジーチェーン方式ではパケットの転送により通信に遅延が生じることは承知していますが、今のところ最大で4枚のボードを接続する予定です。将来的には、これはおそらく 10 ボードに増える可能性があります。私のボードはすべて、独自の電源を持つ他のハードウェアに接続されているため、個別の電源を持っています。
私のアイデアは、ボードの配線によってマスターが決定されるような方法でボードを接続することでした。「Serial」ポートを「To-Master」シリアルポートとして、「Serial1」ポートを「To-Child」シリアルポートとして持つことを考えました。ボードは「To-Master」シリアル ポートで hello メッセージを送信し、「To-Child」シリアル ポートでそのようなメッセージを受信した場合、マスターは応答します。数秒経っても応答がない場合、ボードはそれ自体がマスターであると判断します。
グランド ピンを接続してボードを配線し、マスターの RX1 を子の TX0 に、マスターの TX1 を子の RX0 に配線します。
ボードはお互いを検出し、hello メッセージと返信を交換するため、基本的に私のセットアップは機能しています。ただし、除去したい大量のパケット損失または破損があります。
パケット検証の簡単な方法として、各パケットを「マジック ナンバー」で始めます。受信ボードはこのバイトを探し、このバイトを受信した後にのみパケットを読み取ろうとします。受信したその他のバイトは単に破棄されます。
お分かりのように、どちらかのシリアル ポートでマジック ナンバーで始まらないものを受信したために破棄されることがよくあります。ただし、これらのイベントのタイムスタンプは、他のボードの送信のタイムスタンプと一致しています。これは、パケットが少なくとも部分的に送信されたものの、何らかの理由でマジック バイトが破損または破棄されたことを意味します。
これは arduinos シリアル ポートの既知の問題ですか?
それは私の配線に関連していますか?
パケットの保存配信を確実にするために講じることができる手段はありますか?
ボードが正しい時間に信号を読み取らないことが問題なのでしょうか (私は 9600 のボーレートを使用しました)?
I2C 通信も調べましたが、このタイプの通信のマスターを動的に選択できるかどうかのリソースや情報は見つかりませんでした。また、ドキュメントには、すべてのデバイスが共通の電源を共有することが重要であると記載されていますが、これは私のシナリオでは不可能です。ただし、他のすべてのボードにコマンドを送信するマスターがあるため、この I2C の基本的なマスター/スレーブ原理は私の要件に準拠しています。私の場合、I2C を利用できますか?
ご感想ありがとうございます!