Подтверждение получения пакета для nRF24L01
- Войдите на сайт для отправки комментариев
Ср, 22/01/2020 - 13:49
Всем привет! Говорят, что у этих модулей есть режим подтверждения получения пакета.
Может ли кто-нибудь объяснить, как это работает? Например я отправил данные с одно модуля на другой, и тот должен в ответ как-то передать подтверждение, а первый модуль его зафиксировать.
Зарнее спасибо всем.
Все так и есть, если режим подтверждения включён (его можно и выключить). Вопроса не понял. Вам нужен даташит на этот приёмо-передатчик, чтобы подробности почитать или что?
Хотелось бы понять, как его включать/выключать.
Но, что ещё более востребовано, хочеться понять, как получить данные о потдверждении?
Ну если совсем примитивно: приёмник получил команду, отправил подтверждение на передатчик. Передатчик вывел в Serial «Команда успешно передана».
Мне бы простейший пример в несколько строк.
Включать - выключать методом библиотеки RF24 "setAutoAck" - там всё прокомментировано.
Простейшие примерчики - опять же прилагаются к библиотеке, но в целом там всё просто. Если подтверждение включено, то метод write вернёт истину если успешно отправил и получил подтверждение и ложь в противном случае.
Спасибо за информацию! Буду разбираться.
На малых расстояниях до 20 м, ACK вполне хорошее решение. Но при больших (>100 м) он становится неэффективен. Мне больше понравилось работать без него. Тупо отправляю пакет, а второе устройство возвращает его мне. Если пакеты совпали , то все ОК, если нет шлю снова. И так до 50 раз. Если не получилось, то что-то не в порядке. Реально на 100 метров получается 1-10 попыток, на 500 метров 10-50. С включенным АСК на 100 метрах связь практически пропадает. Использование NRF с усилителем большого выигрыша не дает. Правда есть небольшой гемморой с подбором пауз между приемом и передачей, закономерности не нашел, но влияют очень сильно.
там же при настройке можно задать число попыток связи и тайм-аут между попытками.
там же при настройке можно задать число попыток связи и тайм-аут между попытками.
На небольших расстояниях, все работает нормально. Но у меня расстояние до курятника было 70 метров, и никакие танцы с бубном не помогали. Связь тупо обрывалась и помогло только перезагрузка по питанию или зажать NRFку пальцами. Может быть библиотеки кривые брал. А этим способом удалось в течении прошлого сезона управлять пятью диммерами обогрева и освещения и получать информацию о температуре в брудерах с цыплятами. Хотя там и автономно все работало, но контроль и возможность вмешаться в процесс и изменить параметры системы не помешает.
Я выше написал к тому, что
т.е. по умолчанию там какие-то параметры все одно стоят на число попыток и паузу.
и вы бы озвучили, что там у вас получились за волшебные цифры
между приемом и передачей. Тогда можно было бы что-то пытаться понять.
Я выше написал к тому, что
т.е. по умолчанию там какие-то параметры все одно стоят на число попыток и паузу.
и вы бы озвучили, что там у вас получились за волшебные цифры
между приемом и передачей. Тогда можно было бы что-то пытаться понять.
Извиняюсь немного подзабыл, оказывается авто ответ включен. А то что я писал просто для усиления эффекта. У меня ардуинка к которой подключена 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 (); }