Содержание
Скетч Arduino для радиочастотного передатчика 433 МГц
В нашем эксперименте мы отправим простое текстовое сообщение от передатчика к получателю. Будет полезно понять, как использовать модули, и это может послужить основой для более практических экспериментов и проектов.
Вот скетч, который мы будем использовать для нашего передатчика:
// Подключаем библиотеку RadioHead Amplitude Shift Keying #include <RH_ASK.h> // Подключаем библиотеку SPI Library #include <SPI.h> // Создаем объект управления смещением амплитуды RH_ASK rf_driver; void setup() { // Инициализируем объект ASK 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. Мы также должны подключить библиотеку SPI Arduino, так как от нее зависит библиотека RadioHead.
#include <RH_ASK.h> #include <SPI.h>
Далее нам нужно создать объект ASK, чтобы получить доступ к специальным функциям, связанным с библиотекой RadioHead ASK.
// Создаем объект управления смещением амплитуды RH_ASK rf_driver;
В функции setup() нам нужно инициализировать объект ASK.
// Инициализируем объект ASK rf_driver.init();
В функции loop() мы начинаем с подготовки сообщения. Это простая текстовая строка, которая хранится в char с именем msg. Знайте, что ваше сообщение может быть любым, но не должно превышать 27 символов для лучшей производительности. И обязательно посчитайте количество символов в нем, так как вам понадобится это количество в коде получателя. В нашем случае у нас 11 символов.
// Готовим сообщение const char *msg = "Hello World";
Затем сообщение передается с использованием функции send(). Он имеет два параметра: первый — это массив данных, а второй — количество байтов (длина данных), подлежащих отправке. За send() функцией обычно следует waitPacketSent() функция, которая ожидает завершения передачи любого предыдущего передаваемого пакета. После этого код ждет секунду, чтобы дать нашему приемнику время разобраться во всем.
rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); delay(1000);
ASK — Amplitude Shift Keying
Как обсуждалось выше, для отправки цифровых данных по радиоканалу, эти модули используют технику, называемую Amplitude Shift Keying или ASK (амплитудная модуляция). Это когда амплитуда (то есть уровень) несущей волны (в нашем случае это сигнал 433 МГц) изменяется в ответ на входящий сигнал данных.
Это очень похоже на аналоговую технику амплитудной модуляции, с которой вы, возможно, знакомы, если вы собирали AM-радио. Иногда это называется двоичной амплитудной манипуляцией, потому что нам необходимо только два уровня. Вы можете представить это как переключатель ВКЛ / ВЫКЛ.
- Для лог. 1 — несущая в полную силу
- Для лог. 0 — несущая отключена
Профессиональный цифровой осциллограф
Количество каналов: 1, размер экрана: 2,4 дюйма, разрешен…
Подробнее
Амплитудная модуляция имеет преимущество в том, что она очень проста в реализации. На ее основе довольно просто спроектировать схему декодера. Также для ASK требуется меньшая полоса пропускания, чем другим методам модуляции, таким как FSK (частотная модуляция). Это одна из причин того дешевизны модулей.
Однако недостатком является то, что амплитудная модуляция подвержена помехам от других радиоустройств и фоновому шуму. Но пока вы обеспечиваете передачу данных на относительно медленной скорости, она может надежно работать в большинстве сред.
Примеры
Рассмотрим тестовый пример, который отправляет строку Hello from #<счётчик>:
Отправка
#include <Gyver433.h> Gyver433_TX<2> tx; // указали пин void setup() { } char data[] = "Hello from #xx"; // строка для отправки byte count = 0; // счётчик для отправки void loop() { // добавляем счётчик в строку data = (count / 10) + '0'; data = (count % 10) + '0'; if (++count >= 100) count = 0; tx.sendData(data); delay(100); }
Приём
#include <Gyver433.h> Gyver433_RX<2, 20> rx; // указали пин и размер буфера void setup() { Serial.begin(9600); attachInterrupt(0, isr, CHANGE); // прерывание пина радио по CHANGE } // спец. тикер вызывается в прерывании void isr() { rx.tickISR(); } void loop() { if (rx.gotData()) { // если успешно принято больше 0 Serial.write(rx.buffer, rx.size); // выводим Serial.println(); } }
Библиотека позволяет отправлять данные любого типа (массив, структура) любой длины, что охватывает все возможные сценарии работы с радио.
Схема подключения передатчика и приемника 433 МГц к Arduino UNO
Теперь, когда мы знаем все о модулях, пришло время использовать их!
Поскольку мы будем передавать данные между двумя платами Arduino, нам, конечно, понадобятся две платы Arduino, две макетные платы и пара соединительных проводов.
Схема для передатчика довольно проста. У него всего три соединения. Подключите контакт VCC к контакту 5 В и минус к Arduino. Контакт Data-In должен быть подключен к цифровому контакту Arduino № 12. Вы должны использовать контакт 12, так как по умолчанию библиотека, которую мы будем использовать в нашем скетче, использует этот контакт для ввода данных.
На следующем рисунке показана схема соединения.
После подключения передатчика вы можете перейти к приемнику. Подключение приемника так же просто, как и передатчика.
Так же нужно сделать только три соединения. Подключите контакт VCC к контакту 5 В и минус на Arduino. Любой из двух средних выводов Data-Out должен быть подключен к цифровому выводу № 11 на Arduino.
Вот так должна выглядеть схема соединения для приемника.
Теперь, когда передатчик и приемник подключены, нам нужно написать код и отправить его на соответствующие платы Arduino. Поскольку у вас, вероятно, только один компьютер, мы начнем с передатчика. Как только код будет загружен, мы перейдем к приемнику. Arduino, к которому подключен передатчик, может питаться от источника питания или батареи.
Увеличение дальности радиочастотных модулей 433 МГц
Антенна, которую вы используете как для передатчика, так и для приемника, может реально повлиять на дальность передачи, которую вы сможете получить с помощью этих радиочастотных модулей. На самом деле без антенны вы сможете общаться на расстоянии не более метра.
При правильной конструкции антенны вы сможете общаться на расстоянии до 50 метров. Конечно, это на открытом пространстве. Ваш диапазон в помещении, особенно через стены, будет слегка ослаблен.
Антенна не должна быть сложной. Простой кусок одножильного провода может послужить отличной антеной для передатчика и приемника. Диаметр антенны вряд ли имеет какое-либо значение, если длина антенны правильная.
Самая эффективная антенна имеет ту же длину, что и длина волны, для которой она используется. Для практических целей достаточно половины или четверти этой длины.
Длина волны частоты рассчитывается как:
Длина волны = скорость распространения (v) / частота (f)
В воздухе скорость передачи равна скорости света, которая, если быть точным, составляет 299 792 458 м/с. Итак, для частоты 433 МГц длина волны равна:
Длина волны = 299 792 458 м/с / 433 000 000 Гц = 0,6924 м
Полноволновая антенна длиной 69,24 см довольно длинная, ее использование не очень удобно. Вот почему мы выберем четвертьволновую антенну, длина которой составляет 17,3 см.
На всякий случай, если вы экспериментируете с другими радиопередатчиками, которые используют разные частоты, вы можете использовать ту же формулу для расчета необходимой длины антенны. Довольно просто, верно?
Скачать библиотеку RadioHead (402,8 KiB, скачано: 412)
Передатчик WL102-341
Модуль передатчика WL102-341 работает на частоте 433 мГц и имеет мощность передачи более 11 дБм. Напряжение питания может варьироваться в пределах от 1.8 до 3.6 В. В режиме передачи данных, потребление при низком логическом уровне на линии DAT составляет 5 мА, при высоком 17 мА, в отключенном состоянии (низкий уровень на линии EN) потребление менее 1 мкА.
Технические характеристики WL102-341
- Поддержка ASK/ООК модуляции: мощность передачи больше 11dBm;
- Частота: 433.92 МГц;
- Диаппазрон входного напряжения: от 1.8 В до 3.6 В;
- Ток потребления: 17.0 mA;
- Ток покоя: 1 uA;
- Дальность передачи: до 200 м;
- Скорость передачи данных: до 20 кГц;
- Температурный диапазон: от -40 до +85 ° C;
- Размер: 16 × 12 × 1 (мм)
- Разем под внешнюю антену.
Распиновка передатчика WL102-341
Модуль передатчика WL102-341 имеет четыре вывода: «+» и «—» для подключения питания, EN — линия включение передатчика, DAT — вход для передачи данных. На данном модуле линия EN неактивна, так как на плате установлена перемычка, соединяющая 1-й вывод микросхемы (EN) с линией питания, то есть модуль постоянно работал при подаче питания. Можно отпаять перемычку, чтобы иметь возможность управления передатчиком.
Вывод/Пин | Описание |
---|---|
-/GND | Земля (Ground) |
+/VIN | Питание (Voltage Input) |
DAT | Вход для передачи данных (Data Input) |
EN | Линия включение передатчика (Enable) |
TOU | Антенна |
Распиновка передатчика и приемника 433 МГц
Давайте посмотрим на распиновку модулей передатчика и приемника RF 433 МГц.
DATA — принимает цифровые данные для передачи.
VCC — обеспечивает питание передатчика. Это может быть любое положительное постоянное напряжение от 3,5 до 12 В. Обратите внимание, что РЧ-выход пропорционален напряжению питания, т.е. чем выше напряжение, тем больше будет дальность.
GND — минус питания.
Антенна — это разъем для внешней антенны. Как обсуждалось ранее, вам понадобится припаять кусок проволоки длинной 17,3 см к этому контакту для улучшения дальности.
- DATA — выводит полученные цифровые данные. Два центральных штифта внутренне связаны между собой, поэтому вы можете использовать любой из них для вывода данных.
- VCC — обеспечивает питание приемника. В отличие от передатчика, напряжение питания для приемника должно быть 5 В.
- GND — минус питания.
- Антенна — это разъем для внешней антенны, который часто не обозначен. Это накладка в левом нижнем углу модуля, рядом с маленькой катушкой. Опять же, можно припаять кусок провода длинной 17,3 см к этому контакту для улучшения дальности.
Описание
Радио модули с частотой 433 MHz – самый простой способ связать две Ардуины по беспроводному каналу. Чем они лучше радио 2.4 GHz, например nRF24?
- Неприхотливы к питанию
- Потребляют небольшой ток
- Занимают один пин МК
- В два раза дешевле
- Выше дальность связи при той же мощности
- Более высокая проникающая способность
Также на этой частоте работают пульты управления (брелоки) радио-реле и шлагбаумов, что позволяет перехватывать их команды и подменять при желании.
Модулей данного типа на китайских площадках существует несколько, продаются они парой (передатчик TX и приёмник RX), либо по отдельности.
Наборы GyverKIT до 2 партии комплектовались парой модулей как по центру на картинке выше (модель SYNxxx), со второй партии в наборах идут модули FS1000A и MX-RM-5V (слева на картинке) как более удобные для подключения и более стабильные в работе. Правые модули, несмотря на самый высокий ценник, работают хуже всех и к покупке не рекомендуются.
Ток потребления модулей:
- FS1000A : передача 12 мА, холостой 10 мкА
- MX-RM-5V : 3.7 мА
- SYN115 : передача 14 мА, холостой 0.5 мкА
- SYN480R : 4.5 мА
Для лучшего качества связи к модулям в пин ANT нужно припаять антенну длиной 17.3 см (четверть волны) в виде одножильного провода, при желании можно свернуть в спираль:
RadioHead Library — универсальная библиотека для беспроводных модулей
Прежде чем мы начнем программировать, установим библиотеку RadioHead в Arduino IDE.
RadioHead — это библиотека, которая позволяет легко передавать данные между платами Arduino. Она настолько универсальна, что ее можно использовать для управления всеми видами устройств радиосвязи, включая наши модули на 433 МГц.
Библиотека RadioHead собирает наши данные, инкапсулирует их в пакет данных, который включает в себя CRC (проверку циклически избыточного кода), а затем отправляет его с необходимой преамбулой и заголовком на другую Arduino. Если данные получены правильно, принимающая плата Arduino проинформирует о наличии доступных данных и приступит к их декодированию и выполнению.
Пакет RadioHead формируется следующим образом: 36-битный поток из пар «1» и «0», называемый «обучающей преамбулой», отправляется в начале каждой передачи. Эти биты необходимы приемнику для регулировки его усиления до получения фактических данных. Затем следует 12-битный «Начальный символ», а затем фактические данные (полезная нагрузка).
Последовательность проверки или CRC добавляется в конец пакета, который пересчитывается RadioHead на стороне приемника, и если проверка CRC верна, приемное устройство получает предупреждение. Если проверка CRC не пройдена, пакет отбрасывается.
Весь пакет выглядит примерно так: