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

 
 
 
23

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

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

Доброго вам дня, уважаемые граждане и гости Датагор.ру - этого замечательного сообщества увлечённых людей!
Мы с мальчишками (сыновья 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. Если в вашем распоряжении оказался не упомянутый в таблице микроконтроллер, подключайте, ориентируясь на столбец «вывод».


Для начала создадим две базовые функции, обеспечивающие работу 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 загружен 39 раз.

Заключение

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

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

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

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

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

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

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

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

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

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


Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 3. TFT дисплей 2.8" (240х320) на ILI9341... Битва за урожай закончена, можно продолжить повествование. Полноцветный TFT-дисплей 240×320...
Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST7735... Следующий из рассматриваемых нами модулей обладает полноцветным дисплеем под управлением...
Схема на Датагоре. Новая статья Трансивер 2,4 ГГц Nordic Semiconductor nRF24L01. Перевод таблиц даташита, пояснения и коды для организации сети... Wireless Transceiver Module NRF24L01+ 2.4GHz, 4 шт. на Али Привет, датагорцы! Выкладываю перевод...
Схема на Датагоре. Новая статья Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 3... Wireless Transceiver Module NRF24L01+ 2.4GHz, 4 шт. на Али Приветствую всех настоящих и будущих...
Схема на Датагоре. Новая статья Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2... Продолжаем разговор. Как-то раз мы с пацанами решили соединить радио-модуль «nRF24L01+» вот с таким...
Схема на Датагоре. Новая статья Несколько функций для програмной реализации протокола I2C на AVR... Добрый день, дорогие друзья! Решил поделиться с вами несколькими функция для работы по протоколу...
Схема на Датагоре. Новая статья Частотный детектор на двухзатворном полевом транзисторе... Для демодуляции частотно-модулированных (далее – ЧМ) сигналов традиционно используют дробовый...
Схема на Датагоре. Новая статья Texas Instruments. Руководство по выбору компонентов для аналоговых схем... Операционные усилители, компараторы, буфферы, ЦАП/АЦП преобразователи данных, интерфейсы, схемы...
Схема на Датагоре. Новая статья Сделай сам простой активный фильтр для двухполосного усилителя... В статье речь пойдет об активном фильтре для двухполосного усилителя. Фильтр не нуждается в...
Схема на Датагоре. Новая статья Датчик угла поворота. Сельсин-датчик и приёмник на микроконтроллере.... Схема сельсин-датчика и программа микроконтроллера практически полностью взяты из журнала Радио №4...
Схема на Датагоре. Новая статья Акустическая система с лабиринтом 35ГДН–4 + 2ГД36... Недорогая акустическая система на доступных динамиках с лабиринтом, обладающая хорошим качеством...
Схема на Датагоре. Новая статья TDA7442D+ATmega8. Микропроцессорный регулятор громкости... Привет ВСЕМ!!! Интересно, кому бы не хотелось, чтобы его усь обладал сервисом промышленных...
<
  • Подписчик
17 марта 2016 12:40

Игорь / StalKer-NightMan

Цитата
  • С нами с 15.03.2012
  • Ушёл в реал Пользователь offline
  • 94 комментария
  • 1 публикация
 
  • 0
Хорошая статья. Спасибо.

<
  • Гражданин
17 марта 2016 13:26

Ербол / erbol

Цитата
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 65 комментариев
  • 9 публикаций
 
  • 0
Спасибо, Игорь! smile

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

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

Цитата
  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 1 677 комментариев
  • 264 публикации
 
  • 0
Ербол, спасибо за статью.
Модули на Али заказал, жду продолжения! handshake

<
  • Гражданин
17 марта 2016 17:33

Ербол / erbol

Цитата
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 65 комментариев
  • 9 публикаций
 
  • 0
Спасибо, Игорь! Продолжение - в работе smile

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

Александр / koan51

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

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

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

Цитата
  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 1 677 комментариев
  • 264 публикации
 
  • 0
Цитата: koan51
Файл из архива не открывается, пишет что поврежден.
Архив на тест проходит.
Александр, такие вопросы следует писать мне в личку или через обратную связь или через систему жалоб.

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

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

Сергей / Yamazaki

Цитата
  • С нами с 2.07.2009
  • Ушёл в реал Пользователь offline
  • 146 комментариев
  • 4 публикации
 
  • 0
Ербол, вы упомянали о поделках на этих модулях. Расскажете о них что-нибудь?

<
  • Гражданин
23 марта 2016 00:33

Ербол / erbol

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

<
  • Прохожий
23 марта 2016 00:56

Евгений / demiurg1978

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

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

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

<
  • Гражданин
23 марта 2016 01:19

Ербол / erbol

Цитата
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 65 комментариев
  • 9 публикаций
 
  • 0
Спасибо за полезную информацию, Евгений! smile Приму к сведению

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

Игорь / UncleHarry

Цитата
  • С нами с 28.04.2009
  • Ушёл в реал Пользователь offline
  • 17 комментариев
  • 0 публикаций
 
  • 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
  • Ушёл в реал Пользователь offline
  • 65 комментариев
  • 9 публикаций
 
  • 0
Цитата: UncleHarry
Здравствуйте, Ербол! За статью большое спасибо.

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

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

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

Ербол / erbol

Цитата
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 65 комментариев
  • 9 публикаций
 
  • 0
Игорь, а связь появилась между модулями? smile

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

Игорь / UncleHarry

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

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

Ербол / erbol

Цитата
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 65 комментариев
  • 9 публикаций
 
  • 0
В третьей части как раз ds18b20 будет smile Там, правда, для Ардуино, но код на Си, подходит и под Студию

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

Игорь / UncleHarry

Цитата
  • С нами с 28.04.2009
  • Ушёл в реал Пользователь offline
  • 17 комментариев
  • 0 публикаций
 
  • 0
Ардуино предполагается просто как аппаратная платформа? Или с использованием ардуиновских библиотек?

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

Ербол / erbol

Цитата
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 65 комментариев
  • 9 публикаций
 
  • 0
В части общения с термометром и радио-модулем как платформа, а вывод на терминал - через ардуиновскую библиотеку

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

Игорь / UncleHarry

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

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

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

Ербол / erbol

Цитата
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 65 комментариев
  • 9 публикаций
 
  • 0
Игорь, я исчерпал лимит сообщений. Если не хочется ждать до 3-й части, напишите мне на erbol_ts@mail.ru, а ещё лучше в Агенте по этому же адресу - я вам куски по ds18b20 скину smile

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

Игорь / UncleHarry

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

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

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

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

Цитата
  • С нами с 5.01.2017
  • Ушёл в реал Пользователь offline
  • 1 комментарий
  • 0 публикаций
 
  • 0
отлично всё расписано, один вопрос, ваш код под CVAVR нужно переделывать?

<
  • Гражданин
9 января 2017 13:07

Ербол / erbol

Цитата
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 65 комментариев
  • 9 публикаций
 
  • 0
Цитата: Vlad-Libra
отлично всё расписано, один вопрос, ваш код под CVAVR нужно переделывать?

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

<
  • Гражданин
20 февраля 2017 17:39

Тимур / maddiego

Цитата
  • С нами с 2.08.2016
  • Ушёл в реал Пользователь offline
  • 18 комментариев
  • 8 публикаций
 
  • 0
Цитата: demiurg1978
На модулях с антеннами вроде как родные чипы. На модуле без антенны аналог, Si24R1.


Очень заинтересовали данные модули и я нашёл в Интернете фотографию, слева вроде оригинал, справа аналог на Si24R1. Видно даже что на плате нет маркировки и чипы более дешёвые.



Заказал парочку, буду химичить yum

Добавление комментария


Налетай! Паяльники, станции, жала с доставкой
  • smilelolbyewinkyahoocoollaughing
    crazybadcryingsadirefulsickstraight
    ballooncakegooddrinksmailbombsun
    nightrainstarscolddashguitar-manhandshake
    musicnegativenopardonshoksleepunknown
    wackoyawnblushbullyhashsmokingwhew
Скопируйте текст вашего комментария на случай неверного ответа на контрольный вопрос.