Блог о программировании, электронике и рыбалке

Arduino – передача данных по радиоканалу на частоте 433.920 МГц

приемник передатчик VirtualWire MX RM 5V MX F01 Arduino  arduino  В этой статье я постараюсь подробно описать процесс организации передачи данных между контролерами Arduino по радиоканалу с использованием передатчика MX-F01 и приемника MX-RM-5V.

Эти модули планирую использовать в своей умной метеостанции, чтобы избавиться от лишних проводов.

Для начала, давайте познакомимся с железом.

Технические характеристики передатчик MX-F01

  • Напряжение питания: 3-12 В
  • Ток потребления в режиме ожидания: 0 мА
  • Ток потребления в режиме передачи: 20-28 мА
  • Рабочая частота: 433.920 МГц (Есть на частоту 315 МГц)
  • Выходная мощность передатчика: 40 мВт
  • Дальность передачи: до 500 м в зоне прямой видимости с дополнительной антенной длинной 17,5, 35 или 70 см
  • Тип модуляции: амплитудная
  • Температурный диапазон: –10…+70 °C
  • Размеры: 19х19х8 мм

приемник передатчик VirtualWire MX RM 5V MX F01 Arduino  arduino

Назначение выводов передатчика MX-F01

приемник передатчик VirtualWire MX RM 5V MX F01 Arduino  arduino

  • ATAD - данные
  • VCC - питание "+"
  • GND - питание "-"
  • ANT - антенна

Технические характеристики приемника MX-RM-5V

  • Напряжение питания: 5 В
  • Ток потребления: 4 мА
  • Рабочая частота: 433.920 МГц (Есть на частоту 315 МГц)
  • Размеры: 30х14х7 мм

приемник передатчик VirtualWire MX RM 5V MX F01 Arduino  arduino

Назначение выводов приемника MX-RM-5V

приемник передатчик VirtualWire MX RM 5V MX F01 Arduino  arduino

  • GND - питание "-"
  • DATA - данные
  • VCC - питание "+"
  • ANT - антенна

Базовую информацию получили – пора приступать к практической части.

Подключение передатчика MX-F01 к Arduino

Для управления передатчиком MX-F01 я буду использовать Arduino Mega 2560.

Приступим к подключению:

  • ATAD на MX-F01 подключаем к 12 дискретному выводу Arduino Mega 2560
  • VCC на MX-F01 подключаем к +5V Arduino Mega 2560
  • GND на MX-F01 подключаем к GND Arduino Mega 2560
  • ANT на MX-F01 к антенне в виде куска провода длинной 17,5, 35 или 70 см (я пока антенну не припаивал)

приемник передатчик VirtualWire MX RM 5V MX F01 Arduino  arduino

Подключение приемника MX-RM-5V к Arduino

Для управления приемником я буду использовать Arduino Nano ATmega328.

  • DATA на MX-RM-5V подключаем к 12 дискретному выводу Arduino Nano ATmega328
  • VCC на MX-RM-5Vподключаем к +5V Arduino Nano ATmega328
  • GND на MX-RM-5V подключаем к GND Arduino Nano ATmega328
  • ANT на MX-RM-5V к антенне в виде куска провода длинной 17,5, 35 или 70 см (я пока антенну не припаивал)

приемник передатчик VirtualWire MX RM 5V MX F01 Arduino  arduino

 

Библиотека VirtualWire

Чтобы упростить написания кода для работы с радиомодулями, была создана библиотека: VirtualWire.

VirtualWire.rar (17,3 KiB, 2 343 hits)

Распакуйте содержимое архива в папку /libraries/, которая находится в каталоге среды разработки Arduino.

приемник передатчик VirtualWire MX RM 5V MX F01 Arduino  arduino

Примеры кода для работы с передатчиком MX-F01 с использованием библиотеки VirtualWire

Пример 1

Данный скетч будет отправлять раз в секунду сообщение "Hello World". Для наглядности, в начале передачи будет загораться светодиод, а после окончания – гаснуть.

#include <VirtualWire.h>

const int led_pin = 13; // Пин светодиода
const int transmit_pin = 12; // Пин подключения передатчика

void setup()
{
  vw_set_tx_pin(transmit_pin);
  vw_setup(2000);       // Скорость передачи (Бит в секунду)
  pinMode(led_pin, OUTPUT);
}

void loop()
{
  const char *msg = "Hello World"; // Передаваемое сообщение
  digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале передачи
  vw_send((uint8_t *)msg, strlen(msg)); // Отправка сообщения
  vw_wait_tx(); // Ожидаем окончания отправки сообщения
  digitalWrite(led_pin, LOW); // Гасим светодиод в конце передачи
  delay(1000); // Пауза 1 секунда
}

