Проблема в передаче данных через nRF24L01

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Задание: Приходят данные с 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);
}

 

ales2k
Offline
Зарегистрирован: 25.02.2013

Заработает, не стоит из-за этого плакать :)

ales2k
Offline
Зарегистрирован: 25.02.2013

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()); - странная конструкция и дальше по тексту тоже внимательно проверьте логику своего скетча

 

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Все поправил, но ничего не поменялось кроме того, что на терминале второй ардуинки вместо "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);
}

 

toc
Offline
Зарегистрирован: 09.02.2013

CebkaCooler,
1. пример из библиотеки "pingpair" пробовали? работает?
2. serial.read возвращает byte. Зачем вы его кастуете в unsigned long?
3. определите размер радио посылки и укажите в обоих setup-ах . Например: radio.setPayloadSize(1) - если хотите отправлять по одному байту
4. удалите неиспользуемый код в "передатчике"
5. в "приёмнике" в 75 строке вы пытаетесь одновременно что-то вывести и прочитать из serial ???
6. что значит "декодируется в HEX" ??
7. научитесь сначала принимать из сериала, передавать по радио, выводить в сериал один символ.

toc
Offline
Зарегистрирован: 09.02.2013

8. в приёмнике 65 строка ничего не делает. Можно удалить.
Если нужно проверять условие и что-то делать, попробуйте так:
if (radio.available()) //отсутствует точка с запятой
{
radio.read(&incomingByte, 1);
...
}