Победа над nRF24L01: на три шага ближе

    Многие испытывают трудности при соединении по эфиру радиомодулей nRF24L01. Об этом свидетельствует тема на форуме Амперки, открытая в конце 2014г. За пять с небольшим лет в теме накопилось более 120(!) страниц. Это при том, что автор темы не просто обозначил проблему, а поделился своим трехнедельным опытом победного для него боя. Кроме того, он тут же — в первом сообщении создал навигатор по страницам темы, где приводит ссылки на решения проблемы другими. Этот своеобразный путеводитель постоянно обновляется.



    Я тоже не из тех счастливчиков, которым легко удалось связать радиомодули. Ниже — мой подход к решению проблемы.



    Модули nRF24L01 работают в полудуплексном режиме. Это как разговор по рации: каждый из корреспондентов в один момент времени либо говорит, либо слушает. То есть, каждый из двух узлов работает в режиме и приемника и передатчика: передатчик, отправив сообщение ждет на подтверждение приема сообщения со стороны приемника.



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



    Я же разделил эту задачу на несколько простых задачек. Вначале модули проверяются на работоспособность и правильность подключения (шаг 1), затем один из пары работающих радиомодулей тестируется на работу в режиме передатчика без ожидания отклика с приемника (шаг 2) и последний этап — улучшение качества связи в этой связке передатчик-приемник (шаг 3).



    Для общего представления — картинка с прототипом:





    Итак ...





    Шаг 1


    Загрузить в контроллер платы Ардуино скетч сканера эфира, который можно найти среди примеров Arduino IDE: Файл -> Примеры -> RF24 -> scanner. Ниже под спойлером есть этот скетч с несущественным изменением. В нем изменено время между стартом и остановкой сканирования одного канала с 128 мксек на 512 мксек. Увеличение времени позволило за один цикл сканирования всего диапазона выявлять больше источников помех и сигналов. Это равнозначно замене результата измерений в канале на сумму четырех соседних результатов в этом канале до изменения времени задержки. При этом, время прохода всего прослушиваемого диапазона сканером увеличилось несущественно: примерно с 8 до 10 сек.



    В разных скетчах адрес канала в командах приводится в разных форматах: в одних — ...(0x6f), в других — ...(112). Перевод с одного формата в другой станет понятным с примера перевода. Например, для (0x1а) — это: (1+1)*16 + а = (1+1)*16 + 10 = 42. Отсчет каналов начинается с частоты 2,4 ГГц, далее идет увеличение частоты на 1 МГц с увеличением номера канала на 1.



    скетч сканера эфира
    /*
    Победа над nRF24L01: на три шага ближе, сканер эфира
    https://habr.com/ru/post/476716/
    */
    
    /*
      Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
    
      This program is free software; you can redistribute it and/or
      modify it under the terms of the GNU General Public License
      version 2 as published by the Free Software Foundation.
    */
    
    /**
       Channel scanner
    
       Example to detect interference on the various channels available.
       This is a good diagnostic tool to check whether you're picking a
       good channel for your application.
    
       Inspired by cpixip.
       See http://arduino.cc/forum/index.php/topic,54795.0.html
    */
    
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include "printf.h"
    
    //
    // Hardware configuration
    //
    
    // Set up nRF24L01 radio on SPI bus plus pins 9 & 10
    
    RF24 radio(9, 10); //Arduino UNO
    
    //
    // Channel info
    //
    
    const uint8_t num_channels = 128;
    uint8_t values[num_channels];
    
    //
    // Setup
    //
    
    void setup(void)
    {
      //
      // Print preamble
      //
    
      Serial.begin(9600);
      Serial.println("Scanner Air On");
      printf_begin();
    
      //
      // Setup and configure rf radio
      //
    
      radio.begin();
      radio.setAutoAck(false);
    
      // Get into standby mode
      radio.startListening();
      radio.printDetails();  
      delay(5000);              
    
      // Print out header, high then low digit
      int i = 0;
      while ( i < num_channels )
      {
        printf("%x", i >> 4);
        ++i;
      }
      printf("\n\r");
      i = 0;
      while ( i < num_channels )
      {
        printf("%x", i & 0xf);
        ++i;
      }
      printf("\n\r");
    }
    
    //
    // Loop
    //
    
    const int num_reps = 100;
    
    void loop(void)
    {
      // Clear measurement values
      memset(values, 0, sizeof(values));
    
      // Scan all channels num_reps times
      int rep_counter = num_reps;
      while (rep_counter--)
      {
        int i = num_channels;
        while (i--)
        {
          // Select this channel
          radio.setChannel(i);
    
          // Listen for a little
          radio.startListening();
          delayMicroseconds(512);
          radio.stopListening();
    
          // Did we get a carrier?
          if ( radio.testCarrier() )
            ++values[i];
        }
      }
    
      // Print out channel measurements, clamped to a single hex digit
      int i = 0;
      while ( i < num_channels )
      {
        printf("%x", min(0xf, values[i] & 0xf));
        ++i;
      }
      printf("\n\r");
    }
    



    Далее подключаем модуль nRF24L01 к плате Ардуино или любому прототипу, собранному, допустим, на контроллере ATMEGA328P. Я собрал два образца на платах для прототипирования на контроллере ATMEGA328P по схеме контроллер + резонатор. Один образец подключаю к компу через плату Arduino UNO, а второй — через конвертор USB/TTL.

    Мощность стабилизатора платы Arduino UNO вполне приемлема для подключения дополнительной импульсной нагрузки такой, как nRF24L01+ c адаптером 5В/3,3В для этого модуля или без адаптера.




    На мониторе последовательного порта Arduino IDE увидите нечто похожее:



    Если вы увидели похожую картинку — тест на работоспособность (исправность) радиомодуля и правильность его подключения пройден успешно. Замените радиомодуль другим, с которым планируете работать дальше.


    Обратите внимание на чистый диапазон, начиная с канала 4а. У меня он остается чистым даже, если на расстоянии нескольких метров работает старая СВЧ-печь — мощный источник помех в этом диапазоне. А в общем-то, в Интернете рекомендуют выбирать каналы для своих проектов выше «60».



    Если на каналах — шум, но радиомодуль определяется (смотрим преамбулу на мониторе Arduino IDE, подробно тут) — это однозначно копия. Не отчаивайтесь — ее тоже можно запустить.



    Обращаю ваше внимание — на этом этапе не стоит выполнять никаких работ с паяльником. Тем же, кто не увидел похожей картинки и записал на видео процесс распаковки товара, разумно обратиться в торговую точку за заменой или возвратом денег.



    Шаг 2


    По схеме, аналогичной первой, собираем второй радиоузел. Это будет передатчик. В его контроллер загружаем скетч передатчика (под спойлером).


    скетч передатчика
    /*
    Победа над nRF24L01: на три шага ближе, передатчик
    https://habr.com/ru/post/476716/
    */
    
    #include <SPI.h>
    #include <RF24.h>
    RF24 radio(9, 10); // порты D9, D10: CSN CE
    const uint32_t pipe = 111156789; // адрес рабочей трубы;
    
    byte data;
    
    void setup() {
      Serial.begin(115200);
      Serial.println("TransmitterTester ON");
    
      radio.begin();                // инициализация
      delay(2000);
      radio.setDataRate(RF24_1MBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
      radio.setCRCLength(RF24_CRC_8); // размер контрольной суммы 8 bit или 16 bit
      radio.setPALevel(RF24_PA_MAX); // уровень питания усилителя RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX
      radio.setChannel(0x6f);         // установка канала
      radio.setAutoAck(false);       // автоответ
      radio.powerUp();               // включение или пониженное потребление powerDown - powerUp
      radio.stopListening();  //радиоэфир не слушаем, только передача
      radio.openWritingPipe(pipe);   // открыть трубу на отправку
    }
    
    void loop() {
      data = 109;
      radio.write(&data, 1);
      Serial.println("data= " + String(data));
    }
    



    Передатчик без пауз в работе передает сигнал на канале 6f (112).



    Подаем питание на сканер эфира и передатчик. Присмотритесь что творится на канале 6f и соседних с ним каналах. Сканер эфира при включенном передатчике рано или поздно прорисует единички или другие одноразрядные числа в шестнадцатиричном исчислении в области 6f, на который запрограммирован передатчик. Наберитесь терпения на 1 — 2 минуты, особенно при работе со сканером из примеров.




    Увидев сигнал от передатчика делаем следующий шаг.



    Шаг 3



    Загружаем вместо сканера скетч приемника (под спойлером).



    скетч приемника
    /*
    Победа над nRF24L01: на три шага ближе, приемник
    https://habr.com/ru/post/476716/
    */
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    
    RF24 radio(9, 10); // порты D9, D10: CSN CE
    
    const uint32_t pipe = 111156789; // адрес рабочей трубы;
    byte data[1];
    int scn;  //счетчик циклов прослушивания эфира
    int sg;  //счетчик числа принятых пакетов с передатчика
    
    void setup() {
      Serial.begin(9600);
      Serial.println("ReceiverTester ON");
    
      radio.begin();  // инициализация
      delay(2000);
      radio.setDataRate(RF24_1MBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
      radio.setCRCLength(RF24_CRC_8); // размер контрольной суммы 8 bit или 16 bit
      radio.setChannel(0x6f);         // установка канала
      radio.setAutoAck(false);       // автоответ
      radio.openReadingPipe(1, pipe); // открыть трубу на приём
      radio.startListening();        // приём
    }
    
    void loop() {
      if (scn < 1000)
      { // прослушивание эфира
        if (radio.available())
        {
          radio.read(data, 1);
    
          if (data[0] == 109) {
            sg++;
          }
        }
      } else {//всего принято
        {
          Serial.println("Принято: " + String(sg) + " пакетов");
          sg = 0;
        }
        scn = 0;
      }
      scn++;
      delay(20);
    
      if (scn >= 1000) scn = 1000; //защита от переполнения счетчика
    }
    



    Логика работы приемника такая же, как и у сканера эфира, но он в отличие от сканера принимает сигналы только на частоте передатчика 6f и, как и сканер, не посылает автоответ. Скорость обмена информацией и размер контрольной суммы у приемника такие же, как у передатчика. После каждых 1000-и циклов прослушивания счетчик числа циклов обнуляется и выводится инфа о количестве принятых пакетов с передатчика в монитор порта Arduino IDE.



    Включаем передатчик и приемник. Если приемник принимает хотя бы каждый третий пакет — это уже успех. У меня не получилось. Приемник по непонятным причинам принимал максимум 50 пакетов.



    Подумал о увеличении мощности передаваемого сигнала с помощью дополнительной антенны. Для начала, подключил зажимом монтажный провод «папа-мама» к «корню» штатной антенны передатчика. И счастье привалило: сразу 999 принятых пакетов — максимально возможное число из 1 000!



    Юзерам, которые захотят сделать все грамотно, придется поработать. Дополнительная антенна в данном случае — это отрезок коаксиального кабеля с волновым сопротивлением 50 Ом и длиной 115 мм. Антенна подключается к выводу 13 (АNT2) микросхемы nRF24L01+. Схему подключения и номиналы нескольких недостающих smd компонентов, которые надо поставить на плату радиомодуля, можно найти на принципиальной электрической схеме nRF24L01+ тут. Впрочем, есть альтернатива — в магазин за NRF24L01+PA+LNA







    Теперь обязательно припаиваем между пинами GND и VCC обеих радиомодулей по два конденсатора. Керамический конденсатор, выполняющий роль ВЧ-фильтра, емкостью не менее 0,15 мкФ (чем больше, тем лучше) и электролит емкостью около 10 мкФ (можно и больше, но бесполезно) — это НЧ-фильтр. ВЧ-фильтр шунтирует высокочастотные помехи по цепи питания радиомодуля, а НЧ-фильтр сглаживает пульсации питания. Для надежности, цепи питания радиомодулей лучше непосредственно подпаять к пинам контроллеров.



    Тут не могу не упомянуть о решении, предложенном GennPen в комментариях. Это установка на платах nRF24L01+ отсутствующего конденсатора С6. Конденсатор будет выполнять роль пассивной нагрузки. Без пассивной нагрузки модули nRF24L01+ со встроенной антенной «захлебываются» и часто нормально работают только на пониженных мощностях передатчика.





    После того, как удалось установить наилучшую связь в паре передатчик — приемник, можно провести тестирование на определение дальности связи радиомодулей, задав мощность передатчика и свои критерии качества связи, допустим, 300 принятых пакетов из 1000. У меня пара в режиме усилителя PA_MAX обеспечивает связь «999:1000» в пределах квартиры через 3 кирпичных простенка.



    И наконец, несколько слов о своей скромной статистике работы с модулем. В свое время купил 8 шт. радиомодулей nRF24L01+. Приобрел в разное время с интервалом больше года, в разных интернет-магазинах и, судя по стилю маркировки, от разных производителей. Сначала, безрезультатно повозившись с ними и начитавшись, как мучаются с nRF24L01+ другие, без особых проблем перешел на радиомодули LoRa. Жизнь заставила вернуться к nRF24L01+, поскольку заявленный максимальный ток потребления nRF24L01+ ниже, чем у LoRa. Кроме того, nRF24L01+совместим с малопотребляющим nRF52832 и другими. Это особенно важно для автономных систем с ограниченным ресурсом источников. В итоге удалось соединить все 8 радиомодулей по эфиру. Вывод простой — не надо верить мифам, что рынок переполнен неработающими копиями (клонами, репликами, подделками). Да и какой изготовитель станет запускать высокотехнологичное производство, чтобы тиражировать неработающие изделия! Копии, безусловно, есть, например, SE8R01, но они стоят дешевле и продавцы о этом предупреждают — копия.



    Безусловно эти простые шаги не могут гарантировать решение всех проблем с nRF24L01 — мне их и не перечесть, но после того, как их сделаете, будете уверены:



    • радиомодули исправны;
    • подключены верно;
    • уровень сигнала передатчика, чувствительность приемника удовлетворительны и, в случае необходимости, обеспечиваются дополнительными мерами;
    • пара nRF24L01+ работает в режиме «передатчик-приемник» без откликов и ожидания на отклики. Иногда этого достаточно.


    Все! Надеюсь, как и у меня, у вас в дальнейшем поубавится проблем с nRF24L01+ в своих проектах. Успехов!



    Ссылки по теме


    1. Обзор радио модуля NRF24L01+
    2. nRF24L01+: побеждаем модуль.
    3. nRF24L01 и Ардуино: побеждаем модуль (видео)
    4. SE8R01. Подделка под NRF24L01 (видео)
    5. Обзор радио модуля NRF24L01+PA+LNA

    Комментарии 18

      +3
      Шаг 0
      После того как купили — припаять отсутствующий конденсатор пассивной нагрузки 1-2 пик.
      Без него nRF со встроенной антенной захлебывается и часто нормально работает только на пониженных мощностях.
      Заголовок спойлера

        0

        А подскажите, поможет ли решить данную проблему подключения модуля nRF через кренку?

          0
          А подскажите, поможет ли решить данную проблему подключения модуля nRF через кренку?

          Решить проблему в целом — сомневаюсь. Не забывайте о ВЧ-помехах по цепи питания nRF и качестве этого питания, которое определяется мощностью источника.
            0
            Питать ее только через отдельный стабилизатор. На алике nRF часто продают в комплекте со стабилизатором. Остается только напаять конденсаторы: электролит с керамикой по питанию и под антенну. Можно еще саму плату хорошо пропаять. И после этого они адекватно без сбоев начинают работать.

            Заголовок спойлера
            image
          0
          Помимо упомянутых конденсаторов на шину питания, стабильности работы также способствовало экранирование модулей. Простейший способ: заизолировать и обмотать фольгой, соединив ее с внешней частью разъема антенны (речь про NRF24L01+PA+LNA). Если в конкретном случае поможет, можно придумать что-то поприличнее.
            0

            Странно, у меня была только одна проблема — конденсатор не припаял сразу. После этого отлично всё работало, даже меш-сеть с помощью rf24Mesh.

              0
              Да, помню, долго мучался с NRF24L01+PA+LNA.
              Так что конденсаторы по питанию, экранировка всего модуля и не забыть перепаять конденсатор со встроенной антенны на пигтейл.
                0
                Купил Ардуино Нано с модулем NRF24L01 на плате и на удивление модули NRF24L01 заработали без добавочных кондёров и других плясок с бубнами.

                aliexpress.ru/item/4000467425667.html?spm=a2g0s.9042311.0.0.264d33edNJKWUt&_ga=2.5222643.155883689.1614133330-1652522173.1583990324&sku_id=10000001883637041
                  +1
                  MySensor не пробовали?
                  Неплохая низкоуровневая библиотека, которая реализует меш сеть.
                  Работает на NRF24, NRF51 и NRF52 на 2400, а также RFM69 и другие субгигагирцовые модули.
                  MySensor + E73 (NRF52832) очень даже неплохая связка.
                    0
                    Спасибо!
                    NRF52832 уже в пути несколько дней, библиотеку скачал сегодня. Буду работать в этом направлении.
                    +2
                    На самом деле этот модуль очень просто готовить. Всё что нужно сделать — это обязательно вызвать
                    radio.stopListening();

                    в передатчике.

                    Ну и да, после:
                    radio.setAutoAck(false);

                    уже бесполезно выставлять ретраи. Они работают только с включённым autoAck
                    radio.setRetries(0, 15)


                    Так что: НЕ отключаем autoack (по дефолту он и так включен), не меняем настройку ретраев (она нормальная сходу). Просто вызываем stopListening на передатчике, и всё работает как часы.

                    А секрет тут:
                    github.com/nRF24/RF24/blob/master/RF24.cpp#L847

                    Функция stopListening «заодно» включает нулевой пайп. И именно этот пайп используется для того, чтобы получить ответ ACK от приёмника. Вместе с этим начинает нормально работать механизм ретраев и пара модулей будут работать как часы.

                    PS. Необходимости включать нулевой пайп на приёмнике не описана даже в даташите. Да, там описано, что нужно записать в него правильный адрес, но о необходимости его включить — не слова. А без него передатчик с включёнными ретраями будет считать, что отправка провалена, хоть приёмник посылку и получит.
                      0
                      Ваши аргументы не вызывают у меня сомнений. Но перед тем как внести изменения в скетч хотелось проверить их на «железе». Сейчас у меня такой возможности нет. Как только проверю — отредактирую код. Заранее благодарю за понимание.
                      0

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

                        0
                        Это все меняет. Я готов внести изменения. Если не трудно — представьте, пожалуйста, свой вариант setup'a для приемника.
                          –1
                          github.com/makarenya/nrf24_examples/blob/master/nrf24_receiver.ino
                          Тут как раз пара передатчик-приёмник. Сделал специально под проверку
                            0
                            github.com/makarenya/nrf24_examples/blob/master/nrf24_receiver.ino
                            Тут как раз пара передатчик-приёмник. Сделал специально под проверку

                            Я в растерянности — не знаю, что и думать, посмотрев коды вашей пары передатчик-приёмник на Гитхабе. Вернее, не могу понять причин ошибок в «примерах» — они от невнимательности, непонимания или чего то другого. Далее по порядку:

                            • В скетче передатчика функция radio.stopListening(); — обязательна. Без этой функции (вкупе с другими) передатчик будет работать в полнофункциональном полудуплексном режиме. Я об этом дважды написал: набрал буковками «…затем один из пары работающих радиомодулей тестируется на работу в режиме передатчика без ожидания отклика с приемника (шаг 2) …» и в комментарии к функции в скетче: «radio.stopListening(); //радиоэфир не слушаем, только передача». Предполагаю, что ваша «неочевидная магия» тут цитирую: «radio.stopListening(); // Неочевидная магия» неочевидна и магия только для вас.
                            • В скетче приемника тоже явная ошибка – не просчитан банальный сценарий, а именно: отсутствие питания приемника. Светодиод не моргает при инициализации и не горит в цикле. Это свидетельствует вроде о том, что радиомодуль инициализирован и по каким-то причинам не принят пакет с передатчика. На самом деле – нет питания. Поэтому, раз уж занялись переводом инфы скетча с монитора последовательного порта на светодиодную, советую добавить еще один светодиод – индикатор питания, аналог функции Serial.println(«ReceiverTester ON»); Кстати, почему в скетче передатчика не светодиодная индикация, а вывод инфы в монитор порта. Логики нет: в одном узле светодиоды, в другом – монитор порта Ардуино.
                            • О оптимизации кода я молчу. Например, приемник работает 120 миллисекунд, а потом пауза на 100 мсек, что обозначить результат светодиодом. Получается, что приемник в работе 54 процента от всего времени. Время для приема 50 пакетов из 1000, а это реальная ситуация, будет заоблачным. Прикиньте сами. При этом не забудьте, что передатчик у вас работает с задержками в цикле 100 мсек, узлы не синхронизированы и учтите время на выполнение операций в цикле.


                            После просмотра ваших скетчей, понял, что надо более критично относиться к отдельным файлам из Гитхаба. Постарайтесь в ближайшее время что-то предпринять со своими «примерами» на Гитхабе, иначе мне придется зарегистрироваться и выложить нечто похожее там. Успехов!
                              –1

                              Вы и вправду слишком серьёзно относитесь к примерам с гитхаба ;) Назначений у данного примера было — показать минимально достаточный набор настроек и продемонстрировать устойчивость (или неустойчивость) процесса отправки сообщений. При этом скетч должен позволить решить свою задачу: обеспечить контроль успешности приёма-отправки пакетов. Так, чтобы можно было залить пример на две ардуины и посмотреть, потаскав одну из них из комнаты в комнату.
                              Поэтому по порядку:


                              • Вы считаете очевидным, что функцию stopListening вызывать необходимо? То есть у вас есть некоторое априорное знание, что после включения модуль находится в режиме приёма? Или зачем ещё её надо вызывать? Спешу огорчить, согласно даташиту бит PRIM_RX регистра CONFIG инициализируются нулём — то есть модуль после перезагрузки будет находится в режиме передатчика. Я в первом своём сообщении указал, что именно делает функция stopListening, и почему она так сильно нужна для режима с ожиданием ответа приёмника. При radio.setAutoAck(false); она полностью теряет смысл. Включать нулевой канал на приём нужно именно для того, чтобы получать ответы с приёмника. Можете её выкинуть — работоспособность вашего примера никак не измениться.
                              • Я проверял скетч на моей arduino nano, и у неё безо всякого кода есть светодиод индикации питания, зачем мне нужен ещё один? По поводу различия: сериал/светодиод, тут всё просто: один модуль подключен к компу и весьма информативно пишет в сериал всё что с ним происходит. Второй таскается по комнатам. Конечно можно было бы взять второй ноут, но зачем? Тут и так всё понятно — если в течении 120мс не пришло очередного пакета (хотя должен был прийти в течении 100мс) — значит гасим светодиод, показывая что у нас был сбой. Светодиод будет в погашенном состоянии минимум 80мс — достаточно чтобы заметить и даже прикинуть — сколько именно пакетов было пропущено — процесс приёма качественно контролируется визуально. Частое моргание сразу после включения в данном случае — это не подключен NRF24. Вроде все варианты разобраны.
                              • Интервал в 100мс был выбран для того, чтобы можно было без труда визуально детектировать пропавшие пакеты. В конце концов из комнаты в комнату носишься именно с приёмником, так что изначально видишь только этот светодиод. А 120мс — это выбранное наобум значение, большее 100 (по идее и 101мс должна была подойти, но я взял с запасом). Так как передатчик отправляет пакеты раз в 100мс, то неполучение пакета за чуть более время — это признак пропущенного пакета. В целом — советую чуть внимательнее посмотреть этот код и подумать — что он делает.

                              Ну а к вашему коду претензии более простые:


                              • У вас много избыточного: как будто вы пытались подобрать параметры, чтобы оно наконец-то заработало, и как только заработало — оставили всё как есть.
                                Я уже говорил, что stopListening(false), ровно как и setRetries(...) не имеют смысла, если вы вызвали setAutoAck(false).
                              • С другой стороны — я настоятельно рекомендую всё таки не выключать подтверждение приёма, так как в большинстве случаев вам всё равно придётся городить подобную систему поверх. Зачем, если она уже есть на железном уровне?
                              • И ещё про избыточное: ознакомьтесь вот с этим кодом и не делайте то, что и без того сделано за вас: setRetries(5, 15) — уже выставлено и оно является оптимальной настройкой ретраев. powerUp() уже вызван, незачем его вызывать ещё раз. setDataRate(RF24_1MBPS); тоже выставлено. И если вам не надо 2мб/с или 128кб/с — то смело пропускайте. write_register(EN_AA, 0x3F) работает как setAutoAck(true) — так что тоже можете не менять.

                              PS: пока писал вам это всё, нашёл такой коммит: начиная с версии 1.3.12 уже не обязательно вызывать stopListening на передатчике. Магия больше не нужна

                                0
                                «Слова, слова, слова. ...» Уильям Шекспир

                                Я меня только один совет: Вместо того, чтобы оттачивать свой многословный стиль изложения, зайти на Амперку, выбрать одну из многих нерешенных проблем с nRF24L01 и попытаться ее решить. Уверяю – пользы будет больше, притом, для всех.

                                Изначально все ваши претензии к моему коду можно было бы выразить несколькими словами: убери из кода строку setRetries(...) – она лишняя. Что, собственно, я уже давно сделал. Все!

                                А тут многословные монологи, достойные отдельного блога. О магических открытиях, светодиоде на плате Ардуино, таскании по квартире радиомодуля, на котором люди строят радиостанции и прочее, прочее…

                                Поэтому повторюсь -успехов!

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое