Радиоуправление на Arduino
Соберем радиоуправление на основе Arduino Uno и радиомодуля MX-05v. Этот модуль работает на частоте 443 МГц, что позволяет использовать его под водой (волны в диапазоне 2.4 ГГц не проникают под воду). Потом поставим его на модель Радиоуправляемой Подводной Лодки.
Радиомодуль MX-05V + MX-FS-03V подкупает своей низкой ценой - около 60 рублей за пару. Заявленной дальности связи 20-200 метров хватает для небольших моделей машин или лодок.
Сделаем одноканальную аппаратуду. Для этого нам понадобятся:
- 2 платы Ардуино для приемника и передатчика
- комплект радиомодуля MX-05V + MX-FS-03V
- переменный резистор или джойстик для передатчика
- рулевая машинка (серва) для приемника
Суть работы программы заключается в следующем:
- считываем значение с переменного резистора (число от 0 до 1023)
- переводим это число в 2 байта (16 бит, т.к. 1023 занимает 10 бит и не поместится в один байт)
- передаем по радио-каналу
- приемник принимает 2 байта по радио каналу
- переводит их обратно в число от 0 до 1023
- передает команду серво-машинке
Принцип работы Arduino доступно описан на разных веб-ресурсах. Мне понравился бесплатный обучающий онлайн курс «Строим роботов и другие устройства на Arduino». Рекомендую.
Загружаем текс программы (скетч) для передатчика и приемников. Кстати, программы надо хранить в разных папках, иначе во время компиляции они будут сливаться в один файл и конфликтовать из-за дублирования функций setup
и loop
.
Как подключить сторонние библиотеки к Arduino описано например тут.
Передатчик
// Библиотека передатчика
#include <VirtualWire.h>
void setup()
{
// Запуск передатчика
vw_set_ptt_inverted(true);
vw_setup(1000); // Bits per sec
}
void loop()
{
// чтение показаний с переменного резистора
int sensorValue = analogRead(A0);
// отправляем значение
send(sensorValue);
}
void send(int param)
{
// конвертируем int в массив из 2 байт
uint8_t msg[2];
int len = 2;
msg[0] = highByte(param);
msg[1] = lowByte(param);
// отправляем непосредственно в радиоканал
vw_send(msg, len);
// ждем пока сообщение не уйдет целиком
vw_wait_tx();
}
Приемник
// Библиотека для приемника
#include <VirtualWire.h>
// Библиотека для серво машинки. В отличии от обычной Servo.h не конфликтует с VirtualWire.h
// Скачать библиотеку можно тут.
// http://en.osdn.jp/projects/sfnet_pgahtow/downloads/Arduino%20(v1.0)%20libaries/ServoTimer2.zip/
// Надо закомментировать 41 строчку в файле ServoTimer2.h в случае ошибки компиляции
// 'typedef uint8_t boolean;'
#include <ServoTimer2.h>
// Создаем объект серво-машинки
ServoTimer2 myservo;
void setup()
{
// для отладки
// Serial.begin(9600);
// Запуск приемника
vw_set_ptt_inverted(true);
vw_setup(1000); // бит в секунду
vw_rx_start(); // запуск приемника
// подключаем серво к 6 пину
myservo.attach(6);
}
void loop()
{
uint8_t msg[2];
uint8_t len = 2;
if (vw_get_message(msg, &len)) {
// переводим байты в int
int value = word(msg[0], msg[1]);
// подгоняем под диапазон входных данных сервы
int sValue = map(value, 0, 1023, 600, 2400);
myservo.write(sValue);
// Serial.println(sValue);
}
}
И в итоге - ничего не работает! Почему?
Питание
Радиомодуль MX-05V очень простой, из-за этого он очень восприимчив к внешним помехам. И даже такой маленький мотор как в серво-машинке способен нарушить его работу. Для того, чтобы минимизировать влияние электромотора (это касается только колекторных моторов), нужно разделить питание силовой части от приемника. При этом «минус» у них должен быть общий. Итоговая схема подключения приемника выглядит так.
Результат
Данные радиомодуль слишком восприимчив к помехам, и управлять летательной техникой на нем нельзя. Но для игрушечной машинки или лодки вполне подойдет.