Ни в одном проекте на 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. Скачать ее можно тут: скачать.
Ниже приведен код с подробными комментариями:
// передатчик // Библиотека для работы с SPI #include <SPI.h> // Файл с настройками для библиотеки RF24 #include <nRF24L01.h> // Библиотека RF24 #include <RF24.h> // 9 и 10 - это номера пинов CE и CSN модуля nRF24L01+ RF24 radio(9, 10); void setup(){ // инициализация nRF24L01+ radio.begin(); // задаем канал для передачи данных (от 0 до 127) radio.setChannel(0); // Скорость передачи данных 1Мбит/сек. // Возможны: RF24_250KBPS, RF24_1MBPS, RF24_2MBPS radio.setDataRate (RF24_1MBPS); // Мощность передатчика -6dBm. // Возможные можности: // RF24_PA_MIN = -18dBm, RF24_PA_LOW = -12dBm, // RF24_PA_HIGH = -6dBm, RF24_PA_MAX = 0dBm radio.setPALevel (RF24_PA_HIGH); // Открываем трубу с идентификатором 0x1234567890 для передачи данных // на одном канале можно открыть 6 разных труб // они должны отличаться только последним байтом radio.openWritingPipe (0x1234567890LL); } void loop(){ // массив для тестовых данных int data[2] = {0, 0}; // читаем значение с аналогового пина для получения тестового числа data[0] = analogRead(0); // второе тестовое значение будет фиксированным data[1] = 80; // отправляем данные radio.write(&data, sizeof(data)); }
Скетч arduino для приема данных через nRF24L01+
Ниже приведен код с подробными комментариями:
// приемник #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(9, 10); void setup(){ // инициализация nRF24L01+ radio.begin(); // задаем канал для приёма данных. Идентично передатчику radio.setChannel(0); // Скорость передачи данных. Идентично передатчику radio.setDataRate (RF24_1MBPS); // Мощность передатчика. Идентично передатчику radio.setPALevel (RF24_PA_HIGH); // Открываем 1 трубу с идентификатором 0x1234567890 radio.openReadingPipe (1, 0x1234567890LL); // Включаем приемник и слушаем открытую трубу radio.startListening (); // монитор порта Serial.begin(9600); } void loop(){ // массив, для получения данных int data[2]={}; // если что-то удалось получить if (radio.available()){ // читаем данные radio.read(&data, sizeof(data)); // вывод первого элемента массива Serial.print("data[0]: "); Serial.print(data[0]); // вывод второго элемента массива Serial.print(" data[1]: "); Serial.println(data[1]); } }
Если все подключено и прошито правильно, то в мониторе порта приемника должны выводиться данные, полученные с передатчика.
Послесловие
Область применения беспроводной передачи данных очень обширная – различные игрушки с пультами управления, системы оповещения и тд. Поэтому тема с радиомодулем nRF24L01+ в будущем будет продолжена, есть некоторые идеи, до которых пока еще не дошли руки.
Ели у вас тоже есть какие-то мысли или идеи по использованию радиомодуля, то пишите в комментарии, буду рад обсудить их, а возможно и воплотить в жизнь.
спасибо конкретно
Спасибо! повторил — все работает, добавил команд, дополнительно навешал светодиодов и с задержками гасил и включал в общем цикле. Безмерно благодарен за полезную статью!!!!
Эх, елки-палки, а мне надо его к Attyny85 прикрутить так, чтобы оставался свободный пин, и что теперь делать — хрен знает… Чувствую, выход есть, но будет дороже )
чётко, всё работает,Огромное спасибо
Это работает!!! а другие примеры из простора интернета не подошли…
Спасибо!!!