Подтверждение получения пакета для nRF24L01

puhloschiok
puhloschiok аватар
Offline
Зарегистрирован: 02.11.2017

Всем привет! Говорят, что у этих модулей есть режим подтверждения получения пакета.
Может ли кто-нибудь объяснить, как это работает? Например я отправил данные с одно модуля на другой, и тот должен в ответ как-то передать подтверждение, а первый модуль его зафиксировать.
Зарнее спасибо всем.

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

Все так и есть, если режим подтверждения включён (его можно и выключить). Вопроса не понял. Вам нужен даташит на этот приёмо-передатчик, чтобы подробности почитать или что?

puhloschiok
puhloschiok аватар
Offline
Зарегистрирован: 02.11.2017

Хотелось бы понять, как его включать/выключать.
Но, что ещё более востребовано, хочеться понять, как получить данные о потдверждении?
Ну если совсем примитивно: приёмник получил команду, отправил подтверждение на передатчик. Передатчик вывел в Serial «Команда успешно передана».

Мне бы простейший пример в несколько строк.

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

Включать - выключать методом библиотеки RF24  "setAutoAck" - там всё прокомментировано.

Простейшие примерчики - опять же прилагаются к библиотеке, но в целом там всё просто. Если подтверждение включено, то метод write вернёт истину если успешно отправил и получил подтверждение и ложь в противном случае.

puhloschiok
puhloschiok аватар
Offline
Зарегистрирован: 02.11.2017

Спасибо за информацию! Буду разбираться.

ВН
Offline
Зарегистрирован: 25.02.2016
но можно еще + к тому вместо AСK отправлять автоматом свои данные 
 
radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
svm
Offline
Зарегистрирован: 06.11.2016

На малых расстояниях до 20 м, ACK вполне хорошее решение. Но при больших (>100 м) он становится неэффективен. Мне больше понравилось работать без него. Тупо отправляю пакет, а второе устройство возвращает его мне. Если пакеты совпали , то все ОК, если нет шлю снова. И так до 50 раз. Если не получилось, то что-то не в порядке. Реально на 100 метров получается 1-10 попыток, на 500 метров  10-50. С включенным АСК на 100 метрах связь практически пропадает. Использование NRF с усилителем большого выигрыша не дает. Правда есть небольшой гемморой с подбором пауз между приемом и передачей, закономерности не нашел, но влияют очень сильно.

ВН
Offline
Зарегистрирован: 25.02.2016

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

svm
Offline
Зарегистрирован: 06.11.2016

ВН пишет:

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

На небольших расстояниях, все работает нормально. Но у меня расстояние до курятника было 70 метров, и никакие танцы с бубном не помогали. Связь тупо обрывалась и помогло только перезагрузка по питанию или зажать NRFку пальцами. Может быть библиотеки кривые брал. А этим способом удалось в течении прошлого сезона управлять пятью диммерами обогрева и освещения и получать информацию о температуре в брудерах с цыплятами. Хотя там и автономно все работало, но контроль и возможность вмешаться в процесс и изменить параметры системы не помешает.

ВН
Offline
Зарегистрирован: 25.02.2016

Я выше написал к тому, что

svm пишет:
Правда есть небольшой гемморой с подбором пауз между приемом и передачей, закономерности не нашел, но влияют очень сильно.

т.е. по умолчанию там какие-то параметры все одно стоят на число попыток и паузу.

и вы бы озвучили, что там у вас получились за волшебные цифры

между приемом и передачей. Тогда можно было бы что-то пытаться понять.

svm
Offline
Зарегистрирован: 06.11.2016

ВН пишет:

Я выше написал к тому, что

svm пишет:
Правда есть небольшой гемморой с подбором пауз между приемом и передачей, закономерности не нашел, но влияют очень сильно.

т.е. по умолчанию там какие-то параметры все одно стоят на число попыток и паузу.

и вы бы озвучили, что там у вас получились за волшебные цифры

между приемом и передачей. Тогда можно было бы что-то пытаться понять.

Извиняюсь немного подзабыл, оказывается авто ответ включен. А то что я писал просто для усиления эффекта. У меня ардуинка к которой подключена NRF ка используется чисто в качестве радиомоста между базой и устройством сбора информации и управления (СБУ). И связана с ним по UART. Наверное из за задержек в обмене между ними и появились эти волшебные цифры. Вот скетч самого моста, там все видно. В дополнение ко всему этому информация все время передается разная (устройство сбор информации добавляет в конце блока его № циклически от 1 до 100 и проверяет его при приеме) т.к. иногда проскакивала информация, которую NRF считает корректной, но она была из предыдущей посылки. 

#include <EEPROM.h>
#include <SPI.h>                                          // Подключаем библиотеку  для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку  для работы с nRF24L01+
RF24           radio(9, 10);                              // Создаём объект radio   для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
byte           data[16],datatx[16],i;                     // Создаём массивы для приёма и передачи данных
unsigned long T_Out;
bool done;

void setup() {
    
    delay(300);
    Serial.begin(115200);
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(105);                                // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setRetries(15,15);                              // Установка интервала и количества попыток "дозвона" до приемника;
    radio.setDataRate     (RF24_250KBPS);                 // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек 
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.setAutoAck(1);                                  // Установка режима подтверждения приема;
    radio.openWritingPipe(0x1234567890LL);                // Активация данных для отправки
    radio.openReadingPipe (1, 0x1234567890LL);            // Открываем 1 трубу с идентификатором 0x1234567890 для приема данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
    radio.startListening  ();}                            // Включаем приемник, начинаем прослушивать открытую трубу


//********************************************************************************
void loop(){
ns:            // ------------ Слушаем эфир ----------------
  bool done = false;
  if(radio.available()){                                   // Если в буфере имеются принятые данные
  while (!done) {done=radio.read(&data, sizeof(data));}}   // Уперто читаем данные в массив data 
  if(!done)goto ns;
  radio.stopListening   ();                                // встаем на передачу
 
 while(Serial.available()>0){Serial.read();}
 
 for (i=0; i <= 15; i++){Serial.write(data[i]);}           // передаем СБУ

delay(30);
               // ------------ Передаем ответ  ----------------
 if(Serial.available()>0){                                 // если есть ответ от СБУ
 for (i=0; i <= 15; i++){datatx[i]=Serial.read();}}
  
  
  radio.flush_tx();
  T_Out=millis();
  done = false;
  while (!done && (millis()-T_Out)<2000){                   //в течении 2 секунд 
  done=radio.write(&datatx, sizeof(datatx));}               //долбим - пытаемся достучаться
  radio.startListening  (); 
}