- Радиомодуль nRF24L01+ и arduino. Подключение и пример передачи данных
- Описание радиомодуля nRF24L01+
- Подключение nRF24L01+ к arduino
- Скетч arduino для отправки данных через nRF24L01+
- Скетч arduino для приема данных через nRF24L01+
- Послесловие
- NRF24L01 – подключение к Arduino
- Обзор модуля NRF24L01
- Работа с радиомодулем в Arduino IDE
- Товары, используемые в материале
- Arduino NANO V3 (ATmega 328P / CH340G)
- NRF24L01+ – радиомодуль 2.4 ГГц
- SYB-170 – макетная плата на 170 точек
- Набор перемычек для макетных плат
- Самые популярные материалы в блоге
- За все время
- За сегодня
- Радио модуль NRF24L01
- Обзор Модули nRF24L01
- Технические характеристики Модули nRF24L01
- Подключение nRF24L01 к плате Arduino
- Пример использования 1
- Пример использования 2
- FAQ. Часто задаваемые вопросы
Радиомодуль nRF24L01+ и arduino. Подключение и пример передачи данных
Ни в одном проекте на arduino я еще не сталкивался с беспроводной передачей данных, хотя это очень большая и интересная тема. Передавать данные на расстоянии можно многими способами, но в этой статье речь пойдет о радиомодуле nRF24L01+. Поскольку такие передатчики относительно простые в использовании, дешевые и имеют большой радиус действия.
Описание радиомодуля nRF24L01+
Радиомодуль nRF24L01+, как я уже писал, стоит достаточно дешево – всего 50 руб, то есть за 100 руб можно купить два передатчика, между которыми и будет осуществляться беспроводная передача данных. Модуль может работать как передатчик и как приемник, отличия будут только в прошивке. Дальность действия составляет 100 метров на открытой местности и 30 метров в помещении.
Из минусов стоит отметить, что nRF24L01+ работает на частоте 2,4 ГГц, которую используют Wi-Fi и Bluetooth, они могут заглушать сигнал передатчика. Еще одним небольшим минусом является то, что nRF24L01+ питается от напряжения 3.3в, поэтому подключать его нужно аккуратно – 5в могут испортить модуль. Большинство плат arduino имеет пины с напряжением 3.3в, поэтому иногда проблема решается просто. Но бывают и другие случаи, например, arduino pro mini не всегда оснащена пином с нужным питанием, в таком случае придется использовать преобразователь напряжения.
Также к сложностям можно отнести то, что при запуске, nRF24L01+ требуется довольно большой ток и многие китайские копии arduino не могут его выдавать. Чтобы решить такую проблему достаточно припаять к радиомодулю(к пинам питания) конденсатор емкостью от 10 мфд. Поскольку я пользуюсь arduino, которые бережно собирают в Китае, то столкнувшись с проблемой, немного модернизировал nRF24L01+, получилось вот так:
Подключение nRF24L01+ к arduino
Радиомодуль nRF24L01+ общается с микроконтроллером через интерфейс SPI, поэтому подключение должно быть к соответствующим пинам arduino. Главное помнить, что пины SPI у arduino Uno/Nano/Pro mini и arduino Mega отличаются:
Пины для Uno/Nano/Pro mini:
MOSI — 11
MISO — 12
SCK – 13
Пины для Mega2560:
MOSI — 51
MISO — 50
SCK — 52
Ниже на картинке распиновка самого радиомодуля nRF24L01+
И схема подключения nRF24L01+ к arduino.
Скетч arduino для отправки данных через nRF24L01+
Для работы с радиомодулем существует несколько библиотек, самая удобная, на мой взгляд, это RF24. Скачать ее можно тут: скачать.
Ниже приведен код с подробными комментариями:
Скетч arduino для приема данных через nRF24L01+
Ниже приведен код с подробными комментариями:
Если все подключено и прошито правильно, то в мониторе порта приемника должны выводиться данные, полученные с передатчика.
Послесловие
Область применения беспроводной передачи данных очень обширная – различные игрушки с пультами управления, системы оповещения и тд. Поэтому тема с радиомодулем nRF24L01+ в будущем будет продолжена, есть некоторые идеи, до которых пока еще не дошли руки.
Ели у вас тоже есть какие-то мысли или идеи по использованию радиомодуля, то пишите в комментарии, буду рад обсудить их, а возможно и воплотить в жизнь.
Источник
NRF24L01 – подключение к Arduino
Многие из вас наверняка слышали про дистанционное управление, когда все управляется на большом расстоянии парой простых нажатий. Нажал кнопочку на пульте – и включился свет или прильнул к вашим ногам ваш любимый робот. А самое интересное здесь то, что для управления выстроенной системой не нужны километровые провода.
Дистанционное управление можно разделить на множество подвидов: управление по Bluetooth, через Wi-Fi, по радиосвязи и многие другие. Большинство из этих видов коммуникации можно связать с Arduino и затем создавать на этой основе собственные проекты.
Обзор модуля NRF24L01
В этой статье речь пойдет о радиомодуле NRF24L01, который способен обмениваться данными с Ардуино на частоте 2,4ГГц.
Примеры компоновки этих модулей вы можете сейчас видеть на картинке ниже:
Этот модуль представляет собой приемник и передатчик одновременно. Он достаточно миниатюрный и компактный в размерах. Для работы с модулем важно будет знать следующие его характеристики:
Наглядная схема подключения изображена на рисунке ниже:
Работа с радиомодулем в Arduino IDE
Для написания кода и проверки работоспособности NRF24L01, нам понадобятся две библиотеки. Их нужно скачать и переместить в раздел Library в той папке, где у вас установлена Arduino IDE.
В данной статье приведем несколько простых скетчей для работы с модулем. Например, приведенный ниже программный код служит для проверки работоспособности и передает текущее значение таймера с одного устройства на другое.
Кстати, 9 и 10 — это номера выводов Ардуино, к которым подключены контакты радиомодуля CN и CSN. Поэтому если у вас другие номера пинов, то следует их изменить в коде в самой первой строчке SerialFlow rd.
Следующий скетч позволит выводить полученные с радиомодуля данные в монитор порта.
Если вы смотрите данные через монитор порта, то не забудьте справа внизу указать в нем ту же скорость передачи данных, как и в нашем скетче (в данном случае, это 57600 бод).
Кстати, простейшей практической схемой для применения данного радиомодуля может быть ИК-пульт, где с помощью одного устройства идет управление другим.
На этом статья подходит к концу. Все компоненты, упомянутые здесь, вы можете найти в нашем магазине. Спасибо за внимание, следите за нашим блогом и удачной вам компиляции!
Товары, используемые в материале
Arduino NANO V3 (ATmega 328P / CH340G)
NRF24L01+ – радиомодуль 2.4 ГГц
SYB-170 – макетная плата на 170 точек
Набор перемычек для макетных плат
Самые популярные материалы в блоге
За все время
За сегодня
Для того, чтобы скачать библиотеку единым архивом, надо подняться выше по дереву проекта, до https://github.com/oevsegneev/arduino-dev. Проверьте, установлены ли вспомогательные библиотеки:
SerialFlow library for Arduino
Uses to transmit packed data.
You need to uncomment one of the #include directives in SerialFlow.h file in order to use nrf24 radio or FastSerial library.
For example:
// uncomment desired library
//#include “FastSerial.h”
//#include “RF24.h”
#include “HardwareSerial.h”
Добрый день.Подскажите, пожалуйста, по его документации у него 125 каналов, а объединяться могут только 6? Если стоит задача сделать 100 устройств, которые способны общаться между собой, то это нельзя реализовать с использованием NRF24L01?
Кто шарит прмогите разобраться. Купил nrf модули себе, подпаял всё к ардуино, питание 3,3 подвёл через понижайку импульсную, на всякий случай на сами модули кондеры припаял, залил прошивку на обе в которой в порте показывает время отправки сигнала. Но при отправке почти всегда ошибку показывает, изредко отправляются сигналы и то с задержкой 1000+ микросекунд. Уже всё перепробовал, заного перепаивал, перепроверял контакты, одно и то же. Помогите кто может, а то всё готово для машинки радиоуправляемой, а вот эта ситуация подводит
Здравствуйте! Какую библиотеку используете для обмена данными?
Как можно убедиться в том, что две Ардуино сконнектились?
Здравствуйте! Не совсем поняли задачу, так как описано не особо внятно. Можем сказать, что для NRF24L01 есть замечательная библиотека, позволяющая создать Mesh сеть – https://github.com/nRF24/RF24Network
конечно можно, на одной “трубе” (на одном канале есть
Источник
Радио модуль NRF24L01
Товары
Содержание
Обзор Модули nRF24L01
При разработке электронных устройств нередко возникает потребность в передаче каких-либо данных на некоторое расстояние. Например термодатчик, расположенный на улице, должен передавать значение температуры центральному устройству, а датчик движения – отдавать команду на включение сирены, расположенной в отдельном помещении. Подобных задач существует множество, как и методов их решения. В тех случаях, когда организовать проводную связь не представляется возможным, на помощь приходят радиомодули NFR24L01, работающие в диапазоне частот 2.4-2.5 ГГц. Их простота и надёжность обеспечила модулям огромную популярность среди радиолюбительских конструкций. NFR24L01 можно встретить в таких устройствах, как:
Беспроводная клавиатура, мышь, джойстик;
Система беспроводного доступа;
Сетевая система сбора данных;
Беспроводные охранные системы;
Всевозможные системы наблюдения и мониторинга;
Системы автоматики и телемеханики;
Игрушки на радиоуправлении и многое другое.
В общем, область применения данных радиомодулей ограничивается лишь фантазией разработчика, а их невысокая стоимость является приятным дополнением к прочим достоинствам. На рисунке №1 показан внешний вид радиомодуля NRF24L01 с распиновкой выводов.
Рисунок №1 – внешний вид NRF24L01
Как видно из вышеприведенного рисунка, комплектация платы является базовой и содержит сам чип, штыревую колодку и антенну в виде извилистой дорожки. Такой набор обеспечивает дальность связи до 100м при прямой видимости или до 30м в помещении. Если этого недостаточно, то есть возможность приобрести такие же модули, только с дополнительным усилителем и внешней антенной (рисунок №2). В таком случае дальность связи можно увеличить до 1000м.
Организация питания радиомодулей требует повышенного внимания, так как большинство начинающих пользователей сталкивается с проблемами при их запуске. Дело в том, что в момент инициализации NRF24L01 потребляют значительный ток, который не может обеспечить стандартный 3-вольтовый преобразователь Arduino. Как следствие, наблюдаются сбои в работе радиосвязи. Исключить эту неприятную ситуацию поможет электролитический конденсатор, ёмкостью около 100 мкФ. Его необходимо подпаять параллельно выводам GROUND и VCC модуля. Дополнительная ёмкость поможет сгладить пульсации при старте и обеспечит достаточный запас энергии.
Ещё одним вариантом решения проблемы запуска, является использование дополнительного адаптера со встроенным стабилизатором напряжения. В таком случае для NRF24L01 можно использовать внешнее питание от 4.8В до 12В, а максимальный выходной ток составит 800мА. Внешний вид такого адаптера показан на рисунке №3.
Рисунок №3 – Дополнительный адаптер для NRF24L01
И наконец, для тех, кто хочет углубиться в строение самого радиомодуля NRF24L01, на рисунке №4 приведена его электрическая схема.
Рисунок №4 – электрическая схема NRF24L01
Технические характеристики Модули nRF24L01
Напряжение питания: 1,9В – 3,6В;
Интерфейс обмена данными: SPI;
Частота приёма и передачи: 2,4 ГГц;
Количество каналов: 128 с шагом 1МГц;
Тип модуляции: GFSK;
Скорость передачи данных: 250kbps, 1Mbps и 2Mbps;
Расстояние приёма/передачи данных: 100м – прямая видимость; 30м – помещение;
Коэффициент усиления антенны: 2dBm;
Диапазон рабочей температуры: -40 о С…+85 о С;
Организация сети на одном канале: 7 модулей (1 приёмник и 6 передатчиков).
Подключение nRF24L01 к плате Arduino
Каждый идентификатор представляет из себя произвольное число, состоящее из 5 байт, но он должен задаваться по определённым правилам, а именно:
На одном и том же канале идентификатор каждого передатчика должен быть обязательно уникальным;
Чтобы приёмник мог принимать данные от передатчиков, ему должны быть указаны их идентификаторы;
Идентификаторы труб Pipe 2 – Pipe 5 должны отличаться от Pipe 1 только последним байтом, например: Pipe 1 = 0 xB 4 B 5 B 6 B 7 F 1 ; Pipe 2 = 0 xB 4 B 5 B 6 B 7 CD ; Pipe 3 = 0 xB 4 B 5 B 6 B 7 A 3 ; Pipe 4 = 0 xB 4 B 5 B 6 B 7 0 F ; Pipe 5 = 0 xB 4 B 5 B 6 B 7 05 ;
Рисунок №6 наглядно демонстрирует вышеизложенное.
Рисунок №6 – Приём данных от 6 передатчиков
Для закрепления материала, создадим проект, где 2 платы Arduino будут соединены между собой по радиоканалу. К первой Arduino подсоединим потенциометр, а ко второй – светодиод. Путём вращения ручки потенциометра будем регулировать яркость светодиода по радиоканалу. Схема проекта показана на рисунке №7.
Рисунок №7 – соединение 2-х Arduino по радиоканалу
Программный код для передатчика:
#include // Подключаем библиотеку для работы с SPI-интерфейсом
#include // Подключаем файл конфигурации из библиотеки RF24
#include // Подключаем библиотеку для работа для работы с модулем NRF24L01
#define PIN_POT A7 // Номер пина Arduino, к которому подключен потенциометр
#define PIN_CE 10 // Номер пина Arduino, к которому подключен вывод CE радиомодуля
#define PIN_CSN 9 // Номер пина Arduino, к которому подключен вывод CSN радиомодуля
RF24 radio ( PIN_CE , PIN_CSN ); // Создаём объект radio с указанием выводов CE и CSN
int potValue [ 1 ]; // Создаём массив для передачи значений потенциометра
radio . begin (); // Инициализация модуля NRF24L01
radio . setChannel ( 5 ); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
radio . setDataRate ( RF24_1MBPS ); // Скорость обмена данными 1 Мбит/сек
radio . setPALevel ( RF24_PA_HIGH ); // Выбираем высокую мощность передатчика (-6dBm)
radio . openWritingPipe ( 0x7878787878LL ); // Открываем трубу с уникальным ID
potValue [ 0 ] = analogRead ( PIN_POT ); // Считываем показания потенциометра
radio . write ( potValue , 1 ); // Отправляем считанные показания по радиоканалу
#include // Подключаем библиотеку для работы с SPI-интерфейсом
#include // Подключаем файл конфигурации из библиотеки RF24
#include // Подключаем библиотеку для работа для работы с модулем NRF24L01
#define PIN_LED 3 // Номер пина Arduino, к которому подключен светодиод
#define PIN_CE 10 // Номер пина Arduino, к которому подключен вывод CE радиомодуля
#define PIN_CSN 9 // Номер пина Arduino, к которому подключен вывод CSN радиомодуля
RF24 radio ( PIN_CE , PIN_CSN ); // Создаём объект radio с указанием выводов CE и CSN
int potValue [ 1 ]; // Создаём массив для приёма значений потенциометра
pinMode ( PIN_LED , OUTPUT ); // Настраиваем на выход пин светодиода
radio . begin (); // Инициализация модуля NRF24L01
radio . setChannel ( 5 ); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
radio . setDataRate ( RF24_1MBPS ); // Скорость обмена данными 1 Мбит/сек
radio . setPALevel ( RF24_PA_HIGH ); // Выбираем высокую мощность передатчика (-6dBm)
radio . openReadingPipe ( 1 , 0x7878787878LL ); // Открываем трубу ID передатчика
radio . startListening (); // Начинаем прослушивать открываемую трубу
if ( radio . available ()) < // Если в буфер приёмника поступили данные
analogWrite ( PIN_LED , map ( potValue [ 0 ], 0 , 1023 , 0 , 255 )); // Регулируем яркость диода
Как видно из вышеприведенного кода передатчика и приёмника, в обоих случаях задаётся одинаковая мощность и скорость обмена данными. Для этих целей используются предопределённые литерные константы. Рассмотрим значение каждой из них в паре со своей функцией.
— RF24_250KBPS – скорость 250 кбит/сек;
— RF24_1MBPS – скорость 1Мбит/сек;
— RF24_2MBPS – скорость 2Мбит/сек;
— RF24_PA_MIN – мощность -18dBm;
— RF24_PA_LOW – мощность -12dBm ;
— RF24_PA_HIGH – мощность -6dBm ;
— RF24_PA_MAX – мощность 0dBm ;
Пример использования 1
Рисунок №8 – проект удалённого контроля температуры и влажности
После установки всех необходимых библиотек, можно переходить непосредственно к программированию. Ниже приведены 2 скетча с комментариями для передатчика и приёмника.
Программный код для передатчика:
#include // Библиотека для работы с датчиком DHT11/DHT22
iarduino_DHT sensor ( 3 ); // Датчик подключен к 3 пину Arduino
#include ; // Библиотека для работы с шиной SPI
#include ; // Файл конфигурации для библиотеки RF24
#include ; // Библиотека для работы с модулем NRF24L01
#define PIN_CE 10 // Номер пина Arduino, к которому подключен вывод CE радиомодуля
#define PIN_CSN 9 // Номер пина Arduino, к которому подключен вывод CSN радиомодуля
RF24 radio ( PIN_CE , PIN_CSN ); // Создаём объект radio с указанием выводов CE и CSN
int DHT_value [ 2 ]; // Массив для передачи данных о температуре и влажности
Serial . begin ( 9600 ); // Инициализация серийного порта для отладки
radio . begin (); // Инициализация радиомодуля NRF24L01
radio . setChannel ( 5 ); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
radio . setDataRate ( RF24_1MBPS ); // Скорость обмена данными 1 Мбит/сек
radio . setPALevel ( RF24_PA_HIGH ); // Выбираем высокую мощность передатчика (-6dBm)
radio . openWritingPipe ( 0x7878787878LL ); // Открываем трубу с уникальным ID
delay ( 2000 ); // Задержка на инициализацию датчика DHT
if ( sensor . read () == DHT_OK ) < // Если датчик выполнил преобразования
DHT_value [ 0 ] = sensor . tem ; // Запоминаем температуру
DHT_value [ 1 ] = sensor . hum ; // Запоминаем влажность
radio . write ( DHT_value , sizeof ( DHT_value )); // Передаём данные по радиоканалу
// Паралельно выводим считанные значения в терминал
delay ( 2000 ); // Задержка на время преобразований датчика DHT
Программный код для приёмника:
#include ; // Библиотека для работы с шиной SPI
#include ; // Файл конфигурации для библиотеки RF24
#include ; // Библиотека для работы с модулем NRF24L01
#define PIN_CE 10 // Номер пина Arduino, к которому подключен вывод CE радиомодуля
#define PIN_CSN 9 // Номер пина Arduino, к которому подключен вывод CSN радиомодуля
RF24 radio ( PIN_CE , PIN_CSN ); // Создаём объект radio с указанием выводов CE и CSN
#include // Библиотека для работы с шиной 1-Wire
// Создаём объект lcd для работы с дисплеем
int DHT_value [ 2 ]; // Массив для передачи данных о температуре и влажности
lcd . begin ( 16 , 2 ); // Инициализация ЖКИ
lcd . backlight (); // Включаем подсветку
radio . begin (); // Инициализация радиомодуля NRF24L01
radio . setChannel ( 5 ); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
radio . setDataRate ( RF24_1MBPS ); // Скорость обмена данными 1 Мбит/сек
radio . setPALevel ( RF24_PA_HIGH ); // Выбираем высокую мощность передатчика (-6dBm)
radio . openReadingPipe ( 1 , 0x7878787878LL ); // Открываем трубу с ID передатчика
radio . startListening (); // Включаем прослушивание открытой трубы
if ( radio . available ()) < // Если по рпдиоканалу поступили данные
// Выводим принятые данные на ЖКИ по координатам
Рисунок №9 – контроль температуры и влажности по радиоканалу
Пример использования 2
Создадим проект передачи данных с одной плата Arduino на другую по радиоканалу и использованием модулей nRF24L01+.
Для проекта нам понадобятся:
Плата Arduino – 2 шт;
Модуль nRF24L01+ – 2 шт;
Датчик DHT11 – 1 шт;
Дисплей WH1602 I2C;
Схема соединений нашего проекта на рис. 10.
Каждые 10 секунд получаем показания влажности воздуха и температуры на плате Arduino с датчика DHT11 и передаем по радиоканалу на другую плату Arduino для отображения на дисплее. Выбираем мощность передатчика, скорость передачи, канал 0x55:
Содержимое скетча для платы Arduino c датчиком DHT11 показано в листинге 3.
Теперь пишем скетч для приемника и отображения данных на экране дисплея.
Содержимое скетча для платы Arduino c дисплеем WH1602 I2C показано в листинге 4.
И результат работы (рис. 11).
FAQ. Часто задаваемые вопросы
Вопрос: Почему на некоторых каналах дальность связи резко уменьшается?
Ответ: Частотный диапазон, в котором работают данные радиомодули является довольно распространённым. В этой полосе частот работают также wifi-роутеры, Bluetooth-устройства и даже некоторые СВЧ-печи. Весть этот промышленный шум может препятствовать прохождению сигналов на некоторых каналах. При обнаружении подобных проблем рекомендуется просто сменить канал связи на другой.
Вопрос: Как прописать в коде приёмника получение данных с нескольких передатчиков?
Ответ: Для этого необходимо указать уникальный ID каждого передатчика, который будет вещать на частоте приёмника, например.
Вопрос: Сам модуль питается от 3,3В, а Arduino от 5В. Насколько необходим преобразователь уровней при подключении модуля к Arduino по SPI-шине?
Ответ: Преобразователь уровней не требуется, так как информационные входы радиомодуля NRF24L01 толерантны к напряжению 5В.
Вопрос: Какое количество байт можно отправить в буфер передатчика за один раз?
Ответ: За один сеанс можно отправить в буфер 32 байта.
Источник