Создаю канал связи на NRF24L01

AntonM
Offline
Зарегистрирован: 22.10.2015

Здравствуйте, уважаемые!

Разочаровался я что-то в Wi-Fi, т.к. канал ооочень короткобойный, даже внешняя антенна не помогает. Попались мне в руки модули E01-ML01DP5 на 100 мВт, порадовали расстоянием передачи.

Цифры и байты передаются, теперь хочу перевести на передачу стандартных сообщений моего проекта. Сообщения типа "L#-8888888-999". Написал пару простеньких скетчей - трансмиттер и приемник.

Трансмиттер:

#include <SPI.h>
#include <RF24.h>

RF24 radio(9, 10);
const uint32_t pipe = 123456789;
char sender[13];


void setup()
{
  Serial.begin(57600);
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(pipe);
}


void loop()   
{
  char sender[] = "L#0000000-000";
  radio.write(sender, strlen(sender));
  Serial.println(sender);
  delay(1000);

}

Приёмник:

#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10);
const uint32_t ch1 = 123456789;

int len=0;
char data[]="";

void setup()   
{
  Serial.begin(57600);
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.openReadingPipe(1,ch1);
  radio.startListening();
}


void loop()  
{
  if(radio.available())
    {
        len = radio.getDynamicPayloadSize();
        radio.read(&data, len );
        Serial.println(data); 
     }
   
}

Проблема в том, что к сожалению нет приёма. Я предполагаю, что система ждет финишный байт (вроде 0х03 в МК), но его не получает, поэтому буфер просто переполняется поступающими данными. При смене параметра len = 13 приходит куча "переносов" в мониторе порта. При замене строчки на

radio.read(&data, sizeof(data));

в мониторе появляются также переносы с редкими символами [] и <.

Подскажите, что ж я неверно делаю.

И параллельно - был ли у кого-либо опыт работы с библиотекой RF24-Ethernet?

 

Всем Спасибо за Ответы!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
AntonM
Offline
Зарегистрирован: 22.10.2015

trembo пишет:
https://github.com/AlexGyver/nRF24L01 Пожалуйста

Увы, даже скопировав скетчи, в приемнике снова идет мусор с высокой частотой.

Recieved: 255
Recieved: 0
Recieved: 1
Recieved: 0
Recieved: 128
Recieved: 0
Recieved: 14
Recieved: 0
Recieved: 223
Recieved: 0
Recieved: 0
Recieved: 0
Recieved: 255
Recieved: 0
Recieved: 0
Recieved: 192
Recieved: 0
Recieved: 0
Recieved: 192
Recieved: 0
Recieved: 223
Recieved: 0
Recieved: 0
Recieved: 128
Recieved: 0
Recieved: 0
Recieved: 223
Recieved: 0
Recieved: 0
Recieved: 255
Recieved: 0
Recieved: 255
Recieved: 0
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AntonM пишет:

Написал пару простеньких скетчей - трансмиттер и приемник.

В 7-ой строке приёмника память под массив data не выделена (вернее, выделенн 1 байт). А в 23-ей строке Вы в него читаете. Результат - прочитанное пишется поверх других переменных. Замените 7-ую строку на что-то борлее разумное, например, 

char data[33];

В передатчике сделайте так, чтобы хвостовой 0 строки тоже передавался. Для этого в строке 21 вместо strlen(sender) пишите strlen(sender)+1.

Попробуйте, что получится и отпишитесь (только при этом обязательно опубликуйте актуальные скетчи).

AntonM
Offline
Зарегистрирован: 22.10.2015

ЕвгенийП пишет:
В 7-ой строке приёмника память под массив data не выделена (вернее, выделенн 1 байт). А в 23-ей строке Вы в него читаете. Результат - прочитанное пишется поверх других переменных. Замените 7-ую строку на что-то борлее разумное, например, 

char data[33];

Увы, ничего не дало. Также продолжает плодить переносы.

ЕвгенийП пишет:
В передатчике сделайте так, чтобы хвостовой 0 строки тоже передавался. Для этого в строке 21 вместо strlen(sender) пишите strlen(sender)+1.

Тоже самое...

ЕвгенийП пишет:
Попробуйте, что получится и отпишитесь (только при этом обязательно опубликуйте актуальные скетчи).

