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

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 MX RM 5V MX F01 Arduino  arduino    VirtualWire.rar (17,3 KiB, 1 835 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 МГц выделена для работы маломощных цифровых передатчиков таких как: радиобрелки автосигнализаций, брелки управления шлагбаумами на стоянках и другие подобные системы.

Похожие записи
Ведроид-мобиль — робот на Arduino — Ча... Сегодня получил на почте долгожданную посылку из Китая с мотоплатформой. На основе ее и буду собирать своего робота-машинку на Arduino. Кстати, стоим...
Видеоуроки по Arduino на русском... Серия 1. Первые шаги. Серия 2. Кнопки, PWM, функции. Серия 3. Основы схемотехники. Серия 4. Аналоговые входы. Серия 5. Моторы и транзи...
Детектор электромагнитного поля на Arduino... Данное устройство поможет вам без труда обнаружить источники электромагнитных излучений, которыми являются все электроприборы, которые нас окружают. ...
Pixar на Arduino Просто волшебную лампу на Arduino собрали студенты университета города Виктория в Великобритании.Великолепная идея и реализация. Мне очень понравило...
This entry was posted in Arduino and tagged , , , , , . Bookmark the permalink.

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

  1. nikolay говорит:

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

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

  2. nikolay говорит:

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

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

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *