Радиомодули 433MHz RF Tx-Rx. Взаимодействие с Ардуино

Хотите добавить беспроводные возможности в ваш следующий проект Arduino, причем за меньшую цену, чем чашка кофе? Что ж, тогда модули передатчика и приемника 433 МГц для вас! 

Их можно купить в интернете менее чем за два доллара за пару, что делает их одним из самых недорогих вариантов передачи данных, которые вы можете получить. И что самое приятное, эти модули очень крошечные, что позволяет использовать беспроводной интерфейс практически в любом проекте.

Обзор оборудования

Давайте подробнее рассмотрим модули передатчика и приемника 433 МГц.

передатчик 433 МГц

Этот маленький модуль является передатчиком. Сердцем модуля является резонатор SAW, настроенный на работу в диапазоне 433.xx МГц. Есть переключающий транзистор и несколько пассивных компонентов, вот и все.

Когда на вход DATA поступает логическая 1, генератор начинает работать, генерируя постоянную РЧ несущую волну на частоте 433.xx МГц, а когда на входе DATA устанавливается логический 0, генератор останавливается. Этот метод известен как Amplitude Shift Keying, о котором мы вскоре поговорим подробнее.

 приемник 433 МГцЭто приемный модуль. Хотя все выглядит сложным, но он так же просто, как модуль передатчика. Он состоит из радиочастотной схемы и пары операционных усилителей для усиления принимаемой несущей от передатчика. Усиленный сигнал подается на ФАПЧ (фазовая автоподстройка частоты), которая позволяет декодеру «выделить» поток цифровых битов, что обеспечивает лучшее декодирование и помехоустойчивость.

ASK — Amplitude Shift Keying

Как обсуждалось выше, для отправки цифровых данных по радиоканалу, эти модули используют технику, называемую Amplitude Shift Keying или ASK (амплитудная модуляция). Это когда амплитуда (то есть уровень) несущей волны (в нашем случае это сигнал 433 МГц) изменяется в ответ на входящий сигнал данных.

Это очень похоже на аналоговую технику амплитудной модуляции, с которой вы, возможно, знакомы, если вы собирали AM-радио. Иногда это называется двоичной амплитудной манипуляцией, потому что нам необходимо только два уровня. Вы можете представить это как переключатель  ВКЛ / ВЫКЛ.

  • Для лог. 1 — несущая в полную силу
  • Для лог. 0 — несущая отключена

амплитудная модуляция

Амплитудная модуляция имеет преимущество в том, что она очень проста в реализации. На ее основе довольно просто спроектировать схему декодера. Также для ASK требуется меньшая полоса пропускания, чем другим методам модуляции, таким как FSK (частотная модуляция). Это одна из причин того дешевизны модулей.

Однако недостатком является то, что амплитудная модуляция подвержена помехам от других радиоустройств и фоновому шуму. Но пока вы обеспечиваете передачу данных на относительно медленной скорости, она может надежно работать в большинстве сред.

Распиновка передатчика и приемника 433 МГц

Давайте посмотрим на распиновку модулей передатчика и приемника RF 433 МГц.

Распиновка передатчика 433 МГц

 

  • DATA — принимает цифровые данные для передачи.
  • VCC — обеспечивает питание передатчика. Это может быть любое положительное постоянное напряжение от 3,5 до 12 В. Обратите внимание, что РЧ-выход пропорционален напряжению питания, т.е. чем выше напряжение, тем больше будет дальность.
  • GND — минус питания.
  • Антенна — это разъем для внешней антенны. Как обсуждалось ранее, вам понадобится припаять кусок  проволоки длинной 17,3 см к этому контакту для улучшения дальности.

Распиновка приемника 433 МГц

  • DATA — выводит полученные цифровые данные. Два центральных штифта внутренне связаны между собой, поэтому вы можете использовать любой из них для вывода данных.
  • VCC — обеспечивает питание приемника. В отличие от передатчика, напряжение питания для приемника должно быть 5 В.
  • GND — минус питания.
  • Антенна — это разъем для внешней антенны, который часто не обозначен. Это накладка в левом нижнем углу модуля, рядом с маленькой катушкой. Опять же, можно припаять кусок провода  длинной 17,3 см к этому контакту для улучшения дальности.

Схема подключения передатчика и приемника 433 МГц к Arduino UNO

Теперь, когда мы знаем все о модулях, пришло время использовать их!

Поскольку мы будем передавать данные между двумя платами Arduino, нам, конечно, понадобятся две платы Arduino, две макетные платы и пара соединительных проводов.

Схема для передатчика довольно проста. У него всего три соединения. Подключите контакт VCC к контакту 5 В и минус к Arduino. Контакт Data-In должен быть подключен к цифровому контакту Arduino № 12. Вы должны использовать  контакт 12, так как по умолчанию библиотека, которую мы будем использовать в нашем скетче, использует этот контакт для ввода данных.

На следующем рисунке показана схема соединения.

Схема соединения передатчика с ардуино

После подключения передатчика вы можете перейти к приемнику. Подключение приемника так же просто, как и передатчика.

Так же нужно сделать только три соединения. Подключите контакт VCC к контакту 5 В и минус на Arduino. Любой из двух средних выводов Data-Out должен быть подключен к цифровому выводу № 11 на Arduino.

Вот так должна выглядеть схема соединения для приемника.

Схема соединения приемника с ардуино

Теперь, когда передатчик и приемник подключены, нам нужно написать код и отправить его на соответствующие платы Arduino. Поскольку у вас, вероятно, только один компьютер, мы начнем с передатчика. Как только код будет загружен, мы перейдем к приемнику. Arduino, к которому подключен передатчик, может питаться от источника питания или батареи.

