View Categories

Радио модули 433 МГц

Радио модули с частотой 433 MHz – самый простой способ связать две Ардуины по беспроводному каналу для передачи данных, например для управления роботом или отправки показаний температуры с уалённого датчика. Связь работает на той же частоте, что и пульты от шлагбаумов и некоторой другой техники, т.е. при помощи этих радиомодулей можно как перехватывать команды с пультов, так и отправлять их на приёмник! Модулей данного типа на китайских площадках существует несколько, продаются они парой (передатчик TX и приёмник RX), либо по отдельности.

Радио 433 МГц
В наборе GyverKIT START IOT EXTRA
Передатчик 433 МГц
Приёмник 433 МГц

Чем они лучше радио 2.4 GHz, например nRF24?

  • Неприхотливы к питанию
  • Потребляют небольшой ток
  • Занимают один пин МК
  • В два раза дешевле
  • Выше дальность связи при той же мощности
  • Более высокая проникающая способность

Наборы GyverKIT до 2 партии комплектовались парой модулей как по центру на картинке выше (модель SYNxxx), со второй партии в наборах идут модули FS1000A и MX-RM-5V (слева на картинке) как более удобные для подключения и более стабильные в работе.

Ток потребления модулей:

  • FS1000A [5V]: передача 12 мА, холостой 10 мкА
  • MX-RM-5V [5V]: 3.7 мА
  • SYN115 [3.3V]: передача 14 мА, холостой 0.5 мкА
  • SYN480R [5V]: 4.5 мА

Антенна #

Для лучшего качества связи к модулям в пин ANT нужно припаять антенну длиной 17.3 см (четверть волны) в виде одножильного провода, при желании можно свернуть в спираль:

Подключение к Arduino #

Модули подключаются к питанию и data – на любой цифровой пин. "Зелёные" модули к Arduino подключаются напрямую, а синий передатчик – через делитель напряжения трёх 10к резисторах (есть в наборе). Для подключения к esp8266 делитель не нужен, там и так 3.3V на пине.

На всех схемах передатчик слева, приёмник справа.


Библиотеки #

Для данных модулей можно использовать библиотеки:

  • VirtualWire – устаревшая библиотека для передачи данных при помощи радио модулей
  • RadioHead (если офф. сайт не работает – открываем через WebArchive, вот прямая ссылка на загрузку v1.121) – "обновлённая" VirtualWire, поддерживает некоторые протоколы пультов и может передавать пользовательские данные
  • RCSwitch – библиотека поддерживает работу со стандартными пультами от шлагбаумов
  • Gyver433 – моя библиотека для передачи любых данных по радио
  • GyverWire - более новая моя библиотека, удобнее в использовании и работает лучше чем Gyver433

В примерах на этом сайте будем использовать GyverWire, её можно установить/обновить из встроенного менеджера библиотек Arduino по названию GyverWire. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

GyverWire #

В следующих примерах модули подключены как на схеме выше. Приёмник подключается на пин с прерыванием по CHANGE, в обработчике прерывания нужно вызывать rx.pinChange().

Передача и приём строки
// отправка
#include <Arduino.h>
#include <GW_TX.h>

void setup() {
}

GW_TX_RF<2> tx;  // радио 433

void loop() {
    String s;
    s += "hello! ";
    static uint8_t i;
    s += ++i;

    noInterrupts();
    tx.sendPacket(s.c_str(), s.length());
    interrupts();

    delay(1000);
}
// приём
#include <Arduino.h>
#include <GW_RX.h>

GW_RX<2> rx;

void setup() {
    Serial.begin(115200);
    attachInterrupt(0, []() { rx.pinChange(); }, CHANGE);

    rx.onPacket([](uint8_t type, void* data, size_t len) {
        Serial.write((uint8_t*)data, len);
        Serial.println();
    });
}

void loop() {
    rx.tick();
}
Передача и приём структуры
// отправка
#include <Arduino.h>
#include <GW_TX.h>

struct Data {
    int i;
    float f;
};

void setup() {
}

GW_TX_RF<2> tx;  // радио 433

void loop() {
    static int i;
    Data data{i++, 3.14};

    noInterrupts();
    tx.sendPacket(data);
    interrupts();

    delay(1000);
}
// приём
#include <Arduino.h>
#include <GW_RX.h>

struct Data {
    int i;
    float f;
};

GW_RX<2> rx;

void setup() {
    Serial.begin(115200);
    attachInterrupt(0, []() { rx.pinChange(); }, CHANGE);

    rx.onPacket([](uint8_t type, void* data, size_t len) {
        if (sizeof(Data) != len) return;  // проверка корректности длины
        Data& d = *((Data*)data);
        Serial.print(d.i);
        Serial.print(',');
        Serial.println(d.f);

        // или
        // Serial.println(static_cast<Data*>(data)->f);
    });
}

void loop() {
    rx.tick();
}

Полезные страницы #

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх