NRF24 что это, помехи или нет.

AlexGru
Offline
Зарегистрирован: 12.11.2019

Добрый день. Делаю первые шаги в ардуино.

И пробую соединить 2 модуля NRF24L01 + PA +LNA

2 платы UNO, два модуля nrf, каждый из NRF питается отдельно от прочего 3.3 через AMS1117 (без доп кондера).

Делаю простейший пример с яркостью диода. Казалось бы всё ок, но приемник периодический, раз в 1,2 секунды читает что-то лишнее и я не могу понять помеха это или бага.

Вот тексты кодов.:

Передатчик

#include <SPI.h>  // Подключаем библиотеку для работы с SPI-интерфейсом
#include <nRF24L01.h> // Подключаем файл конфигурации из библиотеки RF24
#include <RF24.h> // Подключаем библиотеку для работа для работы с модулем NRF24L01
#define PIN_POT A5  // Номер пина Arduino, к которому подключен потенциометр
#define PIN_CE  10  // Номер пина Arduino, к которому подключен вывод CE радиомодуля
#define PIN_CSN 9 // Номер пина Arduino, к которому подключен вывод CSN радиомодуля
RF24 radio(PIN_CE, PIN_CSN); // Создаём объект radio с указанием выводов CE и CSN
int potValue[1]; // Создаём массив для передачи значений потенциометра
int sVal;
int nVal;
void setup() {
 Serial.begin(9600);
  radio.begin();  // Инициализация модуля NRF24L01
  radio.setChannel(100); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
  radio.setDataRate (RF24_250KBPS); // Скорость обмена данными 1 Мбит/сек
  radio.setPALevel(RF24_PA_HIGH); // Выбираем высокую мощность передатчика (-6dBm)
  radio.openWritingPipe(0x7878787878LL); // Открываем трубу с уникальным ID
}
void loop() {
 sVal = analogRead(PIN_POT);
 nVal = map(sVal,0,1023,0,255);
 Serial.println(nVal);
 potValue[0] = nVal; // Считываем показания потенциометра
 radio.write(potValue, 1); // Отправляем считанные показания по радиоканалу  
 delay(300);
}

Приемник

#include <SPI.h>  // Подключаем библиотеку для работы с SPI-интерфейсом
#include <nRF24L01.h> // Подключаем файл конфигурации из библиотеки RF24
#include <RF24.h> // Подключаем библиотеку для работа для работы с модулем NRF24L01
#define PIN_LED 3  // Номер пина Arduino, к которому подключен светодиод
#define PIN_CE  10  // Номер пина Arduino, к которому подключен вывод CE радиомодуля
#define PIN_CSN 9 // Номер пина Arduino, к которому подключен вывод CSN радиомодуля
RF24 radio(PIN_CE,PIN_CSN); // Создаём объект radio с указанием выводов CE и CSN
int potValue[1]; // Создаём массив для приёма значений потенциометра

void setup() {
  Serial.begin(9600);
  pinMode(PIN_LED, OUTPUT); // Настраиваем на выход пин светодиода
  radio.begin();  // Инициализация модуля NRF24L01
  radio.setChannel(100); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
  radio.setDataRate (RF24_250KBPS); // Скорость обмена данными 1 Мбит/сек
  radio.setPALevel(RF24_PA_HIGH); // Выбираем высокую мощность передатчика (-6dBm)
  radio.openReadingPipe (1, 0x7878787878LL); // Открываем трубу ID передатчика
  radio.startListening(); // Начинаем прослушивать открываемую трубу
}
 
void loop() {
  if(radio.available()){ // Если в буфер приёмника поступили данные
    radio.read(&potValue, sizeof(potValue)); // Читаем показания потенциометра
    Serial.println(potValue[0]);
    analogWrite(PIN_LED, potValue[0]); // Регулируем яркость диода
  } else {
    Serial.println('no radio');
    }
 delay(300);
}
 

В консоли на передатчике лишнего не вижу, только числа из диапазона 0-255 (при покручивании потенциометра, меняются)

Вывод в консоль на приемнике

26991
78
79
78
78
79
78
26991
79
79
78
78
78
78
78
26991
78
79
79
79
78
78
26991
78
79
78
78
78
78
26991
78
79
78
78
78
78
78
26991
78
78

т.е. яркость диода меняется в ответ на изменение потенциометра на передатчике, но вот что за 26991

Пробовал разные setChannel, результат такой же., только этих 26991 может быть больше, иногда сразу пачками валятся.

Вопрос, помехи ли это и поможет ли электролитический кондекнсатор на 470мФ, около AMS1117

?

Спасибо.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Я правильно понимаю, что из int вы отсылаете один байт (radio.write(potValue, 1)) и потом этот байт запихиваете обратно в int?

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

sadman41 пишет:

Я правильно понимаю, что из int вы отсылаете один байт (radio.write(potValue, 1)) и потом этот байт запихиваете обратно в int?

Неправильно понимаете.

