» » Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 1

 
 
 

Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 1

Разместил erbol 17 марта 2016. Просмотров: 6526

22 Доброго вам дня, уважаемые граждане и гости Датагор.ру - этого замечательного сообщества увлечённых людей!
Мы с мальчишками (сыновья 9 и 14 лет) в поделках, требующих беспроводную связь, используем вот такой радио-модуль на базе трансивера nRF24L01+ от Nordic Semiconductor.

Внимание наше он привлек по нескольким причинам:
Низкая цена.
• Габариты – 15х29 мм (есть также вариант 12х15 мм) - в сочетании с микроконтроллером (МК) небольших размеров (например, ATtiny85) позволяют создавать вполне миниатюрные радио-блоки.
• Наличие всей необходимой обвязки, включая встроенную антенну.
• Низкое энергопотребление – 0.9 мкA в режиме Power Down – важный параметр при создании устройств с автономным питанием.
• Радиус действия до 30 м в помещении и 100 м на улице, с лихвой покрывает наши текущие потребности. Если этого недостаточно, существует вариант с усилителем RFX2401C и внешней антенной с заявленной дальностью до 1100 м.

О том, как настроить и использовать этот радио-модуль, я и хочу рассказать.

Основные характеристики трансивера nRF24L01+

• Рабочая частота - в диапазоне 2400-2525 МГц.
• Максимальная мощность в режиме передачи – 0 dBm.
• Максимальная чувствительность приёмника - (-94 dBm).
• Максимальная скорость передачи данных - 2 Мбит/с.
• Максимальная длина предаваемых за один раз данных - 32 байта.
• Количество одновременно доступных каналов связи - 6.
• Напряжение питания - от 1.9 до 3.6 Вольт.
Детальнее с характеристиками nRF24L01+ можно ознакомиться в документации производителя. См. даташит в файлах к статье.

Маркировка и назначение выводов модуля

Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 1

• 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. Если в вашем распоряжении оказался не упомянутый в таблице микроконтроллер, подключайте, ориентируясь на столбец «вывод».

Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 1

Для начала создадим две базовые функции, обеспечивающие работу SPI - 1) инициализации регистров и выводов, участвующих в протоколе и 2) обмена байтом данных.

Но, перед этим заглянем в спецификацию и выпишем определяемые ею параметры интерфейса:
1. Активный уровень вывода CSN – низкий.
2. Полярность тактового импульса – положительная, а обмен данными происходит по его переднему фронту.
3. Первый в очереди при записи/чтении – старший бит (как в командном слове, так и в байте данных).
4. В случае многобайтных данных первым записывается/считывается младший байт.
5. Максимальная скорость SPI - 10Мбит/с. При тактовой частоте МК в 16МГц мне не понадобилось организовывать задержки, так что привожу этот параметр в качестве общей информации.

Ну что ж, знаниями вооружились - начнём программировать. Местами я буду переносить повествование в комментарии к коду, так что пусть вас не пугает их избыточность.

Прописываем макросы.
Теперь две вышеуказанные функции для аппаратного SPI.
Они же - для SPI на базе USI.
И для программного SPI.
Собственно говоря, на этом все отличия в коде для МК с разным типом SPI исчерпаны. Остальная часть программы для всех трёх вариантов будет абсолютно одинаковой.

Теперь, когда мы знаем, как записывать в трансивер команды и данные, и получать информацию о состоянии его регистров, нужно разобраться, какими именно командами и регистрами необходимо оперировать. И тех, и других у nRF24L01+ хватает, но мы пока будем использовать только 7 команд и 3 регистра (смотри Таблицы 2, 3), чего вполне достаточно для организации простейшей связи между двумя радио-модулями.
Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 1

Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 1


Добавим в наш список макросов данные из вышеприведенных таблиц и продолжим написание программы.
Из Таблицы 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+
Файловый сервис доступен только полноправным членам сообщества и подписчикам.
Пожалуйста, ознакомьтесь с условиями доступа.


