Как работают радиомодули 433 МГц и подключение к Arduino
Хотите сделать ваш следующий проект на Arduino беспроводным примерно за стоимость чашки кофе? Тогда рассмотрите использование радиомодулей передатчика и приёмника 433 МГц!
Эти модули доступны в интернете менее чем за два доллара, что делает их одним из самых доступных вариантов для беспроводной передачи данных. Что делает их ещё более практичными — их крошечный размер: они настолько малы, что вы можете легко интегрировать их практически в любой проект. Частота 433 МГц, на которой они работают, является частью радиоспектра, выделенного для устройств малого радиуса действия, что означает, что вам не нужна специальная лицензия для их использования. Интересно, что эти модули могут передавать данные на расстояние до 50 метров (в зависимости от условий, конечно).
Так почему бы не взять ваш Arduino и эти радиомодули и не начать исследовать мир беспроводной связи в вашем следующем проекте!
Обзор оборудования
Давайте поближе рассмотрим радиомодули передатчика и приёмника 433 МГц.
Передатчик
Начнём с модуля передатчика.
Сердцем этого модуля является ПАВ-резонатор (резонатор на поверхностных акустических волнах). Этот специальный компонент настроен на работу на частоте 433,xx МГц. Модуль также содержит коммутирующий транзистор и несколько пассивных компонентов, которые работают вместе.
Когда вы подаёте сигнал HIGH на вход DATA, генератор создаёт непрерывную радиоволну на частоте 433,xx МГц. Однако когда вход DATA находится в состоянии LOW, генератор прекращает работу, что создаёт так называемую амплитудно-модулированную волну. Этот метод изменения силы сигнала для представления данных называется амплитудной манипуляцией (ASK), которую мы рассмотрим подробнее далее.
Приёмник
Теперь перейдём к модулю приёмника.
Этот модуль содержит настроенный радиочастотный контур, который работает как фильтр, блокируя нежелательные сигналы, не попадающие в диапазон 433 МГц. Он также содержит несколько операционных усилителей (ОУ), которые усиливают принятые радиоволны перед их обработкой.
После усиления сигнал проходит через схему ФАПЧ (фазовой автоподстройки частоты). ФАПЧ помогает декодеру захватить поток цифровых битов, что приводит к более чистому выходному сигналу с лучшей устойчивостью к шумам и помехам.
ASK — амплитудная манипуляция
Давайте рассмотрим, как эти модули передают цифровые данные с помощью техники, называемой амплитудная манипуляция (ASK). Это тип цифровой модуляции, который одновременно прост и эффективен для беспроводной передачи информации. Вот как это работает:
При амплитудной манипуляции для передачи данных используется высокочастотная несущая волна. Эта несущая волна представляет собой непрерывную синусоиду с постоянной частотой (в нашем случае 433 МГц). Для передачи цифровой информации волна модифицируется таким образом, чтобы представлять наши двоичные данные.
Когда мы хотим передать двоичную «1», несущая волна передаётся на полной мощности. Когда мы хотим передать двоичный «0», несущая волна вообще не передаётся. Это похоже на то, как вы можете использовать фонарик для передачи азбуки Морзе, включая и выключая его.
Иллюстрация ниже показывает двоичные данные, несущую волну и результирующую ASK-модулированную волну, где амплитуда несущей волны изменяется для представления двоичных «1» и «0».
Как вы можете видеть на этой иллюстрации, амплитуда сигнала «сдвигается» между двумя уровнями в зависимости от того, передаётся «1» или «0». Поскольку возможны только эти два уровня (включено или выключено), эту технику иногда называют двоичной амплитудной манипуляцией.
Преимущества
ASK имеет несколько преимуществ, которые делают её популярной для простых беспроводных устройств:
Во-первых, она удивительно проста в реализации. Вам не нужно сложное оборудование для создания или обнаружения ASK-сигналов, что делает эти модули доступными для многих проектов.
Во-вторых, ASK использует меньшую полосу пропускания по сравнению с некоторыми другими методами модуляции, такими как частотная манипуляция (FSK).
Ограничения
Однако ASK имеет некоторые ограничения. Поскольку она полагается исключительно на изменения амплитуды сигнала, на неё могут влиять фоновые шумы или помехи от других радиоустройств, что делает её менее надёжной в зашумлённых средах.
Ещё одно ограничение состоит в том, что поддержание постоянной силы сигнала делает ASK менее энергоэффективной, особенно при передаче данных на большие расстояния. Именно поэтому эти модули лучше всего подходят для приложений малого радиуса действия, таких как пульты дистанционного управления, метеостанции или простая домашняя автоматизация.
Несмотря на эти ограничения, если поддерживать относительно низкую скорость передачи данных, ASK может работать надёжно в большинстве условий. Это делает её идеальной для простых проектов, где стоимость и простота важнее высокой скорости или экстремальной дальности.
Распиновка передатчика и приёмника 433 МГц
Давайте рассмотрим распиновку радиомодулей передатчика и приёмника 433 МГц.
DATA — это вывод входных данных. Сюда подаются цифровые данные, которые вы хотите передать.
VCC — это вывод питания. Вы можете использовать любое положительное напряжение постоянного тока от 3,5 В до 12 В. Имейте в виду, что мощность радиочастотного выхода напрямую зависит от напряжения питания — чем выше напряжение, тем больше дальность передачи.
GND — это вывод заземления.
Antenna используется для подключения внешней антенны. Для оптимальной дальности и производительности рекомендуется подключить к этому выводу кусок одножильного провода длиной 17,3 см. Вам может быть интересно, почему именно такая длина — не волнуйтесь, мы объясним это позже!
VCC — это вывод питания. В отличие от передатчика, приёмнику специально требуется напряжение питания 5 В для правильной работы.
DATA — выводы, на которых появляются принятые от передатчика цифровые данные. Оба вывода внутренне соединены друг с другом, поэтому вы можете использовать любой из них для приёма данных.
GND — это вывод заземления.
Antenna подключается к внешней антенне, как и у передатчика. Опять же, для оптимальной дальности и производительности к этому выводу следует подключить кусок одножильного провода длиной 17,3 см.
Схема подключения передатчика и приёмника 433 МГц к Arduino
Теперь, когда мы хорошо разобрались в этих модулях, давайте засучим рукава и подключим их к нашим платам Arduino!
Для этого проекта вам понадобятся две отдельные установки Arduino, поскольку мы будем отправлять данные с одного Arduino на другой. Итак, вам потребуются две платы Arduino, две макетные платы, модуль передатчика 433 МГц, модуль приёмника 433 МГц и несколько соединительных проводов для всех подключений.
Настройка передатчика
Подключение модуля передатчика довольно простое, поскольку нужно подключить только три вывода.
Подключите вывод VCC модуля к выводу 5V Arduino, а вывод GND — к земле.
Наконец, подключите вывод Data-in к цифровому выводу #12 на Arduino. Мы рекомендуем использовать цифровой вывод #12 по конкретной причине — библиотека, которую мы будем использовать позже, уже настроена на работу с этим выводом по умолчанию, что экономит нам дополнительные шаги программирования.
Вот краткая справочная таблица подключений выводов:
Передатчик |
Arduino |
|
|---|---|---|
VCC |
5V |
|
Data |
12 |
|
GND |
GND |
Подключение показано на изображении ниже.
Настройка приёмника
Теперь давайте подключим модуль приёмника к второму Arduino. Процесс очень похож на настройку передатчика.
Подключите вывод VCC модуля приёмника к выводу 5V Arduino, а вывод GND — к земле. Затем подключите один из средних выводов Data-out к цифровому выводу #11 на Arduino.
Вы можете заметить, что приёмник имеет два вывода данных посередине, которые выглядят одинаково. Не беспокойтесь о том, какой из них выбрать — они на самом деле соединены друг с другом внутри модуля, поэтому любой из них будет работать отлично.
Вот краткая справочная таблица подключений выводов:
Приёмник |
Arduino |
|
|---|---|---|
VCC |
5V |
|
Data |
11 |
|
GND |
GND |
Подключение приёмника показано на изображении ниже.
Библиотека RadioHead
В отличие от более продвинутых радиомодулей, таких как nRF24L01, радиомодуль 433 МГц довольно простой. Он не имеет встроенного обнаружения ошибок при передаче данных. Это означает, что если данные повреждаются во время передачи, нет автоматического способа обнаружить или исправить это. Чтобы убедиться, что наши данные поступают правильно, нам нужно добавить собственную систему обнаружения ошибок.
Вот тут библиотека RadioHead становится действительно полезной. Эта библиотека обрабатывает обнаружение ошибок за вас, используя так называемую CRC (циклическую проверку избыточности). Отличная особенность библиотеки RadioHead в том, что она работает практически с любым радиомодулем, а не только с модулями 433 МГц.
Как это работает
На стороне передатчика библиотека берёт данные, которые вы хотите отправить, и упаковывает их в структурированный пакет данных, известный как пакет RadioHead. Этот пакет включает контрольную сумму CRC, а также преамбулу и заголовок для обеспечения надёжной связи. Как только пакет правильно сформирован, он передаётся по беспроводной связи на принимающий Arduino.
Вот как выглядит структура пакета RadioHead:
На стороне приёмника библиотека RadioHead непрерывно прослушивает входящие пакеты. При получении пакета библиотека пересчитывает контрольную сумму CRC, чтобы проверить, поступили ли данные правильно. Если проверка CRC пройдена, принимающий Arduino уведомляется о том, что новые данные доступны для обработки. Однако если проверка CRC не пройдена, что означает повреждение данных во время передачи, пакет автоматически отбрасывается для предотвращения использования повреждённых данных.
Установка библиотеки
Для установки библиотеки:
Сначала откройте Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.
Введите «radiohead» в поле поиска для фильтрации результатов.
Найдите библиотеку «RadioHead», созданную Mike McCauley.
Нажмите кнопку Install, чтобы добавить её в Arduino IDE.
Пример кода Arduino
Давайте попробуем отправить короткое текстовое сообщение с передатчика на приёмник, используя радиомодули 433 МГц с Arduino. Это базовое упражнение поможет вам понять эти модули и может послужить основой для более продвинутых проектов.
Код для передатчика
Вот скетч для передатчика:
// Include RadioHead Amplitude Shift Keying Library
#include <RH_ASK.h>
// Include dependant SPI Library
#include <SPI.h>
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
void setup()
{
// Initialize ASK Object
rf_driver.init();
}
void loop()
{
const char *msg = "Hello World";
rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
delay(1000);
}
Объяснение кода
Хотя этот скетч короткий, он содержит всё необходимое для отправки беспроводного сообщения.
Скетч начинается с подключения необходимых библиотек. Библиотека RadioHead ASK нужна для обработки амплитудной манипуляции (ASK), а библиотека SPI требуется, потому что RadioHead зависит от неё для правильного взаимодействия с оборудованием.
#include <RH_ASK.h>
#include <SPI.h>
Далее мы создаём ASK-объект с именем rf_driver. Этот объект предоставляет все функции, необходимые для беспроводной отправки сообщений.
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
В функции setup мы подготавливаем радиопередатчик к использованию, инициализируя его. Функция init() устанавливает все необходимые настройки, чтобы наш передатчик мог работать правильно. Это нужно сделать только один раз при первом включении Arduino.
// Initialize ASK Object
rf_driver.init();
Теперь в функции loop мы создаём сообщение «Hello World» для отправки и сохраняем его в переменной msg. Помните, что вы можете изменить сообщение на любое другое, но для лучших результатов держите его длину менее 27 символов. В нашем примере 11 символов, включая пробел.
// Preparing a message
const char *msg = "Hello World";
Затем мы отправляем сообщение с помощью функции send(), которая требует два параметра: наше сообщение и его длину. Странная часть (uint8_t *) просто преобразует наше сообщение в формат, понятный радиомодулю. strlen(msg) сообщает функции, сколько символов в нашем сообщении.
Сразу после отправки сообщения мы используем функцию waitPacketSent(). Эта функция гарантирует, что Arduino подождёт, пока всё сообщение будет отправлено, прежде чем продолжить. Это важно, потому что мы не хотим прерывать передачу на полпути.
Наконец, delay(1000) приостанавливает программу на одну секунду между сообщениями. Это даёт приёмнику время обработать полученные данные и подготовиться к следующему сообщению. Без этой паузы сообщения могут поступать слишком быстро для корректной обработки приёмником.
rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
delay(1000);
Этот код повторяется каждую секунду, непрерывно отправляя «Hello World» по воздуху любому приёмнику, который прослушивает ту же частоту!
Код для приёмника
Вот скетч для приёмника:
// Include RadioHead Amplitude Shift Keying Library
#include <RH_ASK.h>
// Include dependant SPI Library
#include <SPI.h>
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
void setup()
{
// Initialize ASK Object
rf_driver.init();
// Setup Serial Monitor
Serial.begin(9600);
}
void loop()
{
// Set buffer to size of expected message
uint8_t buf[11];
uint8_t buflen = sizeof(buf);
// Check if received packet is correct size
if (rf_driver.recv(buf, &buflen))
{
// Message received with valid checksum
Serial.print("Message Received: ");
Serial.println((char*)buf);
}
}
После загрузки этого скетча на Arduino-приёмник откройте монитор последовательного порта. Если всё настроено правильно, вы должны увидеть сообщение «Hello World».
Объяснение кода
Код приёмника начинается точно так же, как код передатчика, — загружаются библиотеки RadioHead и SPI. Мы также создаём ASK-объект с именем rf_driver, который будет обрабатывать связь с нашим модулем приёмника.
#include <RH_ASK.h>
#include <SPI.h>
RH_ASK rf_driver;
В функции setup мы делаем две важные вещи. Во-первых, инициализируем ASK-объект с помощью rf_driver.init(), что подготавливает приёмник к прослушиванию сообщений. Во-вторых, запускаем последовательную связь с помощью Serial.begin(9600). Это позволяет нашему Arduino отправлять информацию на компьютер, чтобы мы могли видеть принятые сообщения в мониторе последовательного порта.
rf_driver.init();
Serial.begin(9600);
Переходя к функции loop, мы сначала создаём специальную область хранения, называемую буфером, для хранения входящего сообщения. Мы устанавливаем его размер 11 байт, потому что это точно столько символов содержится в «Hello World» (включая пробел). Если ваше сообщение имеет другую длину, вам нужно будет изменить это число соответственно. Каждый символ учитывается, включая пробелы и знаки препинания.
Затем мы создаём переменную buflen, которая хранит размер нашего буфера. Она будет использоваться приёмником, чтобы знать, сколько данных ожидать.
uint8_t buf[11];
uint8_t buflen = sizeof(buf);
Далее идёт самая важная часть — мы вызываем функцию recv(), которая активирует приёмник. Эта функция ожидает входящее сообщение, соответствующее нашим ожиданиям. Когда она получает правильное сообщение, она копирует его в наш буфер и возвращает true, чтобы сообщить нам, что что-то было получено.
Оператор if проверяет, вернула ли recv() значение true. Если да, это означает, что мы получили хорошее сообщение с правильной контрольной суммой (специальный код, помогающий проверить, что сообщение не было повреждено во время передачи). Внутри блока if мы выводим «Message Received: «, а затем само полученное сообщение. Часть (char*)buf преобразует данные нашего буфера обратно в читаемый текст.
if (rf_driver.recv(buf, &buflen))
{
Serial.print("Message Received: ");
Serial.println((char*)buf);
}
После отображения сообщения код возвращается к началу цикла и начинает прослушивать следующее сообщение.
Этот непрерывный цикл прослушивания и отображения сообщений завершает нашу систему беспроводной связи. Передатчик отправляет «Hello World» каждую секунду, и всякий раз, когда приёмник успешно принимает этот сигнал, он отображает сообщение в мониторе последовательного порта.
Увеличение дальности радиомодуля 433 МГц с помощью антенны
Знаете ли вы, что правильный выбор антенны может существенно повлиять на дальность связи ваших радиомодулей? Это правда! Без антенны вообще ваши устройства смогут общаться только в пределах рабочего стола — максимум на метр. Но добавьте правильную антенну, и они смогут обмениваться данными от одного конца дома до другого — до 50 метров!
Хорошая новость в том, что вам не нужно ничего особенного для антенны. Простой отрезок одножильного провода отлично подойдёт как для передатчика, так и для приёмника. Его очень легко найти и использовать!
В идеале наиболее эффективная антенна должна иметь длину, точно равную длине волны вашей частоты передачи. Однако это может быть непрактично для повседневных проектов. К счастью, использование половины или даже четверти этой длины волны часто работает почти так же хорошо, при этом будучи гораздо более удобным по размеру.
Чтобы понять, какая длина нам нужна, мы можем рассчитать длину волны по простой формуле:
Поскольку радиоволны распространяются со скоростью света (которая точно составляет 299 792 458 метров в секунду), мы можем рассчитать идеальную длину антенны для частоты 433 МГц следующим образом:
Длина волны частоты = |
299,792,458 м/с |
|---|---|
433,000,000 Гц |
|
= |
0.6924 метра |
= |
69.24 см |
Как видите, полноволновая антенна будет длиной почти 70 см. Это было бы неудобно встраивать в большинство проектов. Поэтому вместо неё обычно используется четвертьволновая антенна длиной всего 17,3 см. Гораздо удобнее!
Важный совет
Вы можете подумать, что можно сэкономить пространство, свернув или сложив провод антенны, но это было бы ошибкой! Когда вы сворачиваете антенну, электромагнитные волны интерферируют друг с другом, что резко снижает дальность передачи. Прямая антенна — всегда лучший выбор!