3

技術的な問題がいくつかあります... arduino に Firmata を使用しようとしていますが、シリアル インターフェイスではなく nrf24 を使用しています。nRF24 通信をテストしましたが、問題ありません。Firmata over Serial もテストしましたが、動作します。

ベースデバイスはシンプルな「シリアルリレー」。シリアルで利用可能なデータがある場合は、それを読み取り、nRF24 ネットワーク経由で送信します。ネットワークから利用可能なデータがある場合は、それを読み取り、シリアル経由で送信します。

ノードデバイスは少し複雑です。書き込みと読み取りのオーバーライドを追加したばかりのカスタム標準Firmataがあります。

ダイアグラム

loopメソッドで処理されるオーバーライド ID を次のように読み取ります。

while(Firmata.available())
    Firmata.processInput();

// Handle network data and send it to Firmata process method
while(network.available()) {
    RF24NetworkHeader header;
    uint8_t data;
    network.read(header, &data, sizeof(uint8_t));
    Serial.print(data, DEC); Serial.print(" ");
    Firmata.processInputOverride(data);
    BlinkOnBoard(50);
}

currentMillis = millis();

Firmataは、から直接データを読み取る方法processInputOverrrideをほとんど変更していません。この方法では、ネットワークからメソッドにデータを渡します。これはテスト済みで、正常に動作するはずです。processInputprocessInputFirmataSerial

Write メソッドは別の方法でオーバーロードされます。カスタム メソッドに設定でき、そのFirmata.cppカスタム メソッドを使用してデータを送信するために使用できるメソッド ポインターを追加しました。次に、各呼び出しの後にカスタム メソッド呼び出しを追加しましたFirmataSerial.write()

Firmata.h
...
size_t (*firmataSerialWriteOverride)(uint8_t);
...

void FirmataClass::printVersion(void) {
  FirmataSerial.write(REPORT_VERSION);
  FirmataSerial.write(FIRMATA_MAJOR_VERSION);
  FirmataSerial.write(FIRMATA_MINOR_VERSION);
  Firmata.firmataSerialWriteOverride(REPORT_VERSION);
  Firmata.firmataSerialWriteOverride(FIRMATA_MAJOR_VERSION);
  Firmata.firmataSerialWriteOverride(FIRMATA_MINOR_VERSION);
}

次に、オーバーライドされた書き込みメソッドを、バイトの代わりにネットワークに書き込むだけのカスタム メソッドに設定しましたSerial

size_t ssignal(uint8_t data) {
    RF24NetworkHeader header(BaseDevice);
    network.write(header, &data, sizeof(uint8_t));
}

void setup() {
...
Firmata.firmataSerialWriteOverride = ssignal;
...
}

すべてが正常に機能しているように見えますが、一部のデータが反転しているように見えるだけです。私は、sharpduino (C#) を使用して、単純なデジタル ピン トグルを実行しています。出力は次のようになります: (< は BASE から送信され、> は BASE に送信されます)

> 208 0
> 209 0
...
> 223 0
> 249
< 4 2 249 
and here communication stops...

その最後の行は反転しました。そのため、受信したバイトを反転するだけでよいとは思いません。そして、それはその最初のコマンドで機能しました。しかし、何かが起こり、通信が再び停止します。

> 208 0
> 209 0
...
> 223 0
> 249 // Report firmware version request
< 249 2 4
> 240 121 247 // 240 is sysex begin and 247 is systex end
< 240 121
< 101 0 67 0 0 1 69 0 118
< 117 0 115 0
< 0 70 0 105 0 116 0 111 0 109
< 0 97 0
< 0 109
< 116 0 97 0 247
> 240 107 247

では、ここで何が問題になるのでしょうか? フィルマータとの通信はできているようですが、何かがおかしい...

- 編集 -

私はその問題を解決しました。Serial.write()問題は、sysex コールバックで呼び出しが見られなかったことです。それが解決されたので、別の問題に遭遇しました...すべての段階が正しく通過し(推測します)、ピン状態を要求してもノードから応答がありません

...
< f0 6a 7f 7f 7f ... 7f 0 1 2 3 4 5 6 7 8 9 a b c d e f f7 // analog mapping
> f0 6d 0 f7 // sysex request pin 0 state and value
> f0 6d 1 f7 
> f0 6d 2 f7
...
> f0 6d 45 f7
// And I wait for response...

応答がありません。なぜそれが起こるのでしょうか?ノードはすべてのメッセージを正しく受信し、ピン状態を処理するためのコードが存在します。

4

0 に答える 0