1

2台のArduinos Leonardoで通信システムをやっています。送信するには、文字列をビット単位で変換し、PWM ピンから送信する必要がありました。問題は、受信機をどうするかです。

私の考えは、デジタル ピンでデータを受信することです。そのため、LOW/HIGH を「0」と「1」に変換し、8 ビットを文字列に入れ、char に変換すると、最終的な文字列が得られます。

ヘルプ/提案をいただければ幸いです。

編集:

  • 私はビットごとに送信する FSK 変調を実装したいので、PWM を使用しています。
  • 通信システムを機能させるためのハードウェアがいくつかあります。
  • 通信用の物理チャネルはシリアル (Arduino ピン経由) です。
  • 受信機のハードウェアは TTL 信号を提供するので、0V/5V になります。だからこそ、digitalRead() が機能するはずです。
  • データは PWM 経由で送信され、2 つのレベルの信号で受信されます。
  • データを送受信するために何らかのプロトコルを実行する必要がありますが、まだ方法がわかりません..;
4

3 に答える 3

1

あなたはコミュニケーションのためのあなたの物理的なチャネルが何であるかを言いません. これは重要。Arduino の主なオプションは次のとおりです。

デジタルピンとの間でデータを読み書きすることで、独自のプロトコルを実装することもできますが、これは SPI のように見える可能性が高いです。これらのメソッドはいずれも、文字列送信する場合を除き、何かを文字列に変換する必要はありません。PWM 経由で正確にデータを送信する方法に少し戸惑っています。それは不当なハックのようです。

于 2013-03-25T20:48:33.213 に答える
1

PWM を使用することは、他のより容易に利用できる周辺機器の代わりに、デバイス間でバイナリ データを通信するための難しい方法ですが、実行可能です。基本的に PCM またはパルス コード変調。これの最も簡単な方法は、ピンがアサートされている時間の長さであり、データを表します。たとえば、サーボで何が起こるかです。PWM が既知の位置を表す同じ長さの時間を繰り返している場合、サーボの受信機はパルスの長さを位置またはデータに変換します。

PWM の受信は Arduino ユーザーにとって一般的ではありませんが、AVR micro はこれ以上の能力を備えています。このようなパルス持続時間をキャプチャする方法は 2 つあります。まず、Arduion に共通するのはPulseIn()関数です。この関数はリアルタイムではありません。パルス間のサイクルにタイムスタンプを付けるだけで、持続時間はわずか数マイクロ秒に制限されます。もっと長くなるかもしれない他のバリエーションがあると思います。これは非常にうまく機能します。ただし、シリアル機能やタイマーなどの他の割り込みに問題がある可能性があります。

もう 1 つの方法は、入力キャプチャ割り込みとして知られています。次の GISTHUB INputCapture.inoは、別のソースから回収したコードの例です。典型的ではないため、コードは Arduino ライブラリとして記述されていません。しかし、パルスの長さを非常に正確にキャプチャします。要するに、入力キャプチャ ピンのハードウェアは、トリガー時にシステム クロックにロックされ、その後、ある潜在的な時間で読み取ることができます。

于 2013-03-25T21:45:03.700 に答える
0

さて、これは私が書いたコードです:

void setup() {
  Serial.begin(9600);
  while (!Serial) {;}
}
void loop() {
  char bitPosition = 0;
  String inMessage = 0;
  while (Serial.available() > 0) {
    char outChar;
    boolean digValue = digitalRead(inPin);
    for(bitPosition = 7; bitPosition >= 0;  ){
      if(digValue == LOW){
        bitWrite(outChar, bitPosition, 0);
      }
      if(digValue == HIGH){
        bitWrite(outChar, bitPosition, 1);
      }
    bitPosition--;
    }
  inMessage.concat(outChar);
  if(inMessage != 0){
    Serial.println("Received:  " + inMessage);
  }
 }
}

これは私が期待していたものを与えていません。最初の digValue は常に 0 です。

于 2013-03-26T12:02:25.860 に答える