Заключение

В следующей части я, как и обещал, расскажу о более экономных способах соединения радио-модуля с МК.

Что касается аспектов использования радио-модуля, то тут есть только один предел – ваша фантазия, а она, как я убедился, у жителей Датагора безграничная.

Удачи всем вам!

Об авторе

Ербол (erbol)
Актобе, Казахстан
Мне 50 лет. Родился и вырос в г. Актюбинск (ныне - Актобе), Казахстан. Женат, воспитываю четверых прекрасных детей.

С программированием и электроникой имею может и не отдаленные, но весьма эпизодические отношения: в далекие и бурные 90-е годы аж прошлого века посчастливилось участвовать в автоматизации экспериментальной установки с использованием микропроцессорного комплекта КР580.

А пару лет назад мои сорванцы вдруг заинтересовались микроконтроллерами. Пришлось из дальних уголков памяти вытаскивать свои старые познания и стряхивать с них пыль.
 

Понравилось? Палец вверх!

  • всего лайков: 82

6 апреля 2016 изменил Datagor. Исправлены все замеченные на сегодня недостатки.

Поделись с друзьями!


Связанные материалы:


Программная реализация протокола SPI на AVR в CodeVisionAVR

Всем коллегам и согражданам привет! Увлёкся я изучением протоколов. Про реализацию ...

Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST7735

Следующий из рассматриваемых нами модулей обладает полноцветным дисплеем под управлением...

Трансивер 2,4 ГГц Nordic Semiconductor nRF24L01. Перевод таблиц даташита, пояснения

Привет, датагорцы! Выкладываю перевод таблиц из спецификации nRF24L01+, файл с пояснениями и...

Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic

Приветствую всех настоящих и будущих поклонников отладочной платы Arduino! Сегодня,...

Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic

Продолжаем разговор. Как-то раз мы с пацанами решили соединить радио-модуль «nRF24L01+»...

Несколько функций для програмной реализации протокола I2C на AVR

Добрый день, дорогие друзья! Решил поделиться с вами несколькими функция для работы...

Частотный детектор на двухзатворном полевом транзисторе

Для демодуляции частотно-модулированных (далее – ЧМ) сигналов традиционно используют дробовый...

Texas Instruments. Руководство по выбору компонентов для аналоговых схем

Операционные усилители, компараторы, буфферы, ЦАП/АЦП преобразователи данных, интерфейсы, схемы...

Сделай сам простой активный фильтр для двухполосного усилителя

В статье речь пойдет об активном фильтре для двухполосного усилителя. Фильтр не нуждается в...

Датчик угла поворота. Сельсин-датчик и приёмник на микроконтроллере.

Схема сельсин-датчика и программа микроконтроллера практически полностью взяты из журнала Радио №4...

Акустическая система с лабиринтом 35ГДН–4 + 2ГД36

Недорогая акустическая система на доступных динамиках с лабиринтом, обладающая хорошим качеством...

TDA7442D+ATmega8. Микропроцессорный регулятор громкости

Привет ВСЕМ!!! Интересно, кому бы не хотелось, чтобы его усь обладал сервисом промышленных...
<
  • Подписчик
17 марта 2016 12:40

Игорь / StalKer-NightMan

  • Регистрация: 15.03.2012
  • Публикаций: 1
  • Комментариев: 84
 
  • 0
Хорошая статья. Спасибо.

<
  • Бонус
17 марта 2016 13:26

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Спасибо, Игорь! smile

<
  • Главный редактор
17 марта 2016 15:55

Игорь Петрович Котов / Datagor

  • Регистрация: 25.02.2011
  • Публикаций: 262
  • Комментариев: 1607
 
  • 0
Ербол, спасибо за статью.
Модули на Али заказал, жду продолжения! handshake

<
  • Бонус
17 марта 2016 17:33

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Спасибо, Игорь! Продолжение - в работе smile

<
  • Гражданин
