Фирма более nRF24
У меня возникли некоторые технические проблемы... Я пытаюсь использовать Firmata для Arduino, но через nrf24, а не через последовательный интерфейс. Я проверил связь nRF24, и это нормально. Я также проверил Firmata поверх Serial, и это работает.
Базовое устройство - простое "последовательное реле". Когда у него есть данные, доступные по последовательному порту, прочитайте их и отправьте по сети nRF24. Если есть данные, доступные из сети, прочитайте их и отправьте через последовательный порт.
Узел устройства немного сложен. У него есть пользовательские стандартные Firmata, где я только что добавил перезапись записи и чтения.
Чтение переопределения идентификатора loop
метод таким образом:
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
и в этом методе мы передаем данные в метод из сети. Это было проверено и должно работать нормально.
Метод записи перегружен по-другому. В 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 работает, но что-то не так...
-- РЕДАКТИРОВАТЬ --
Я решил эту проблему. Проблема заключалась в том, что я не видел Serial.write()
звонки в sysex callback. Теперь, когда это решено, я подошел к другой проблеме... Все этапы проходят правильно (я думаю), и тогда я не получаю никакого ответа от узла, когда я запрашиваю состояния контактов
...
< 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...
Там нет ответа. Есть идеи, почему это случилось? Узел получает все сообщения правильно, и код для обработки состояний выводов существует.