Владимир Бойчук
Победа над 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 к плате Ардуино или любому прототипу, собранному, допустим, на контроллере ATMEGA328P. Я собрал два образца на платах для прототипирования на контроллере ATMEGA328P по схеме контроллер + резонатор. Один образец подключаю к компу через плату Arduino UNO, а второй - через конвертор USB/TTL.
Мощность стабилизатора платы Arduino UNO вполне приемлема для подключения дополнительной импульсной нагрузки такой, как nRF24L01+ c адаптером 5В/3,3В для этого модуля или без адаптера.
На мониторе последовательного порта Arduino IDE увидите нечто похожее:
Если вы увидели похожую картинку - тест на работоспособность (исправность) радиомодуля и правильность его подключения пройден успешно. Замените радиомодуль другим, с которым планируете работать дальше.
Обратите внимание на чистый диапазон, начиная с канала 4а. У меня он остается чистым даже, если на расстоянии нескольких метров работает старая СВЧ-печь - мощный источник помех в этом диапазоне. А в общем-то, в Интернете рекомендуют выбирать каналы для своих проектов выше "60".
Если на каналах - шум, но радиомодуль определяется (смотрим преамбулу на мониторе Arduino IDE, подробно тут) - это однозначно копия (подделка). Не отчаивайтесь - ее тоже можно запустить.
Обращаю ваше внимание - на этом этапе не стоит выполнять никаких работ с паяльником. Тем же, кто не увидел похожей картинки и записал на видео процесс распаковки товара, разумно обратиться в торговую точку за заменой или возвратом денег.
Шаг 2
По схеме, аналогичной первой, собираем второй радиоузел. Это будет передатчик. В его контроллер загружаем скетч передатчика.
Передатчик без пауз в работе передает сигнал на канале 6f (112).
Подаем питание на сканер эфира и передатчик. Присмотритесь что творится на канале 6f и соседних с ним каналах. Сканер эфира при включенном передатчике рано или поздно прорисует единички или другие одноразрядные числа в шестнадцатиричном исчислении в области 6f, на который запрограммирован передатчик. Наберитесь терпения на 1 - 2 минуты, особенно при работе со сканером из примеров.
Увидев сигнал от передатчика делаем следующий шаг.
Шаг 3
Загружаем вместо сканера скетч приемника.
Логика работы приемника такая же, как и у сканера эфира, но он в отличие от сканера принимает сигналы только на частоте передатчика 6f и, как и сканер, не посылает автоответ. Скорость обмена информацией и размер контрольной суммы у приемника такие же, как у передатчика. После каждых 1000-и циклов прослушивания счетчик числа циклов обнуляется и выводится инфа о количестве принятых пакетов с передатчика в монитор порта Arduino IDE.
Включаем передатчик и приемник. Если приемник принимает хотя бы каждый третий пакет - это уже успех. У меня не получилось. Приемник по непонятным причинам принимал максимум 50 пакетов.
Подумал о увеличении мощности передаваемого сигнала с помощью дополнительной антенны. Для начала, подключил зажимом монтажный провод "папа-мама" к "корню" штатной антенны. И счастье привалило - сразу 999 принятых пакетов!
Юзерам, которые захотят сделать все грамотно, придется поработать. Дополнительная антенна в данном случае - это отрезок коаксиального кабеля с волновым сопротивлением 50 Ом и длиной 115 мм. Антенна подключается к выводу 13 (АNT2) микросхемы nRF24L01+. Схему подключения и номиналы нескольких недостающих smd компонентов, которые надо поставить на плату радиомодуля, можно найти на принципиальной электрической схеме nRF24L01+ тут. Впрочем, есть альтернатива - в магазин за NRF24L01+PA+LNA
Теперь обязательно припаиваем между пинами GND и VCC обеих радиомодулей по два конденсатора. Керамический конденсатор, выполняющий роль ВЧ-фильтра, емкостью не менее 0,15 мкФ (чем больше, тем лучше) и электролит емкостью около 10 мкФ (можно и больше, но бесполезно) - это НЧ-фильтр. ВЧ-фильтр шунтирует высокочастотные помехи по цепи питания радиомодуля, а НЧ-фильтр сглаживает пульсации питания. Для надежности, цепи питания радиомодулей лучше непосредственно подпаять к пинам контроллеров.
И наконец, несколько слов о своей скромной статистике работы с модулем. В свое время купил 8 шт. радиомодулей nRF24L01+. Приобрел в разное время с интервалом больше года, в разных интернет-магазинах и, судя по стилю маркировки, от разных производителей. Сначала, безрезультатно повозившись с ними и начитавшись, как другие мучаются с nRF24L01+ без особых проблем перешел на радиомодули LoRa. Жизнь заставила вернуться к nRF24L01+ - заявленный максимальный ток потребления nRF24L01+ 13,5 мА - это ниже, чем у LoRa. Кроме того, nRF24L01+совместим с малопотребляющим nRF52832 и другими. Это особенно важно для автономных систем с ограниченным ресурсом источников. В итоге удалось соединить все 8 радиомодулей по эфиру. Вывод простой - не надо верить мифам, что рынок переполнен неработающими копиями (клонами, репликами, подделками). Да и какой изготовитель станет запускать высокотехнологичное производство, чтобы тиражировать неработающие изделия! Копии, безусловно, есть, например, SE8R01, но они стоят дешевле и продавцы о этом предупреждают - копия. Спрос определяет предложение.
Безусловно эти простые шаги не могут гарантировать решение всех проблем с nRF24L01 - мне их и не перечесть, но после того, как их сделаете, будете уверены:
- радиомодули исправны;
- подключены верно;
- уровень сигнала передатчика, чувствительность приемника удовлетворительны и, в случае необходимости, обеспечиваются дополнительной антенной;
- пара nRF24L01+ работает в режиме "передатчик-приемник" без откликов и их ожидания. Иногда этого достаточно.
Все! Надеюсь, как и у меня, у вас в дальнейшем поубавится проблем с nRF24L01 в своих проектах. Успехов!
Ссылки по теме
- Обзор радио модуля NRF24L01+
- nRF24L01+ : побеждаем модуль.
- nRF24L01 и Ардуино: побеждаем модуль (видео)
- SE8R01. Подделка под NRF24L01 (видео)
- Обзор радио модуля NRF24L01+PA+LNA