18 марта 2016 19:07

Александр / koan51

  • Регистрация: 18.03.2010
  • Публикаций: 5
  • Комментариев: 60
 
  • 0
Спасибо за хорошую статью.
Файл из архива не открывается, пишет что поврежден.
Архив на тест проходит.

<
  • Главный редактор
18 марта 2016 20:42

Игорь Петрович Котов / Datagor

  • Регистрация: 25.02.2011
  • Публикаций: 262
  • Комментариев: 1607
 
  • 0
Цитата: koan51
Файл из архива не открывается, пишет что поврежден.
Архив на тест проходит.
Александр, такие вопросы следует писать мне в личку или через обратную связь или через систему жалоб.

Ваше сообщение не подтверждается. С файлом и архивом всё в порядке.

<
  • Гражданин
22 марта 2016 19:58

Сергей / Yamazaki

  • Регистрация: 2.07.2009
  • Публикаций: 3
  • Комментариев: 136
 
  • 0
Ербол, вы упомянали о поделках на этих модулях. Расскажете о них что-нибудь?

<
  • Бонус
23 марта 2016 00:33

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Добрый вечер, Сергей! Что может заинтересовать пацанов 9 и 14 лет? Машинки, элементы умного дома. Недавно кормушку для рыбок закончили, которая по совместительству выводит на TFT-дисплей температуру за окном. Как то так smile

<
  • Кандидат
23 марта 2016 00:56

Евгений / demiurg1978

  • Регистрация: 16.02.2014
  • Публикаций: 0
  • Комментариев: 5
 
  • 0
Родные чипы NRF24 дорогие. Поэтому, если задешево купили модули, то однозначно на чипах-аналогах. Когда делал один заказ, заказали модули с антеннами. Но их нужно было ждать. Поэтому, чтобы не ждать, купил в магазине модуль без антенны. Соображение было такое: чипы одинаковые, потренируюсь на этом. Программу написал, чтение-запись регистров прошло без проблем. А вот когда дело дошло передачи данных, тут всплыли нюансы. На модулях с антеннами вроде как родные чипы. На модуле без антенны аналог, Si24R1.

Момент первый. Если модуль с антенной настроен на прерывания, то до установки пина модуля IRQ регистр статуса читать нельзя.

Момент второй. Выявил совершенно случайно и после долгих поисков ошибки в программе. Нельзя использовать слово "TEST". Иначе модуль зависает на несколько секунд. Судя по всему это заводская команда для проверки работоспособности модулей. Более подробно я не разбирался, выявил причину и успокоился.

<
  • Бонус
23 марта 2016 01:19

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Спасибо за полезную информацию, Евгений! smile Приму к сведению

<
  • Гражданин
2 апреля 2016 14:58

Игорь / UncleHarry

  • Регистрация: 28.04.2009
  • Публикаций: 0
  • Комментариев: 17
 
  • 0
Здравствуйте, Ербол! За статью большое спасибо.

Но есть одна неточность в определении макросов

// макрофункции установки/сброса выводов
#define sbi(pin) SPI_PORT |= (1<<pin)
#define cbi(pin) SPI_PORT &= ~(1<<pin)

SPI_PORT нигде не определено, при замене в этих дефайнах SPI_PORT на nRF_PORT все компилируется без ошибок.

Жду продолжения материала по работе с этими модулями! drinks

<
  • Бонус
2 апреля 2016 16:15

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Цитата: UncleHarry
Здравствуйте, Ербол! За статью большое спасибо.

Но есть одна неточность в определении макросов...

Добрый день, Игорь! smile
Спасибо за обнаруженную неточность! Поправки будут внесеныhandshake
Продолжение на подходе drinks

<
  • Бонус
2 апреля 2016 17:58

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Игорь, а связь появилась между модулями? smile

<
  • Гражданин
2 апреля 2016 18:17

Игорь / UncleHarry

  • Регистрация: 28.04.2009
  • Публикаций: 0
  • Комментариев: 17
 
  • 0
