Опубликовано: 21.09.2016 19:40
Автор: jazon
Всем доброго времени суток, в этой статье я постараюсь максимально доходчиво объяснить как подключить радиомодуль NRF24L01 к плате Arduino UNO, при этом сделать унифицированной не только конфигурацию железа, но и сам скетч, который будет впоследствии залит в UNO.
Итак, начинаем... В интернете много людей интересуется, как правильно подключить данный радиомодуль к плате Arduino UNO, у многих возникают вопросы как сделать это попроще. Мною было прочитано много статей, и я постарался сделать свой уникальный вариант подключения модуля NRF24L01.
Не буду вдаваться в подробности какие виды этих радиомодулей бывают, об этом будет отдельная статья. Всё просто - вы купили радиомодули NRF24L01, теперь применим их, и проверим их работу.
Для начала, уточню - работать мы будем с библиотекой RF24.h, эта библиотека довольно таки гибкая, содержит больше примеров и функционала чем библиотека Mirf.h(о ней тоже в отдельной статье). Так используем же её основные функции!!! Что нам понадобится? Всё то что указано в списке:
Touch Sensor - это емкостная кнопка(на принципиальной схеме это S2), реагирующая на касание пальцем, у меня были именно две такие, и поэтому я решил их использовать. Но если у вас таких нет можно взять обычные, придется немного переделать скетч и схему подключений. Сразу нужно привести распиновку модуля NRF24L01, модули эти как я уже писал бывают нескольких типов, но распиновка у всех одинаковая. Подробная распиновка на рисунке ниже, показывает, где какие контакты, далее будет приведена таблица подключения к Arduino UNO.
Важно!!! При подключении радиомодуля не перепутать контакты "Земля" и "Питание 3,3В", если это произошло то скорее всего радиомодуль выйдет из строя. Поэтому будьте внимательны, выполняя подключение!!!
В нижеследующей таблице указано подключение радиомодуля к Arduino UNO. Цвета проводов при подключении соответствуют цветам на картинке с принципиальной схемой.
Arduino UNO | NRF24L01 | Цвет провода |
3V3 | Питание 3,3В | Оранжевый |
GND | "Земля" | Синий |
9 | СЕ | Желтый |
10 | SCN | Зеленый |
13 | SCK | Фиолетовый |
11 | MOSI | Коричневый |
12 | MISO | Оранжевый |
Все остальные компоненты, нужно подключить так как указано на принципиальной схеме. В итоге, у вас должно получиться два устройства, с одинаковой конфигурацией железа и подключения самого железа. Принципиальная схема:
Когда два идентичных прибора будут собраны, приходит время залить скетч в оба!!! После скетча я сделаю некоторое разъяснение как работает программа, ну а пока, сам скетч:
#include "SPI.h"
#include "RF24.h"
/*** Конфигурация подключений ***/
/*
* RADIO_RF24[SCK] = To ARD PIN 13
* RADIO_RF24[MISO] = To ARD PIN 12
* RADIO_RF24[MOSI] = To ARD PIN 11
* RADIO_RF24[SCN] = To ARD PIN 10
* RADIO_RF24[CE] = To ARD PIN 9
* Светодиод который будет включаться по команде с другого передатчика
* LED1_ACTIVATE = To ARD PIN 8
* Светодиод сигнализирующий о том что устройство включено в режиме передатчика
* LED2_CH_TO_TX = To ARD PIN 7
* SPARE_PIN = TO ARD PIN 6
* SPARE_PIN = TO ARD PIN 5
* Кнопка для переключения в режим передачи(нажата - передача, не нажата - приём)
* BUTTON_EN_TX = TO ARD PIN 4
* SPARE_PIN = TO ARD PIN 3
* Кнопка для включения на удаленном устройстве светодиода LED1_ACTIVATE
* BUTTON_ACTIVATE = TO ARD PIN 2
*/
// Сначала создаём объект radio с подключенными пинами CN - 9, SCN - 10
RF24 radio(9, 10);
//Даём уникальное имя каналу приёма/передачи
const uint32_t CHANNEL_PIPE = 0xABCDABCD71LL;
//Указать размер буфера приёма/передачи для обмена радиоданными, буфер равен 2 байта
byte DATA_BUFFER[sizeof(int)];
//Переменная которая назначит роль для устройста
bool role = false; // Используем для передачи[true] или для приёма[false]
//Пин для светодиода который будет включаться по команде с другого передатчика
const int LED1_ACTIVATE = 8;
//Пин для светодиода сигнализации о том что устройство включено в режиме передатчика
const int LED2_CH_TO_TX = 7;
//Пин для кнопки переключения в режим передачи(нажата - передача, не нажата - приём)
const int BUTTON_EN_TX = 4;
//Пин для кнопки включения на удаленном устройстве светодиода LED1_ACTIVATE
const int BUTTON_ACTIVATE = 2;
void setup()
{
//Назначить портам конфигурации входов/выходов
pinMode(LED1_ACTIVATE, OUTPUT);
pinMode(LED2_CH_TO_TX, OUTPUT);
pinMode(BUTTON_EN_TX, INPUT);
pinMode(BUTTON_ACTIVATE,INPUT);
//Начать работу с объектом radio
radio.begin();
//Установка скорости обмена данными, в нашем случае 250 кбит/с
radio.setDataRate(RF24_250KBPS);
//Установка мощности передатчика, в нашем случае - максимальная
radio.setPALevel(RF24_PA_MAX);
//Назначение номера каналу, 76-й канал(возможные варианты от 0 до 127)
radio.setChannel(76);
//Начинаем прослушивать канал
radio.startListening();
}
void loop()
{
/*** Режим передачи данных ***/
//Если роль(role) = true
//значит будем передавать
if(role)
{
//Прекратить слушать канал, фактически выключить приём
radio.stopListening();
//Открыть канал с уникальным именем CHANNEL_PIPE для записи
radio.openWritingPipe(CHANNEL_PIPE);
//Далее инструкции для передачи данных
//Считать в массив DATA_BUFFER значение кнопки BUTTON_ACTIVATE
DATA_BUFFER[0] = byte(digitalRead(BUTTON_ACTIVATE));
//Передать массив в канал приёма/передачи
radio.write(DATA_BUFFER, 2);
}
/*** Режим приёма данных ***/
//Если роль(role) = false
//значит будем принимать
if(!role)
{
//Открыть канал с уникальным именем CHANNEL_PIPE для чтения из него данных
radio.openReadingPipe(1,CHANNEL_PIPE);
//Начинаем слушать, фактически - режим приёма
radio.startListening();
//Если есть доступные данные
if(radio.available())
{
//А они по условию есть
//И пока они есть
while(radio.available())
{
//Записать их в буфер приёма/передачи DATA_BUFFER
radio.read(DATA_BUFFER, 2);
//Первый элемент массива DATA_BUFFER
//Если значение true
if(bool(DATA_BUFFER[0]))
{
//Включить светодиод LED1_ACTIVATE
digitalWrite(LED1_ACTIVATE, HIGH);
}
//Если значение false
else
{
//Выключить светодиод LED1_ACTIVATE
digitalWrite(LED1_ACTIVATE, LOW);
}
}
}
}
/*** Назначение режима Приём/Передача ***/
//Состояние кнопки BUTTON_EN_TX определяет роль устройства
//Кнопка нажата - режим передачи, не нажата - режим приёма
if(!(digitalRead(BUTTON_EN_TX)))
{
//Светодиод индикации, нажата ли кнопка BUTTON_EN_TX
digitalWrite(LED2_CH_TO_TX, HIGH);
//Далее - назначение ролей
if(role == false)
{
role = true;
}
}
else
{
digitalWrite(LED2_CH_TO_TX, LOW);
if(role == true)
{
role = false;
}
}
}
Вкратце опишу, как работает собранное устройство. Когда включается устройство, то сразу после инициализации переходит в режим радиоприёма, то же самое касается и второго устройства. При нажатии и удержании в нажатом состоянии кнопки S1, включается светодиод LED2(Смотрите принципиальную схему выше), который означает переход устройства в режим передачи. Если, при нажатой кнопке S1, нажать на сенсорную кнопку S2, то на другом устройстве загорится светодиод LED1, сигнализирующий об успешном приёме данных с радиопередатчика.
Таким же способом можно проверить и второе устройство, в общем я постарался сделать унифицированный скетч и принципиальную схему для двух устройств приёмо/передачи. На самом деле, библиотека RF24 содержит более расширенный функционал, чем тот что применен в моей статье, но об этом будет написано в другой теме.
И еще напоследок, испытание этих двух приборов в полевых условиях(плотная бетонная застройка жилого района), показала довольно таки неплохой результат - 150 метров уверенного приёма/передачи. Хотя на открытой местности, как заявляет производитель модулей NRF24L01, сигнал должен покрывать расстояние в 1000 метров без проблем, да, я забыл сказать что мной были использованы модули с внешней антенной и встроенным усилителем. Тот модуль что показан на принципиальной схеме выше, уверенно покрывает расстояние в 20 метров.
Небольшая ложка дегтя - для тех кто захочет повторить схему. Модули NRF24L01 не очень дружат с платой Arduino Nano, всё из-за просадки напряжения в 3.3 вольт на плате Nano. Можно припаять полярный конденсатор номиналом 47mf * 25V к разъёмам питания платы(об этом можно прочитать на многих форумах по электронике), но этот решение малоэффективно. Как вариант, использовать силовые шилды для Arduino Nano, либо пользоваться платой Arduino Uno.
Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.