Он пишет один байт (строка 24 передатчика), а читает два (строка 23 приёмника). Чё там в буфере payloada находится, то и видим в итоге.

AlexGru, Вы поняли, что я сказал?

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Неправильно понимаете.

Он пишет один байт (строка 24 передатчика), а читает два (строка 23 приёмника). Чё там в буфере payloada находится, то и видим в итоге.

Ну, я в том смысле, что на стороне приёмника в int пихается переданный байт и вчерашний ужин.

-NMi-
Offline
Зарегистрирован: 20.08.2018

AlexGru пишет:

Вопрос, помехи ли это и поможет ли электролитический кондекнсатор на 470мФ, около AMS1117

На NRF24 помех быть не может от слова невозможно. Ибо в пакете есть синхрополе + CRC. Таким образом пакет либо принимается "целиком" - либо не принимается СОВСЕМ!  Я думаю, что объяснил вполне внятно.

По поводу конденсатора: на NRF24 + PA мне хватало и 100мкф.   но прям на ноги NRF24.

AlexGru
Offline
Зарегистрирован: 12.11.2019

AlexGru, Вы поняли, что я сказал? 

Не уверен :(

Пишем из 2-х байтной potValueпеременной явно один байт, radio.write(potValue, 1); 

а читаем в 2-х байтную переменную, всё что пришло radio.read(&potValue, sizeof(potValue));

Ладно бы полная лажа была при передаче, а так странно, особенно с учётом 

На NRF24 помех быть не может от слова невозможно.

В общем я понял, что это чисто мои проблемы (код) чтения/записи, буду читать искать.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ищите в районе размерности int

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

AlexGru - зачем вы вообще используете для приема и передачи двухбайтный инт, если старательно преобразуете значение командой map к диапазону 0-255 ? - раз преобразуете к диапазону одного байта - так один байт и передавали бы

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

AlexGru
Offline
Зарегистрирован: 12.11.2019

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

Согласен, код из интернетов, вот буду вникать, по быстрому были взяты примеры.

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

-NMi- пишет:
По поводу конденсатора: на NRF24 + PA мне хватало и 100мкф.   но прям на ноги NRF24.
У меня 47 стоит на плате в 3мм от ног. Нормально, вроде. Правда, на небольшие расстояния работаю.

-NMi-
Offline
Зарегистрирован: 20.08.2018

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

Правда, на небольшие расстояния работаю.

А нрфка даже на максимальной мощности по расстоянию "ниаллё" Метров 500 в прямой видимости в городе. В поле не проверял.

AlexGru
Offline
Зарегистрирован: 12.11.2019

В общем часов 5 ещё посидел, что только не делал. перепроверил коннекты по пинам. Питание. На приемнике добавил конденсатор. Все равно сама природа явления не изменилас.

От байтов перешел к массивам интов.

Код передатчика


#include <SPI.h>  // Подключаем библиотеку для работы с SPI-интерфейсом
#include <nRF24L01.h> // Подключаем файл конфигурации из библиотеки RF24
#include <RF24.h> // Подключаем библиотеку для работа для работы с модулем NRF24L01

#define PIN_POT A5  // Номер пина Arduino, к которому подключен потенциометр
#define PIN_CE  9   // Номер пина Arduino, к которому подключен вывод CE радиомодуля
#define PIN_CSN 10  // Номер пина Arduino, к которому подключен вывод CSN радиомодуля

RF24 radio(PIN_CE, PIN_CSN); // Создаём объект radio с указанием выводов CE и CSN

int drv[2];     //[1] angle 0-180 [2] speed 0-250
int sVal;

void setup() {
 Serial.begin(9600);
  radio.begin();  // Инициализация модуля NRF24L01
  radio.setAutoAck(1);
  radio.setRetries(15, 15);
  radio.setChannel(120); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
  radio.setDataRate (RF24_250KBPS); // Скорость обмена данными 1 Мбит/сек
  radio.setPALevel(RF24_PA_HIGH); // Выбираем высокую мощность передатчика (-6dBm)
  radio.openWritingPipe(0x7878787878LL); // Открываем трубу с уникальным ID
}

void traceOutput(){
  Serial.print(F("angle= "));
  Serial.print(drv[0]);
  Serial.print(F(" speed = "));
  Serial.println(drv[1]);
}

void loop() {
 sVal   = analogRead(PIN_POT);
 
   drv[0] = 60;
   drv[1] = map(sVal,0,1023,0,255);

     if( radio.write(&drv, sizeof(drv))){
       traceOutput();
     }else{
       Serial.println("Message not sent");
     }

 delay(1000);
}

Код приемника

#include <SPI.h>      // Подключаем библиотеку для работы с SPI-интерфейсом
#include <nRF24L01.h> // Подключаем файл конфигурации из библиотеки RF24
#include <RF24.h>     // Подключаем библиотеку для работа для работы с модулем NRF24L01

#define PIN_LED 3     // Номер пина Arduino, к которому подключен светодиод
#define PIN_CE  9    // Номер пина Arduino, к которому подключен вывод CE радиомодуля
#define PIN_CSN 10     // Номер пина Arduino, к которому подключен вывод CSN радиомодуля

RF24 radio(PIN_CE,PIN_CSN); // Создаём объект radio с указанием выводов CE и CSN
int drv[2];

void setup() {
  delay(1000);
  Serial.begin(9600);
  pinMode(PIN_LED, OUTPUT); // Настраиваем на выход пин светодиода
  radio.begin();  // Инициализация модуля NRF24L01
  radio.setAutoAck(1);
  radio.setChannel(120); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
  radio.setDataRate (RF24_250KBPS); // Скорость обмена данными 1 Мбит/сек
  radio.setPALevel(RF24_PA_HIGH); // Выбираем высокую мощность передатчика (-6dBm)
  radio.openReadingPipe (1, 0x7878787878LL); // Открываем трубу ID передатчика
  radio.startListening(); // Начинаем прослушивать открываемую трубу
}

void loop() {
  if(radio.available()){ // Если в буфер приёмника поступили данные
    radio.read(&drv, sizeof(drv)); // Читаем
    Serial.print(F("angle= "));
    Serial.print(drv[0]);
    Serial.print(F(" speed = "));
    Serial.print(drv[1]);
    Serial.println(F(" "));
    analogWrite(PIN_LED, drv[1]); // Регулируем яркость диода
  } else {
    Serial.println('no data');
    }
 delay(250);
}

Вывод на приемнике 

angle= 60 speed = 39
29793
29793
29793
angle= 60 speed = 39
29793
29793
29793
angle= 60 speed = 39
29793
29793
29793
angle= 60 speed = 39
29793
29793
29793
angle= 60 speed = 39
29793
29793
29793
angle= 60 speed = 39
29793
29793
29793
angle= 60 speed = 39 

Передактчик видит, если приемник выключен и выдает "Message not sent", тут ок.

Очень смущает следующее, если вообще выключить передатчик, то приемник выводит всё время строки

29793

и более того, если закоментить на приемнике код  

Serial.print(F("angle= "));
29
    Serial.print(drv[0]);
30
    Serial.print(F(" speed = "));
31
    Serial.print(drv[1]);
32
    Serial.println(F(" "));
33
    analogWrite(PIN_LED, drv[1]);

то ничего не меняется, как будто функция radio.read(&drv, sizeof(drv)); внутри себя выдает сообщение 29783 в консоль.

Можно конечно решить всё это анализируя состав пришедших данных или их изменчивость, но это как-то костыльно. 

Ещё заметил, что если отправлять чаще чем принимать, то всё ок, этих сообщений 29783 нет.

Так решать тоже не совсем правильно.

Что же я делаю не так? :(

Библиотеку использую эту https://github.com/nRF24/RF24

-NMi-
Offline
Зарегистрирован: 20.08.2018

Давно бы написал сам библиотеку да уже бы всё давно бы работало. Там всё просто, по датащам всё расписано и есть примеры на С. Можно тупо копипастить некоторые вещи прям из датащей.

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

AlexGru пишет:

Очень смущает следующее, если вообще выключить передатчик, то приемник выводит всё время строки

29793

Что Вы написали, то он и выводит. А Вы что хотите, чтобы он выводил? Текст "no data"? Так поставьте в 35-ой строке правильные кавычки - будет выводить.

AlexGru пишет:

если отправлять чаще чем принимать, то всё ок, этих сообщений 29783 нет

Ну, правильно, если всегда "available", то на 35-ую строку и не попадает никогда.

AlexGru
Offline
Зарегистрирован: 12.11.2019

Ну, правильно, если всегда "available", то на 35-ую строку и не попадает никогда.

Ну тогда и дело не в кавычках, поменяю, но.

По большому счет данные принимает, если они не приходят, хоть и available, то вижу 0 в данных.,

думаю можно считать вывод числа из функции read как некую отладочную инфу, и игнорировать просто., это ведь вывод в консоль просто, в мои переменные не попадает.

Просто хотелось разобраться почему available даже при выключенном передатчике и что за отладочная инфа.

 

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

AlexGru -если вы ничего не поняли в ответе - то не надо спорить. просто поменяйте кавычки и запустите еще раз

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

AlexGru пишет:
дело не в кавычках ...

Чем нести бред, поменяйте лучше кавычки.

А если уж

AlexGru пишет:
Просто хотелось разобраться ...

то, для начала, разберитесь в какой именно строке скетча Вы печатаете это число "29793". Ведь у Вас нет никакой печати числа!  Тогда кто же его печатает?

Вот когда в этом разберётесь, будет польза, а бредить не надо, примите галаперидольчику, полегчает.

AlexGru
Offline
Зарегистрирован: 12.11.2019

Да, только поставил двойные кавычки, как все встало на свои места. Всем спасибо.

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

AlexGru пишет:

Да, только поставил двойные кавычки, как все встало на свои места. Всем спасибо.

ага, а то сразу "неведомая отладочная информация".... привыкайте в первую очередь искать косяки у себя.