Проблема в передаче данных через 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]));
Далее
в обеих скетчах
constuint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL};radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1, pipes[0]);
Соответственно оба скетча слушают из pipes[0] и передают в pipes[1] - не наводит на размышления???
if(radio.available()); - странная конструкция и дальше по тексту тоже внимательно проверьте логику своего скетчаВсе поправил, но ничего не поменялось кроме того, что на терминале второй ардуинки вместо "1" ставл выдавать "0" и "1".
вот исправленная версия
передатчик
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "RF24_config.h" unsigned long radiocode[1]; unsigned long incomingByte = 0; // переменная для хранения полученного байта RF24 radio(53,8); 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, sizeof(radiocode[0])); 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,8); 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[0]); radio.openReadingPipe(1, pipes[1]); radio.startListening(); } unsigned long WaitAndRead() { while (Serial.available() == 0) { // do nothing } return (unsigned long) radio.read(radiocode, sizeof(radiocode[0])); } 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, sizeof(radiocode[0])); 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); }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);
...
}