技術的な問題がいくつかあります... 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
をほとんど変更していません。この方法では、ネットワークからメソッドにデータを渡します。これはテスト済みで、正常に動作するはずです。processInput
processInput
FirmataSerial
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...
応答がありません。なぜそれが起こるのでしょうか?ノードはすべてのメッセージを正しく受信し、ピン状態を処理するためのコードが存在します。