Мы с мальчишками (сыновья 9 и 14 лет) в поделках, требующих беспроводную связь, используем вот такой радио-модуль на базе трансивера nRF24L01+ от Nordic Semiconductor.
Внимание наше он привлек по нескольким причинам:
• Низкая цена.
• Габариты – 15х29 мм (есть также вариант 12х15 мм) - в сочетании с микроконтроллером (МК) небольших размеров (например, ATtiny85) позволяют создавать вполне миниатюрные радио-блоки.
• Наличие всей необходимой обвязки, включая встроенную антенну.
• Низкое энергопотребление – 0.9 мкA в режиме Power Down – важный параметр при создании устройств с автономным питанием.
• Радиус действия до 30 м в помещении и 100 м на улице, с лихвой покрывает наши текущие потребности. Если этого недостаточно, существует вариант с усилителем RFX2401C и внешней антенной с заявленной дальностью до 1100 м.
О том, как настроить и использовать этот радио-модуль, я и хочу рассказать.
Содержание статьи / Table Of Contents
↑ Основные характеристики трансивера nRF24L01+
• Рабочая частота - в диапазоне 2400-2525 МГц.• Максимальная мощность в режиме передачи – 0 dBm.
• Максимальная чувствительность приёмника - (-94 dBm).
• Максимальная скорость передачи данных - 2 Мбит/с.
• Максимальная длина предаваемых за один раз данных - 32 байта.
• Количество одновременно доступных каналов связи - 6.
• Напряжение питания - от 1.9 до 3.6 Вольт.
Детальнее с характеристиками nRF24L01+ можно ознакомиться в документации производителя. См. даташит в файлах к статье.
↑ Маркировка и назначение выводов модуля
• SCK, MISO, MOSI, СSN - линии интерфейса SPI. Толерантны к напряжению 5В, однако в этом случае рекомендуемое напряжение питания трансивера - от 2.7 до 3.3В.
• CE - управляющий вход. Переключает трансивер, в зависимости от текущих настроек последнего, в один из четырех режимов - Standby-I, Standby-II, передатчик, приемник.
• IRQ - выход прерываний. Если трансивер находится в режиме передатчика, появление на этом выводе низкого уровня свидетельствует об одном из двух событий – 1) пакет данных успешно отправлен, 2) разрешенное количество попыток отправки израсходовано, но пакет данных так и не был отправлен. Для nRF24L01+ в режиме приёмника низкий уровень на выводе IRQ означает получение пакета данных.
• VCC, GND - напряжение питания и земля. Несколько раз я подал по невнимательности +5В на вывод VCC. Радио-модуль такое насилие не убило, но работать корректно при этом он все-же отказался. Обычно мы стараемся подобрать все остальные узлы устройства, включая МК, работающие, как и nRF24L01+, от 3В. Такой подход позволяет упростить общую схему и уменьшить энергопотребление. В противном случае - приходится использовать преобразователи напряжения.
↑ Подключение и программирование nRF24L01+
Прежде, чем перейти к вопросам подключения и программирования трансивера, напомню, что МК от Atmel, а именно об их применении пойдёт речь, бывают как со встроенным аппаратным SPI, так и без оного. Более того, иногда бывает предпочтительным использование программного SPI даже при наличии аппаратного. Поэтому, чтобы статья была максимально полезной, будем рассматривать три способа организации этого интерфейса:1. Аппаратный SPI на примере ATmega8 и ATmega328P,
2. SPI на базе модуля USI - своеобразного полу-фабриката, который путём не сложных действий можно преобразовать в SPI. Такой модуль имеется, в частности, на борту ATtiny2313, ATtiny25, ATtiny45 и ATtiny85.
3. Программный SPI. Этот вариант подойдёт для любого МК.
Что касается схемы сопряжения, то для начала мы остановимся на варианте, когда на каждый вывод радио-модуля приходится вывод МК. Это облегчит понимание сути вопроса и упростит код. А уже когда мы разберемся с программированием трансивера, я покажу менее разорительный способ подключения.
Итак, соединяем МК и радио-модуль по одной из подходящих вам схем, приведённых в Таблице №1, не забывая про выводы VCC и GND. Если в вашем распоряжении оказался не упомянутый в таблице микроконтроллер, подключайте, ориентируясь на столбец «вывод».
Для начала создадим две базовые функции, обеспечивающие работу SPI - 1) инициализации регистров и выводов, участвующих в протоколе и 2) обмена байтом данных.
Но, перед этим заглянем в спецификацию и выпишем определяемые ею параметры интерфейса:
1. Активный уровень вывода CSN – низкий.
2. Полярность тактового импульса – положительная, а обмен данными происходит по его переднему фронту.
3. Первый в очереди при записи/чтении – старший бит (как в командном слове, так и в байте данных).
4. В случае многобайтных данных первым записывается/считывается младший байт.
5. Максимальная скорость SPI - 10Мбит/с. При тактовой частоте МК в 16МГц мне не понадобилось организовывать задержки, так что привожу этот параметр в качестве общей информации.
Ну что ж, знаниями вооружились - начнём программировать. Местами я буду переносить повествование в комментарии к коду, так что пусть вас не пугает их избыточность.
Прописываем макросы.
Теперь две вышеуказанные функции для аппаратного SPI.
Они же - для SPI на базе USI.
И для программного SPI.
Собственно говоря, на этом все отличия в коде для МК с разным типом SPI исчерпаны. Остальная часть программы для всех трёх вариантов будет абсолютно одинаковой.
Теперь, когда мы знаем, как записывать в трансивер команды и данные, и получать информацию о состоянии его регистров, нужно разобраться, какими именно командами и регистрами необходимо оперировать. И тех, и других у nRF24L01+ хватает, но мы пока будем использовать только 7 команд и 3 регистра (смотри Таблицы 2, 3), чего вполне достаточно для организации простейшей связи между двумя радио-модулями.
Добавим в наш список макросов данные из вышеприведенных таблиц и продолжим написание программы.
Из Таблицы 2 вытекает три важных момента:
1. Обращение МК к nRF24L01+ возможно в двух форматах:
• команда,
• команда + байты данных.
2. По направлению движения информации команды можно разбить на две группы:
• команды чтения из трансивера
• команды записи в трансивер
3. Каждый раз, во время записи в него любой команды, трансивер выдаёт на линию MISO содержимое своего регистра STATUS.
Учтём это и, используя функцию SPI_byte(), создадим ещё три, назначение которых понятно из названий.
Ну вот мы и готовы оформить полноценный код, включая обработчик прерываний, для передатчика.
А теперь полноценный код для приёмника.
Вот, пожалуй, и всё. Конечно, мы пробежались по самым верхам, не вникая в нюансы. Но, если обстоятельно, со всеми подробностями и возможными вариантами изложить хотя бы то, что есть в спецификации, то на выходе получится вполне себе увесистый талмуд, читать который вы навряд ли захотите.
Поэтому, если у этой темы и есть продолжение, то я вижу его в формате ответов на вопросы, которые могут у вас возникнуть.
↑ Пара слов для поклонников Arduino
Мне известны две библиотеки (RF24.h и Mirf.h) для работы Arduino с nRF24L01+, хотя не исключено, что есть и другие. Обе библиотеки, на мой взгляд, работают адекватно и достаточно полно охватывают возможности трансивера.Однако, если вы решите написать скетч для не «родного», но поддерживаемого Arduino IDE МК (например, ATtiny25, ATtiny45 и ATtiny85), то эти библиотеки работать по понятным причинам не будут. В этом смысле материалы по программному SPI, изложенные в настоящей статье, могут вам пригодиться.
↑ Ссылки
https://www.nordicsemi.com/eng/Products/2.4GHz-RF/nRF24L01P↑ Файлы
Даташит на nRF24L01+🎁nrf24l01p_product_specification_1_0.7z 961.96 Kb ⇣ 107
↑ Заключение
В следующей части я, как и обещал, расскажу о более экономных способах соединения радио-модуля с МК.Что касается аспектов использования радио-модуля, то тут есть только один предел – ваша фантазия, а она, как я убедился, у жителей Датагора безграничная.
Удачи всем вам!
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.