Пока в процессе запуска. У меня Мега8 на самодельной макетке и Мега88 на самодельной макетке. Пока что Мегу8 надо поднять, дата-логгером буду смотреть общение меги и модуля по SPI. Уже бы поднял, но отвлекают домашние дела. Сегодня надеюсь запустить все это хозяйство. Отпишусь, как заработает.
Было бы здорово, если бы к статье какой-нибудь полностью рабочий проект приложить. К примеру, термометр с одним удаленным датчиком (мега88+DS18B20). В эту сторону я предполагаю двинуться в продолжении работы с этими модулями. blush

<
  • Бонус
2 апреля 2016 18:24

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
В третьей части как раз ds18b20 будет smile Там, правда, для Ардуино, но код на Си, подходит и под Студию

<
  • Гражданин
2 апреля 2016 18:48

Игорь / UncleHarry

  • Регистрация: 28.04.2009
  • Публикаций: 0
  • Комментариев: 17
 
  • 0
Ардуино предполагается просто как аппаратная платформа? Или с использованием ардуиновских библиотек?

<
  • Бонус
2 апреля 2016 18:53

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
В части общения с термометром и радио-модулем как платформа, а вывод на терминал - через ардуиновскую библиотеку

<
  • Гражданин
2 апреля 2016 19:21

Игорь / UncleHarry

  • Регистрация: 28.04.2009
  • Публикаций: 0
  • Комментариев: 17
 
  • 0
Цитата: erbol
В части общения с термометром и радио-модулем как платформа, а вывод на терминал - через ардуиновскую библиотеку

Неплохо! Будем ждать новую статью!

<
  • Бонус
2 апреля 2016 19:26

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Игорь, я исчерпал лимит сообщений. Если не хочется ждать до 3-й части, напишите мне на erbol_ts@mail.ru, а ещё лучше в Агенте по этому же адресу - я вам куски по ds18b20 скину smile

<
  • Гражданин
2 апреля 2016 19:50

Игорь / UncleHarry

  • Регистрация: 28.04.2009
  • Публикаций: 0
  • Комментариев: 17
 
  • 0
Цитата: erbol
Игорь, я исчерпал лимит сообщений. Если не хочется ждать до 3-й части, напишите мне на erbol_ts@mail.ru, а ещё лучше в Агенте по этому же адресу - я вам куски по ds18b20 скину smile

Такая же ерунда с лимитом сообщений (привет, модератор! bye ). На связь в агент выйду чуть позже сегодня, заранее спасибо! drinks

<
  • Кандидат
5 января 2017 15:50

Владислав / Vlad-Libra

  • Регистрация: 5.01.2017
  • Публикаций: 0
  • Комментариев: 1
 
  • 0
отлично всё расписано, один вопрос, ваш код под CVAVR нужно переделывать?

<
  • Бонус
9 января 2017 13:07

Ербол / erbol

  • Регистрация: 11.12.2014
  • Публикаций: 7
  • Комментариев: 58
 
  • 0
Цитата: Vlad-Libra
отлично всё расписано, один вопрос, ваш код под CVAVR нужно переделывать?

Спасибо, Владислав!) Я не работал в CodeVision, но из того, что видел, могу предположить следующее. Поскольку непосредственного обращения к отдельным пинам в коде нет (т.е. специфические конструкции CV типа "PORTB.1" отпадают), а обращение к портам в CV и AtmelStudio одинаковые (например, PORTx =| (value << pin), то переделка вроде как не потребуется. Хотя, лучше всё-же обратиться к специалистам)

Информация
Вы не можете участвовать в комментировании. Вероятные причины:
— Администратор остановил комментирование этой статьи.
— Вы не авторизовались на сайте. Войдите с паролем.
— Вы не зарегистрированы у нас. Зарегистрируйтесь.
— Вы зарегистрированы, но имеете низкий уровень доступа. Получите полный доступ.