Радиоуправление на ардуино своими руками
Всем добрый день! Решил сделать радиоуправление (для машинки) на Arduino Pro Mini (Mega168). Принцип такой: передатчик (Pro Mini Mega168) передает 1 байт в котором первые 4 бита - напрвление движения и управление поворотами. В подробности не буду вдаваться - прикреплю скетчи передатчика и приемника - там все расписано. Схема управления в машинке простая:
2 аккумулятора 18650 - от них понижалка LM2596 на 5 вольт - все это питает Ардуинку + серву(повороты) + H-мост моторчика. От LM2596 идет еще понижалка 1117 на 3.3 вольта для питания радиомодуля nrf24l01+.
Схема работает отлично без каких-либо проблем. НО! Надо сделать радиоуправляемой другую машинку. И тут пришлось "изголяться". Машинка типа "Баги", внутреннего пространства почти нет, по этому пришлось вместо 2-х аккумуляторов 18650 ставить один аккумулятор cga103450 (плоский и меньше чем 18650) + повышалку MT3608 на 5 вольт для работы схемы. Еще дно изменение: вместо радиомодуля nrf24l01+ поставил китайскую копию SE8R01. Схема (щелкните для увеличения):
Фото схемы внутри машинки (ногами не пинайте, это пока тестовая сборка) :
На первом фото виднеется слева повышалка, потом идет серва, ардуина и радиомодуль. На втором фото в отсеке для батареек расположился H-мост и аккумулятор.
Если отключить моторчик от H-моста то подобных зависаний нет, но если вместо моторчика поставить хоть какую-то нагрузку (светодиод) то история опять повторяется. Получается что вся беда в H-мосте (когда к нему хоть что-то подключено). Но почему - не понятно. Платку моста снял с машинки. Платка раньше работала без проблем. В чем может быть причина? Из-за чего такой глюк может быть?
Соберем радиоуправление на основе 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
- передает команду серво-машинке
Загружаем текс программы (скетч) для передатчика и приемников. Кстати, программы надо хранить в разных папках, иначе во время компиляции они будут сливаться в один файл и конфликтовать из-за дублирования функций setup и loop . Как подключить сторонние библиотеки к Arduino описано например тут.
Передатчик
Приемник
И в итоге - ничего не работает! Почему?
Питание
Результат
Данные радиомодуль слишком восприимчив к помехам, и управлять летательной техникой на нем нельзя. Но для игрушечной машинки или лодки вполне подойдет.
СБОРКА СИСТЕМЫ
ПРИСТУПАЕМ К МОНТАЖУ
РАДИОУПРАВЛЕНИЕ НА ARDUINO™
В ДАННОЙ СТАТЬЕ И В ВИДЕО МЫ РАЗБЕРЕМ СБОРКУ ПЕРЕДАТЧИКА НА ARDUINO™ ИСПОЛЬЗУЯ РАДИО МОДУЛЬ NRF24L01+PA+LNA (Nordic Radio Frequency 2.4G) ПРИДЕРЖИВАЙТЕСЬ КАЖДОГО ШАГА И У ВАС ВСЁ ПОЛУЧИТСЯ!
ПЕРЕДАТЧИК
каждый шаг Согласно схемы
РАДИОУПРАВЛЕНИЕ НА ARDUINO™
В ДАННОЙ СТАТЬЕ И В ВИДЕО МЫ РАЗБЕРЕМ СБОРКУ ПРИЕМНИКА НА ARDUINO™ ИСПОЛЬЗУЯ РАДИО МОДУЛЬ NRF24L01+PA+LNA (Nordic Radio Frequency 2.4G) ПРИДЕРЖИВАЙТЕСЬ КАЖДОГО ШАГА И У ВАС ВСЁ ПОЛУЧИТСЯ!
Всем привет! Это моя первая статья. Хочу рассказать о разработке, сборке и испытании самодельной аппаратуры радиоуправления* из электрических копмонентов с Aliexpress. Давно об этом думал, т.к. её можно будет сделать (программно) намного умнее покупных заводских, да ещё и с 32 каналами!
*в этой статье я представлю авиамодельную (самолёт, планер, коптер и др.) аппаратуру
byte bt( int pin) < //тип данных возвращаемого значения byte
pinMode (pin, INPUT_PULLUP );
boolean bt_state = ! digitalRead (pin);
if (bt_state == 1) return 1;
> else return 0;
>
>
Для простого зажигания зелёного светодиода написал эту функцию:
void ledon() pinMode (3, OUTPUT ); //устанавливаем пин 3 как выход
digitalWrite (3, HIGH ); //зажигаем
delay (150); //ждём
digitalWrite (3, LOW ); //гасим
delay (200); //ждём
>
byte toservo( int potpin, int low, int high, int range) int lowr = (180 - range) / 2;
int highr = 180 - ((180 - range) / 2);
return map ( analogRead (potpin), low, high, lowr, highr);
>
Для регулировки яркости всяческой подсветки и иллюминации написана функция toaw(), которая принимает в параметрах пин потенциометра, с которого надо считывать сигнал. Возвращает значения типа byte в диапазоне 0-255. Далее на приёмнике активируется функция analogWrite(), которая создаёт ШИМ на заданном пине.
byte toaw( int potpin2) return map ( analogRead (potpin2), 0, 1023, 0, 255);
>
Настал черёд приёмника. В его коде ничего примечательного нет, кроме функции биндинга. Если тумблер 4 находится наверху (причём передатчик включен заранее) и включается приёмник, приходит сигнал состояния тумблера 4 и запускается функция биндинга:
boolean motor_flag = 0; //флаг биндинга регуля, по умолчанию опущен
void bind()<
//функция ничего не принимает и ничего не возвращает
servo_0. writeMicroseconds (2300);
delay (3000);
servo_0. writeMicroseconds (800);
delay (5000);
motor_flag = 1; //поднимаем флаг
>
Прошивки лежат в архиве на Гугл Диске.
Распиновка (чё куда подключать) для версии прошивки 1.1 в виде таблицы лежит здесь.
О дальности сигнала есть видео у AlexGyver’a (включайте видео на 13 минут 29 секунд, именно в этом месте начинается "тест"):
Выражаю благодарность в содействии созданию этого устройства:
Родным за терпение,
Александру Майорову (AlexGyver’у) за предоставленные в описаниях к видео скетчи,
Ивану Хмелевскому за то, что выслушивал, когда я ему поведывал о каждом новом этапе создания аппы.
Читайте также: