Firmata超过nRF24

时间:2013-02-21 13:08:01

标签: c# serial-port arduino spi firmata

我遇到了一些技术问题......我正在尝试使用Firmata进行arduino但是超过nrf24,而不是使用串行接口。我已经测试了nRF24通信,它很好。我也测试过Firmata而不是Serial,它可以工作。

基础设备很简单“串行继电器”。如果Serial上有数据,请阅读并通过nRF24 network发送。如果有可从网络获得的数据,请阅读并通过Serial发送。

节点设备有点复杂。它有自定义Standard Firmata,我刚刚添加了写入和读取覆盖。

Diagram

以这种方式读取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

那么这可能是什么问题?似乎与Firmata的沟通有效,但有些事情是不对的......

- 编辑 -

我解决了这个问题。问题是我在sysex回调中没有看到Serial.write()次调用。现在已经解决了,我遇到了另一个问题......所有阶段都通过了(我猜)然后当我请求引脚状态时我没有得到Node的任何响应

...
< 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...

没有回应。任何想法为什么会发生?节点正确接收所有消息,并且存在处理引脚状态的代码。

0 个答案:

没有答案