Ниже.  Также добавил обозначение канала и правильно указал название "трубы". Пробовал менять скорость до 1 мбит/сек - результат такой же... Уже не знаю чего ему надо...

Передатчик:

#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10);
const uint64_t ch1 = 0xF0F0F0F0E1LL;
char sender[13];


void setup()
{
  Serial.begin(57600);
  radio.begin();
  delay(500);
  radio.setChannel(10);
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(ch1);
}


void loop()   
{
  char sender[] = "L#0000000-000";
  radio.write(sender, strlen(sender)+1);
  Serial.println(sender);
  delay(1000);

}

Приемник:

#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10);
const uint64_t ch1 = 0xF0F0F0F0E1LL;

int len=0;
char data[70];

void setup()   
{
  Serial.begin(57600);
  radio.begin();
  delay(500);
  radio.setChannel(10);
  radio.setDataRate(RF24_250KBPS);
  radio.openReadingPipe(1,ch1);
  radio.startListening();
}


void loop()  
{
  if(radio.available())
    {
        len = radio.getDynamicPayloadSize();
        radio.read(&data, len );
        Serial.println(data); 
     }
   
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, то, что Вы сделали - по любому правильно.

А сейчас - отлаживайтесь. Не работает вслепую.

Вот что у Вас возвращает write? Печатайте в сериал! Чему равно len в 25-ой строке приёмника? Печатайте в сериал. Всё печатайте и смотрите! Всё! Это поможет локализовать проблему.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И, да, кстати, не знаю, чтоу Вас за библиотека, но в моей верии адрес долже быть указателем на байт (сам адрес задаётся массиво байтов), а не числом uint64_t как у Вас.

AntonM
Offline
Зарегистрирован: 22.10.2015

ЕвгенийП пишет:

Ну, то, что Вы сделали - по любому правильно.

А сейчас - отлаживайтесь. Не работает вслепую.

Вот что у Вас возвращает write? Печатайте в сериал! Чему равно len в 25-ой строке приёмника? Печатайте в сериал. Всё печатайте и смотрите! Всё! Это поможет локализовать проблему.

Библиотека? Да я отсюда брал https://github.com/maniacbug/RF24

Заметил оооочень интересную фитчу.

После некоторых корректировок, при отсылке не посылке, а простой "1" раз в секунду, в монитор порта приемника прилетают хексовые числа, причем постоянно:

Цитата:
FFFFD8D8
FFFFD8D8
FFFF8383
E0
E0
70
E0
70
80
0
FFFF8383
FFFFD8D8
EA3
0
FFFFD8D8
1C00
FFFFD8D8
70
1C00
FFFFD8D8
0
0
FFFFD8D8

AntonM
Offline
Зарегистрирован: 22.10.2015

Честно, я уже разочаровался их подключить. Перечитал кучу форумов, перепробовал кучу скетчей и примеров, разные версии библиотек (от МаньякБага и АлексГайвера) - один хрен при одиночном (тоесть второй модуль ОТКЛЮЧЕН!) подключении в сериал идет беспорядочный мусор. Такое чувство, что мне продали паленые модули....

Вот и сейчас, на таком скетче, льется мусор

#include <SPI.h>
#include <RF24.h>
#define CE_PIN 6         
#define CSN_PIN 7
const uint64_t readingPipe = 0xE8E8F0F0AALL;

int len=0;
char data[]="";

RF24 radio(CE_PIN, CSN_PIN);

void setup()   
{
     Serial.begin(9600);
     radio.begin();                    
     radio.setChannel(50);                
     radio.setRetries(15,15);            
     radio.setDataRate(RF24_250KBPS);    
     radio.setPALevel(RF24_PA_HIGH);      
     radio.setAutoAck(1);             
     radio.setPayloadSize(32);
     radio.openReadingPipe(1,readingPipe);
     radio.startListening();       
}


void loop()  
{
     int in;
    if ( radio.available() ){
        radio.read( &in, sizeof(in) );
        Serial.println(in);
}    
 else {
        Serial.println("Radio not available");
    }
    delay(1000);
} 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, приёмник без передатчика Вы не знаю для чего выложили. Может Вы и передаёте мусор, кто ж Вас знает.

AntonM
Offline
Зарегистрирован: 22.10.2015

Евгений, ну я же написал - передатчика нет. Отключен он.

А так, вот вам и приемник.

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 9          
#define CSN_PIN 10
const uint64_t writingPipe = 0xE8E8F0F0AALL;
int out = 123;

RF24 radio(CE_PIN, CSN_PIN);

void setup() {
    delay(2000);                      
    radio.begin();                      
    radio.setChannel(50);                  
    radio.setRetries(15,15);              
    radio.setDataRate(RF24_250KBPS);    
    radio.setPALevel(RF24_PA_HIGH);      
    radio.setAutoAck(1);     
       
    radio.openWritingPipe(writingPipe);  
             
}

void loop()
{
radio.write( &out, sizeof(out) );
delay(1000);
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

канал 110 поставьте, чтобы гадость с WiFi не ловил

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Инопланетяне приветы шлют!!! ПС  все что внутри <> пакет а за приветы духов 

/**/
unsigned long mill;// переменная для millis()
typedef void (*pDo)() ;// тип -функция обработчик
//----------------------------------------------
const byte numBuffer = 20;
char buffer[numBuffer];
byte iBuffer = 0;
bool fBuffer = false;
//----------------------------------------------
void setup() {
  Serial.begin(9600);
}

void loop() {
  mill = millis();
  if (Serial.available() > 0) {
    char c = Serial.read();
    switch (c) {
      case '<':
        iBuffer = 0;
        fBuffer = true;
        break;
      case '>':
        if (fBuffer == true) {
          buffer[iBuffer] = 0;
          Serial.println(buffer);
          iBuffer = 0;
          fBuffer = false;
        }
        break;
      default:
        if (c >= ' ' && c <= '}' && iBuffer < numBuffer )buffer[iBuffer++] = c;
    }
  }
}
/**/

 

AntonM
Offline
Зарегистрирован: 22.10.2015

Valera19701 пишет:

канал 110 поставьте, чтобы гадость с WiFi не ловил

 

Канал выбирался на основе данных с сканера каналов - https://github.com/gcopeland/RF24/blob/master/examples/scanner/scanner.pde

Менее загруженные - 50, 104 и 112. Но при переборе любого из них - тот же мусор. "Погуляв" по форуму, добавил всевозможные атрибуты для определения параметров передачи - ничего. Я не врубаюсь, почему именно с этими модулями гемморой, судя по сообщениям иных пользователей, у других никаких таких трудностей с ними нет, и загружая их же скетчи, получается то же самое.......

Проект уже жмет, месяц остался. Хотелось бы определиться - или заработают, или их в мусорку (500р на ветер) и покупка дальнобойной уличной точки доступа wifi.

Спасибо!

Традиционно: Передатчик

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <stdint.h>

#define CE_PIN 9          
#define CSN_PIN 10
const uint64_t writingPipe = 0xE8E8F0F0AALL;
int out = 123;

RF24 radio(CE_PIN, CSN_PIN);

void setup() {
    radio.begin();
    radio.powerUp() ;
    Serial.begin(9600);        
    delay(2000);                
    radio.setChannel(104);                  
    radio.setRetries(15,15);              
    radio.setDataRate(RF24_250KBPS);    
    radio.setPALevel(RF24_PA_MAX);      
    radio.setAutoAck(1); 
    radio.setCRCLength(RF24_CRC_16);
    radio.setPayloadSize(32);
    radio.openWritingPipe(writingPipe);  
             
}

void loop()
{
radio.write( &out, sizeof(out) );
Serial.println(out);
delay(1000);
}

...и приёмник

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <stdint.h>

#define CE_PIN 9        
#define CSN_PIN 10
const uint64_t readingPipe = 0xE8E8F0F0AALL;
int in;

RF24 radio(CE_PIN, CSN_PIN);

void setup() {          
    radio.begin();
    radio.powerUp() ;
    Serial.begin(9600);        
    delay(2000);                
    radio.setChannel(104);                  
    radio.setRetries(15,15);              
    radio.setDataRate(RF24_250KBPS);    
    radio.setPALevel(RF24_PA_MAX);      
    radio.setAutoAck(1); 
    radio.setCRCLength(RF24_CRC_16);

     radio.openReadingPipe(1,readingPipe);
     radio.startListening();       
}

void loop()
{
     int in;

    if ( radio.available() ){
        radio.read( &in, sizeof(in) );
        Serial.println(in);
}
   radio.stopListening();
   radio.startListening();
} 

AntonM
Offline
Зарегистрирован: 22.10.2015

В общем разобрался - модули заработали. Заработали только на библиотеке от tmrh20.

Теперь создаю процедуру импорта данных с Serial-порта.

Logik
Offline
Зарегистрирован: 05.08.2014

Так и написали бы в чем была проблема. А то с криками ПАМАГТИ!! все прибегают, внимания требуют, а как своим опытом поделится - жлобе одно оказывается.

AntonM
Offline
Зарегистрирован: 22.10.2015

Logik пишет:

Так и написали бы в чем была проблема. А то с криками ПАМАГТИ!! все прибегают, внимания требуют, а как своим опытом поделится - жлобе одно оказывается.

А проблема проста - не все библиотеки этот модуль переваривает. МаньякБаг не скушал, сторонние - тоже самое.

AntonM
Offline
Зарегистрирован: 22.10.2015

Подниму свою же темку - хочу оптимизировать код, добавив функцию отправки, но почему то в созданной функции IDE ругается на незадекларированную переменную. Проблема в том, что передается символьный код разного формата. Я пытаюсь забить этот код в стринговую переменную messageout и сделать условие отправки messageout>0. Но почему то в новосозданной функции он не

 

      -----//-----
     String messageout;
      -----//-----
void loop () { 
      -----//-----
   if (receive == "R0") {                                  //  если принят символ 'R' (Reset)...
      z++;     
      -----//-----
      Serial.println("SN00000000-" + z0);
      String messageout = "SN00000000-"+ z0;
      dispatch();
    }

    if (receive == "S0") {                                // если принят символ 'S' (Synx)...
      z++;
      -----//-----
      Serial.println("SN" + time_sync0 + "-" + z0);
      String messageout = "SN" + time_sync0 + "-" + z0;
      dispatch();
      logger[(z % 10)] = String ("SN" + time_sync0 + "-" + z0);     
    }
}

void dispatch() {
    if (messageout!=0) {
      char trans[32];
      messageout.toCharArray(trans, 32);
      radio.stopListening();
      radio.write(&trans,sizeof(trans)+1);
      Serial.println("Transive...");
      radio.startListening();
      Serial.flush();
   }
}

Ругается на if (messageout!=0) - 'messageout' was not declared in this scope

В чем моя ошибка?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AntonM пишет:

Ругается на if (messageout!=0) - 'messageout' was not declared in this scope

В чем моя ошибка?

У Вас сразу несколько ошибок.

1. Вы выложили неполный код, чем затруднили работу тем, кто хочет Вам помочь

2. Вы используете в строке 25 необъявленную переменную messageout.

То, что Вы объявляли её в других функциях - нещитова. Что за строка 2 я не понимаю (нужен полный код). 

А вообще, очень рекомендую изучить "Области видимости переменных".

AntonM
Offline
Зарегистрирован: 22.10.2015

ЕвгенийП пишет:
1. Вы выложили неполный код, чем затруднили работу тем, кто хочет Вам помочь

Чисто политически не могу выложить что там внутри =)

Но там по сути обработчик значений с датчиков, т.е. ничего интересного для радиопередатчика.

ЕвгенийП пишет:
2. Вы используете в строке 25 необъявленную переменную messageout.

То, что Вы объявляли её в других функциях - нещитова. Что за строка 2 я не понимаю (нужен полный код).

Ну почему же? До сетапа я ее объявил. 2ая строка - это и есть ее объявление после "дефайнов".

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AntonM пишет:

Ну почему же? До сетапа я ее объявил. 2ая строка - это и есть ее объявление после "дефайнов".

Вы со мной спорите или с компилятором? Он говорит необъявлена - значит необъявлена. И никаких вариантов быть не может. А если Вы там что-то объявляли, значит неправильно это делали. Если код политически секретный, то и разбирайтесь с ним политически самостоятельно.

AntonM
Offline
Зарегистрирован: 22.10.2015

В принципе, разобрался. Затаился иной символ после #define.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

С Победой!

b707
Offline
Зарегистрирован: 26.05.2017

AntonM пишет:

В принципе, разобрался. Затаился иной символ после #define.

другие обьявления messageout убрали, надеюсь? Даже в том обрывке кода. что у вас приведен - переменная обьявлена трижды.

AntonM
Offline
Зарегистрирован: 22.10.2015

До победы еще рано. Что то не так затаилось у меня в коде.

В тестовом скетче проеобразование в массив (input.toCharArray(transive, 32); срабатывает, в основной программе - нет.

#include <SPI.h>
#include "RF24.h"

RF24 radio(7,8);
byte addresses[][6] = {"1Node","2Node"};

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start"));
  radio.begin();
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(110);
  radio.setDataRate( RF24_250KBPS ) ;
  radio.openWritingPipe(addresses[0]);           //для приемника
  radio.openReadingPipe(1,addresses[1]);
  radio.startListening();
}

void loop() {

if (Serial.available() >0 )  {   //если в порте что-то есть, то отправляем
    radio.stopListening();
    String input = Serial.readStringUntil('\n');
    char transive[32];
    input.toCharArray(transive, 32);
    radio.write(&transive,sizeof(transive)+1);
    Serial.println("Transive...");
    radio.startListening();
    Serial.flush();
  }
   else {                    //иначе ждём и читаем что пришло
    char receive[32];
    if( radio.available()){
                                                               
      while (radio.available()) {                            
        radio.read( &receive, sizeof(receive) );      
      }
      Serial.println(receive);
    }
}
}

Тестовая программа передает введенную посылку на другое устройство.

Зато не работает в основной программе. В сериал другого устройства выдает пустую строчку.

Ну и код.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimerOne.h>
#include <SPI.h>
#include "RF24.h"

RF24 radio(7,8);                                        // объявляем пины для радиомодуля
byte addresses[][6] = {"1Node","2Node"};                // объявляем трубы радиопередачи
long time_ev, time_ms, time_sec, time_rez, time_z = 0;  // объявляем таймеры
char inputString[5];                                    // объявляем массив для приёма
String time_ev0, time_sync, time_sync0, time_per;       // объявляем переменные для времени события и синхронизации
String receive = "";                                    // объявляем переменную для принятой посылки
int i, z = 0;                                           // повторение посылки если не принято ничего
int z0, z10 ;
String logger[10];
String messageout;

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(5);
  radio.begin();                                        // запускаем радио
  radio.setPALevel(RF24_PA_MAX);                        // ставим максимальный уровень мощности
  radio.setChannel(110);                                // устанавливаем канал связи
  radio.setDataRate( RF24_250KBPS ) ;                   // устанавливаем скорость передачи данных
  radio.openWritingPipe(addresses[1]);                  // трубы передачи для передатчика
  radio.openReadingPipe(1,addresses[0]);
  radio.startListening();                               // начинаем слушать канал
  Serial.println("IS00000000-000");                     // сообщение о начале работы
  delay(1000);
}