RadioHead Library — универсальная библиотека для беспроводных модулей

Прежде чем мы начнем программировать, установим библиотеку RadioHead в Arduino IDE.

RadioHead — это библиотека, которая позволяет легко передавать данные между платами Arduino. Она настолько универсальна, что ее можно использовать для управления всеми видами устройств радиосвязи, включая наши модули на 433 МГц.

Библиотека RadioHead собирает наши данные, инкапсулирует их в пакет данных, который включает в себя CRC (проверку циклически избыточного кода), а затем отправляет его с необходимой преамбулой и заголовком на другую Arduino. Если данные получены правильно, принимающая плата Arduino проинформирует о наличии доступных данных и приступит к их декодированию и выполнению.

Пакет RadioHead формируется следующим образом: 36-битный поток из пар «1» и «0», называемый «обучающей преамбулой», отправляется в начале каждой передачи. Эти биты необходимы приемнику для регулировки его усиления до получения фактических данных. Затем следует 12-битный «Начальный символ», а затем фактические данные (полезная нагрузка).

Последовательность проверки или CRC добавляется в конец пакета, который пересчитывается RadioHead на стороне приемника, и если проверка CRC верна, приемное устройство получает предупреждение. Если проверка CRC не пройдена, пакет отбрасывается.

Весь пакет выглядит примерно так:

 

Скетч 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);

Скетч Arduino для радиочастотного приемника 433 МГц

Подключите приемник Arduino к компьютеру и загрузите следующий код:

// Подключаем библиотеку RadioHead Amplitude Shift Keying
#include <RH_ASK.h>
// Подключаем библиотеку SPI Library 
#include <SPI.h> 
 
// Создаем объект управления смещением амплитуды
RH_ASK rf_driver;

void setup()
{
    // Инициализируем объект ASK
    rf_driver.init();
    // Настройка Serial Monitor
    Serial.begin(9600);
}
 
void loop()
{
    // Установить размер буфера ожидаемого сообщения
    uint8_t buf[11];
    uint8_t buflen = sizeof(buf);
    // Проверка правильности размера полученного пакета
    if (rf_driver.recv(buf, &buflen))
    {
      
      // Сообщение получено с правильной контрольной суммой
      Serial.print("Message Received: ");
      Serial.println((char*)buf);         
    }
}

Как и код передатчика, код приемника начинается с подключения библиотек RadioHead и SPI и создания объекта ASK.

#include <RH_ASK.h>
#include <SPI.h> 
RH_ASK rf_driver;

В setap() мы инициализируем объект ASK, а также настраиваем последовательный монитор, так как мы будем просматривать наше полученное сообщение.

rf_driver.init();
Serial.begin(9600);

В функции loop() мы создаем буфер размером передаваемого сообщения. В нашем случае это 11, помните? Вам нужно будет настроить это, чтобы соответствовать длине вашего сообщения. Обязательно укажите все пробелы и знаки препинания, поскольку все они считаются символами.

uint8_t buf[11];
uint8_t buflen = sizeof(buf);

Далее мы вызываем функцию recv(). Это включает приемник, если он еще не включен. Если доступно сообщение, оно копирует сообщение в свой первый буфер параметров и возвращает true, иначе возвращает false. Если функция возвращает true, код вводит оператор if и печатает полученное сообщение на мониторе последовательного порта.

if (rf_driver.recv(buf, &buflen))
{
  Serial.print("Message Received: ");
  Serial.println((char*)buf);         
}

Затем мы возвращаемся к началу цикла и делаем все заново.

После загрузки скетча откройте серийный монитор. Если все в порядке, вы должны увидеть ваше сообщение.

Увеличение дальности радиочастотных модулей 433 МГц

Антенна, которую вы используете как для передатчика, так и для приемника, может реально повлиять на дальность передачи, которую вы сможете получить с помощью этих радиочастотных модулей. На самом деле без антенны вы сможете общаться на расстоянии не более метра.

При правильной конструкции антенны вы сможете общаться на расстоянии до 50 метров. Конечно, это на открытом пространстве. Ваш диапазон в помещении, особенно через стены, будет слегка ослаблен.

Антенна не должна быть сложной. Простой кусок одножильного провода может послужить отличной антеной для передатчика и приемника. Диаметр антенны вряд ли имеет какое-либо значение, если длина антенны правильная.

Самая эффективная антенна имеет ту же длину, что и длина волны, для которой она используется. Для практических целей достаточно половины или четверти этой длины.

Длина волны частоты рассчитывается как:

Длина волны = скорость распространения (v) / частота (f)

В воздухе скорость передачи равна скорости света, которая, если быть точным, составляет 299 792 458 м/с. Итак, для частоты 433 МГц длина волны равна:

Длина волны = 299 792 458 м/с / 433 000 000 Гц = 0,6924 м

Полноволновая антенна длиной 69,24 см довольно длинная, ее использование не очень удобно. Вот почему мы выберем четвертьволновую антенну, длина которой составляет 17,3 см.

На всякий случай, если вы экспериментируете с другими радиопередатчиками, которые используют разные частоты, вы можете использовать ту же формулу для расчета необходимой длины антенны. Довольно просто, верно?

Даже 17,3 см антенна может показаться неудобной в вашем крошечном проекте Arduino. Но НЕ соблазняйтесь наматывать антенну, чтобы сделать ее более компактной, так как это серьезно повлияет на дальность действия. Прямая антенна всегда лучше!

 

Добавить комментарий

Ваш электронный адрес не будет опубликован.


*