nRF24L01+ ATMEGA + Raspberry Pi

Содержание

nRF24L01+ — радио модуль, работающий на частоте 2.4ГГц. Позволяет передавать информацию в обоих направлениях и объединять несколько устройств одновременно.

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

  • Рабочая частота — 2.4ГГц. Возможность выбора одного из 126 каналов (при скорости 2Mbps используются два канала)
  • Возможность работать на одном канале с 6-ю устройствами
  • Скорость передачи данных — 250kbps, 1Mbps, 2Mbps
  • Несколько режимов мощности (влияет на рабочую дистанцию)
  • Дистанция — до 100 метров на открытом пространстве, до 30 метров в помещении. На практике уверенно "пробивает" 2 железобетонных стены на скорости 1Mbps
  • Питание — от 1.9 до 3.6B. Максимальный ток — 13.5мA, 26мкА в режиме standby, минимальный — 900нА в режиме power down
  • Интерфейс взаимодействия с микроконтроллером — SPI
  • Входы выдерживают 5В, но питание модуля не более 3.6В
  • Максимальная длинна пакета данных — 32 байта
  • Цена модуля — $1- $2

Принцип работы и основные настройки nRF24L01 +

NRF24L01plus03 NRF24L01plus01

Частота 2.4ГГц очень популярна и на ней работает достаточно большое количество приборов, например: WiFi, радиоуправляемые модели, и тому подобное. Как они не мешают друг другу? Дело в том, что частота 2.4ГГц — это условное обозначение. На самом деле, имеется в виду диапазон частот, близкий к 2.4ГГц. nRF24L01+ работает на частотах 2.400-2.4835ГГц. Частота, на которой будут работать ваши модули, определяется номером канала. Каналы имеют шаг в 1МГц. То есть если Вы выбираете канал 0 — это частота 2.400ГГц, если канал 76 — 2.476ГГц. Разумеется, нужно выбирать свободную волну (канал) — иначе связь будет не стабильной или вообще отсутствовать.

Вы можете выбрать одну из трех скоростей передачи данных. Чем меньше скорость — тем больше чувствительность. То есть, при скорости 250kbps модули будут работать на большей дистанции, чем при более высоких скоростях.

На дальность работы модулей также влияет настройки выходной мощности модуля. Вы можете выбрать мощность в зависимости от приоритетов. То есть, если для вас важнее максимальная дальность, то надо выбрать максимальную мощность. Если приоритетной является экономичность, а дальность — несколько метров, разумно выбрать меньшую мощность сигнала. Интересное наблюдение в режиме приема данных (RX) модуль потребляет больший ток, чем в режиме передачи (TX).

Модуль nRF24L01+ в один момент времени может находиться в одном из режимов:

Power Down — выключен Standby — спящий режим RX Mode — режим ресивера (приемника) TX Mode — режим трансмиттера (передатчика)

Диаграмма переходов из режима в режим изображенны на рисунке:

NRF24L01plus_modes

Информационный пакет, который передает модуль nRF24L01+ имеет следующий формат:

NRF24L01plus_paket

Preamble — Преамбула представляет собой последовательность битов и используется для синхронизации демодуляторов приемников.

Address — Адрес приемника. Адрес гарантирует, что пакет получит нужен приемник. Вы можете настроить длину адреса 3, 4 или 5 байт. Надо стараться чтобы адреса были уникальны. Но иногда Адреса могут быть одинаковые в нескольких nRF24L01+ если этого требуют Ваши задачи.

Packet Control Field — контрольное поле. Содержит: 6 бит, определяющих длину пакета (имеется в виду длина пакета полезных данных (от 0 до 32 байт)); 2 бита PID, используемые для определения является ли пакет новым или пересланным повторно; 1 бит — флаг NO_ACK.

Payload — полезный "груз". То есть данные, которые передает микроконтроллер. Может быть от 0 до 32 байт. Длину Payload можно настроить.

CRC — CRC является обязательным механизмом обнаружения ошибок в пакете. Длина CRC — 1 или 2 байта и зависит от общей длины пакета.

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

Если одновременно будут передавать несколько передатчиков, или возникнут другие препятствия, произойдет коллизия. Приемник не сможет получить пакет. Поэтому nRF24L01+ имеет настройку автоматической повторной отправки пакета (Aoto Retransmission (ART)). Эти настройки указывают с каким интервалом и сколько раз пытаться отправить пакет.

Как отмечалось в самом начале nRF24L01+ может работать на одном канале с 6-ю nRF24L01+. Для этого все модуля должны работать на одном канале, но каждый nRF24L01+ должен иметь уникальный адрес. Относительно адресации в документации приведена наглядная диаграмма:

NRF24L01plus_addr

Обратите внимание, что адреса для Data Pipe 1 — Pipe 5 отличаются друг от друга лишь последним байтом. Этого требует документация на nRF24L01+. На этой диаграмме модуль отмеченный как PRX прослушивает эфир для указанных адресов RX_ADDR_P0..RX_ADDR_P5. Каждый из PTX1..PTX6 отправляет пакеты на адреса TX_ADDR. Модуль, который работает как PRX тоже может отправлять модулям пакеты по их адресам.

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

Распиновка модуля nRF24L01 +

NRF24L01plus_pins

Схема подключения nRF24L01 + к микроконтроллеру Atmega8

NRF24L01plus_Atmega

Схема подключения nRF24L01+ к Raspberry Pi

NRF24L01plus_RPi

Возможные проблемы с питанием nRF24L01+

NRF24L01plus02

Пример трансмиттера и ресивера для микроконтроллеров

В примерах для Atmega8 использована библиотека, написанная Davide Gironi. Оригинальные файлы и примеры также находятся в архиве.

Сначала рассмотрим пример для микроконтроллеров, когда один модуль отправляет данные, а другой — принимает. В этом примере приемник получает данные по 6 адресам (Pipe). Передатчик последовательно отправляет пакеты по всем адресам (Pipe). Для мониторинга работы я подключал UART-USB переходник к приемнику или передатчика. И терминальной программой через компьютер наблюдал за происходящим.

Пример ресивера для Raspberry Pi

Для Raspberry Pi код приемника выглядит так (nRF24L01_example1.cpp):

Режим "спросил — ответил"

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

Отвечающая сторона, (reply.c):

В этом примере сторона, которая получает данные, последовательно опрашивает шесть модулей по разным адресам адресов (request.c):

Для Raspberry Pi программа отправляет запрос на на один адрес — 0xE8E8F0F0E2 (nRF24L01_example2.cpp):

Массив — это не интересно, передаём структуру

Отвечающая сторона (Atmega8) (reply_struct.c):

Запрашивающая сторона, должен принимать данные в такую же структуру. Так выглядит пример для Raspberry Pi (nRF24L01_example3.cpp):

Надо быть внимательным и следить за тем, чтобы размер структуры не превысил 32 байта (максимально возможный размер Payload для nRF24L01+) и совпадал с длиной Payload, которая указывается при настройке модуля nRF24L01+.

Видео

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

Я очень рад, что мои статьи читают грамотные люди, которые в состоянии определить небольшую опечатку и догадаться, что «мф» — это «мкФ». Опечатку исправил. Спасибо.

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

Я не большой знаток языков. Но, если Вы позволили себе построить одно предложение, которое начинается как указание, а заканчивается как вопрос, быть может, Вы найдете в себе силы простить мне мои «пробелы»?


Источник: blog.avislab.com