2

家のある部屋にあるリモコンから別の部屋にあるセットトップボックスにIRコードを中継するためにワイヤレスシステムに入れたいArduinoが2つあります。一方のArduinoにはIRデコーダーがあり、ハンドヘルドリモコンからキーをデコードし、IRエミッターを備えたボックスの前に駐車されているもう一方のArduinoに送信します。システムは、部分的には正常に動作します。検出器から(PCに)コードを取得し、手動で(PCから)送信するArduinoに送信すると、ボックスが適切に制御されます。しかし、Arduino間でコードをワイヤレスで直接送信しようとすると、正しく機能しません。コマンドが正しく中継されていないようで、放出しているArduinoはbxを制御できません。

デコードするArduinoコードは次のようになります。「myNumber」は4バイトのキーを保持します。

myNumber.UL = results->value;
Serial.write(&myNumber.B,4);

デコーダーがIRパターンを検出すると、エミッターを使用するか、リモートのオン/オフキーを押すかに関係なく、シリアルポートに次の情報を送信します。問題のキーは61A0F00F(電源オン/オフ)です。

     Hex Field      ASCII        

0000 0F F0 A0 61 ... a

実際のリモートを検出器に向けたとき、またはコード61A0F00Fでエミッターを駆動しているとき、デコーダーはこれと同じ応答を出します。したがって、実際のリモートとArduino駆動のエミッターの違いはわかりません。問題は、この出力がシステムの放射側のArduinoによって正しく理解されないことです。

放出コードは次のようになります。

  void loop() {
  int x = 0;
  while (x < 4) {
    if (Serial.available()) myNumber.B[x++] = Serial.read();
}    
Serial.print(myNumber.UL, HEX);

if (x==3) irsend.sendNEC(myNumber.UL, 32);  //drive IR emitter with NEC code
delay(10000);

そして、シリアル出力は次のようになります。

     HEX field                 ASCII Field

0000 36 31 41 30 46 30 30 46 61A0F00F

この16進コードを手動で、つまりCoolTermを介して挿入すると、セットトップボックスが(オンになって)応答します(0FF0A061)。Arduinoをワイヤレスでリンクすると、リンクしません。

上記の通信の何が問題になっているのか誰かがわかりますか?hexフィールドの数値は正しく表示されません。デコーダーからのhexフィールドはhexのように見えますが、エミッターからのhexフィールドはASCIIのように見えますか?では、エミッターはASCII番号を期待していますが、代わりに16進数を取得していますか?私はSerial.readとSerialだと思っていたでしょう。書き込みも同じように機能します。

これは非常に苛立たしいことです。システムはほぼほぼ機能しているように見えますが、完全ではありません。

任意のヘルプ/洞察をいただければ幸いです。

4

2 に答える 2

0

最初の免責事項:私は数年間arduinoをコーディングしていません。

一見すると、変換のバグに噛まれているように見えます。バイトからロングなどへの変換がたくさん見られます。ここで重要なのは、物事を最も単純なレベルに分解し、各レベルが機能することを確認することです。

まず、Serial.writeからの戻り値が実際に4であることを確認して、送信されているバイト数を確認します。Serial.writeが4を返す場合、LEDを点滅させるのと同じくらい簡単です。

受信側では、 ReadBytesUntilを使用すると思います。これは、必要な処理を実行するように設計されており、エラーチェック(タイムアウトとわずか4バイト)が組み込まれているためです。

これがお役に立てば幸いです。黄金律に従わない場合:疑わしい場合-さらにコードを投稿してください!

于 2012-05-24T18:14:03.893 に答える
0

遅い応答が役立つことを願っています。

発光端からの出力データは正しいです。あなたの場合、myNumber.UL = 0x61A0F00F です。コード「Serial.print(myNumber.UL, HEX);」を実行すると、印刷クラスは実際に文字シーケンスを '6''1''A''0''F''0''0'' として送信しました。 F'. したがって、シリアル モニターの ACII データは「61A0F00F」で、対応する HEX データは「36 31 41 30 46 30 30 46」です。テキスト形式とバイナリ形式でデータを転送することについて混乱しています。

コードの問題は、「if (x==3) irsend.sendNEC(myNumber.UL, 32);」の行にあります。4 バイトのデータを受信した後、x は 3 以外の 4 です。条件 x==3 を x==4 に変更すると、問題を解決できます。

于 2012-06-10T08:53:51.217 に答える