Пример 2

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

#include <VirtualWire.h>

const int led_pin = 13; // Пин светодиода
const int transmit_pin = 12; // Пин подключения передатчика

void setup()
{
  vw_set_tx_pin(transmit_pin);
  vw_setup(2000);       // Скорость передачи (Бит в секунду)
  pinMode(led_pin, OUTPUT);
}

void loop()
{
  digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале передачи

  String millisresult = String(millis()); // Присваиваем переменной значение, равное количеству миллисекунд с момента начала выполнения текущей программы
  char msg[14];
  millisresult.toCharArray(msg, 14);

  vw_send((uint8_t *)msg, strlen(msg)); // Отправка сообщения
  vw_wait_tx(); // Ожидаем окончания отправки сообщения
  digitalWrite(led_pin, LOW); // Гасим светодиод в конце передачи
  delay(1000); // Пауза 1 секунда
}

Пример кода для работы с приемником MX-RM-5V с использованием библиотеки VirtualWire

#include <VirtualWire.h>

byte message[VW_MAX_MESSAGE_LEN]; // Буфер для хранения принимаемых данных
byte messageLength = VW_MAX_MESSAGE_LEN; // Размер сообщения

const int led_pin = 13; // Пин светодиода
const int receiver_pin = 12; // Пин подключения приемника

void setup()
{
  Serial.begin(9600); // Скорость передачиданных
  Serial.println("MX-RM-5V is ready");
  vw_set_rx_pin(receiver_pin); // Пин подключения приемника

  vw_setup(2000); // Скорость передачи данных (бит в секунду)
  vw_rx_start(); // Активация применика
}
void loop()
{
  if (vw_get_message(message, &messageLength)) // Если есть данные..
  {
    digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале приема пакета
    for (int i = 0; i < messageLength; i++)
    {
      Serial.write(message[i]); // выводим их в одной строке
    }
    Serial.println();
    digitalWrite(led_pin, LOW); // Гасим светодиод в конце
  }
}

Результат работы

Для “Пример 1” кода передатчика

приемник передатчик VirtualWire MX RM 5V MX F01 Arduino  arduino

Для “Пример 2” кода передатчика

приемник передатчик VirtualWire MX RM 5V MX F01 Arduino  arduino

Не забудьте припаять антенны, а то без них дальность передачи будет всего несколько сантиметров.

На этом пока все.

P.S.

Частота 433.920 МГц выделена для работы маломощных цифровых передатчиков таких как: радиобрелки автосигнализаций, брелки управления шлагбаумами на стоянках и другие подобные системы.

  • vertical_align_bottomArduino – передача данных по радиоканалу на частоте 433.920 МГц
    • Автор:
    • Язык: ru-RU
    • Миниатюра: https://geekelectronics.org/wp-content/uploads/2017/05/image14.png
    • Рубрика: Arduino
    • Метки: , , , , ,
    • Обновлено: 21.12.2016
    • Комментариев: 4
    • Просмотров: 35 158
  • Оцените статью - я старался
    1 Star2 Stars3 Stars4 Stars5 Stars (20 votes, average: 4,90 out of 5)
    Загрузка...
  • Поделитесь с друзьями
logo

Комментариев: 4

  • nikolay:

    Для “Пример 2” кода передатчика
    у меня происходит странное явление. После увеличения разрядности счетчика (было 99ххх стало 100ххх) число полученных знаков остается старым (в нашем примере 5) и младший разряд не получается.
    После перезагрузки приемника начинаем принимать 6 разрядов но при следующем увеличении разрядности история повторяется.
    Хуже дело обстоит с перезагрузкой передатчика. Приемник принимает только 1 знак (думаю это связано с тем что время после включения =0 и первый раз передается только 1 знак)

    Далее к передаче прибавляю текст и в начало и в конец. Получаю строку "HI 99123 LO". Проблема сохраняется - при увеличении длины переданной строки начинает резать последний символ.....

  • nikolay:

    Нашел ошибку
    void loop()
    {
    if (vw_get_message(message, &messageLength)) // Если есть данные..

    messageLength получает длину полученной строки. а в следующем цикле мы ее передаем как размер буфера (размер message) . в начале цикла надо заново инициализировать эту переменную
    messageLength = VW_MAX_MESSAGE_LEN;

  • Виктор:

    А можно как то без использования Arduino передать сигнал на приемник что бы при этом на приемнике светился светодиод?

    • source™:

      К сожалению, без дополнительного контроллера не получится.

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

vertical_align_top
banner