Проблема в передаче данных через nRF24L01
- Войдите на сайт для отправки комментариев
Ср, 02/04/2014 - 18:03
Задание: Приходят данные с UART на Ардуино №1. Через передатчик nRF24L01 эти данные отправляются на ардуино №2, где декодируется в HEX. Проблема в передаче. Делал по примеру, но ничего не приходит на ардуино №2(она подключена к терминалу, на котором появляется "1" один раз и все, хотя я отправляю 4байтный код). Возможно я что то напутал в коде, когда переделывал шаблон, но так и не нашел в чем проблема.
Помогите, кто работал с nRF24L01. Если все заработает - заплачу.
передатчик
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "RF24_config.h" unsigned long radiocode[1]; unsigned long incomingByte = 0; // переменная для хранения полученного байта RF24 radio(53,13); unsigned long eventTime=0; const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; void setup() { Serial.begin(9600); // устанавливаем последовательное соединение radio.begin(); radio.setDataRate(RF24_250KBPS); radio.setChannel(100); radio.setRetries(15,15); radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1, pipes[0]); radio.startListening(); } unsigned long WaitAndRead() { while (Serial.available() == 0) { // do nothing } return (unsigned long) Serial.read(); } unsigned long SerialReadHexDigit() { unsigned long k = WaitAndRead(); if (k >= '0' && k <= '9') { return k - '0'; } else if (k >= 'a' && k <= 'f') { return k - 'a' + 10; } else if (k >= 'A' && k <= 'F') { return k - 'A' + 10; } else { return -1; // getting here is bad: it means the character was invalid } } unsigned long SerialReadHexByte() { unsigned long w = SerialReadHexDigit(); unsigned long s = SerialReadHexDigit(); if (w<0 || s<0) { return -1; // an invalid hex character was encountered } else { return (w*16) + s; } } void loop() { if (Serial.available() > 0) { { radiocode[0] = Serial.read(); radio.stopListening(); radio.write(radiocode, 1); radio.startListening(); } Serial.println(SerialReadHexByte(), HEX); } }
приемник
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "RF24_config.h" byte a; byte b; byte c; byte d; unsigned long radiocode[1]; unsigned long incomingByte = 0; // переменная для хранения полученного байта RF24 radio(53,13); unsigned long eventTime=0; const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; void setup() { Serial.begin(9600); // устанавливаем последовательное соединение radio.begin(); radio.setDataRate(RF24_250KBPS); radio.setChannel(100); radio.setRetries(15,15); radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1, pipes[0]); radio.startListening(); } unsigned long WaitAndRead() { while (Serial.available() == 0) { // do nothing } return (unsigned long) radio.read(radiocode, 1); } unsigned long SerialReadHexDigit() { unsigned long k = WaitAndRead(); if (k >= '0' && k <= '9') { return k - '0'; } else if (k >= 'a' && k <= 'f') { return k - 'a' + 10; } else if (k >= 'A' && k <= 'F') { return k - 'A' + 10; } else { return -1; // getting here is bad: it means the character was invalid } } unsigned long SerialReadHexByte() { unsigned long w = SerialReadHexDigit(); unsigned long s = SerialReadHexDigit(); if (w<0 || s<0) { return -1; // an invalid hex character was encountered } else { return (w*16) + s; } } void loop() { if (radio.available()); //если есть доступные данные bool done = false; while (!done) { done = radio.read(radiocode, 1); radiocode[0] = incomingByte; } Serial.println(incomingByte, HEX); Serial.println(done, HEX); Serial.println(SerialReadHexByte(), HEX); Serial.println(a, HEX); Serial.println(b, HEX); Serial.println(c, HEX); Serial.println(d, HEX); }
Заработает, не стоит из-за этого плакать :)
radiocode массив объектов типа long из 1 объекта
long занимает 4 байта в памяти
radio.write(radiocode, 1); передает 1 байт
Предлагаю попробовать radio.write(radiocode, sizeof(radiocode[0]));
Далее
в обеих скетчах
const
uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL};
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1, pipes[0]);
Соответственно оба скетча слушают из pipes[0] и передают в pipes[1] - не наводит на размышления???
if
(radio.available()); - странная конструкция и дальше по тексту тоже внимательно проверьте логику своего скетча
Все поправил, но ничего не поменялось кроме того, что на терминале второй ардуинки вместо "1" ставл выдавать "0" и "1".
вот исправленная версия
передатчик
приемник
CebkaCooler,
1. пример из библиотеки "pingpair" пробовали? работает?
2. serial.read возвращает byte. Зачем вы его кастуете в unsigned long?
3. определите размер радио посылки и укажите в обоих setup-ах . Например: radio.setPayloadSize(1) - если хотите отправлять по одному байту
4. удалите неиспользуемый код в "передатчике"
5. в "приёмнике" в 75 строке вы пытаетесь одновременно что-то вывести и прочитать из serial ???
6. что значит "декодируется в HEX" ??
7. научитесь сначала принимать из сериала, передавать по радио, выводить в сериал один символ.
8. в приёмнике 65 строка ничего не делает. Можно удалить.
Если нужно проверять условие и что-то делать, попробуйте так:
if (radio.available()) //отсутствует точка с запятой
{
radio.read(&incomingByte, 1);
...
}