String addZeroes(const String& src, byte pad)             // процедура добавления нулей
{
  if (src.length() >= pad)
    return src;

  String result;
  String messageout;
  byte add = pad - src.length();
  while (add--)
    result += "0";

  result += src;
  return result;
}

void loop() {
  if (z0==1000) {
    z0=0;
  }
}

void serialEvent() {
  while (Serial.available() > 0) {                        // если есть принятый символ,
      receive = Serial.readStringUntil('\n');             // читаем его до конца строки
  }
    if (receive == "S0") {                                // если принят символ 'S' (Synx)...
      z0++;
      time_rez = millis();
      String time_sync = String(time_rez, HEX);
      String time_sync0 = addZeroes(time_sync, 8);
      messageout = "SN" + time_sync0 + "-" + z0;
      Serial.println(messageout);
      dispatch();
      logger[(z % 10)] = String ("SN" + time_sync0 + "-" + z0);     
    }
  }

void dispatch() {
    if (sizeof(messageout)!=0) {
      char trans[32];
      Serial.println(messageout);
      messageout.toCharArray(trans, 32);
      Serial.println(trans);
      radio.stopListening();
      radio.write(&trans,sizeof(trans)+1);
      Serial.println("Transive...");
      radio.startListening();
      Serial.flush();
      messageout="";
   } 
}
b707
Offline
Зарегистрирован: 26.05.2017

messageout, time_sync, tyme_sync0 - обьявлены дважды. Может и еще какие, внимательно не смотрел.

Вы, похоже, не понимаете, как обьявляются переменные