Машинка на Ардуино: как сделать радиоуправление своими руками. Сборка радиоуправляемой игрушечной машинки на основе Arduino. Как

Машинка на Ардуино с Bluetooth управлением от Android телефона — это очень простой, но интересный проект на Arduino UNO с использованием модуля Motor Shield. На этой странице вы узнаете какие потребуются компоненты для изготовления робота машинки на Ардуино своими руками, пошаговую инструкцию по сборке электрической схемы и сможете скачать все необходимые программы для Android и Arduino.

Видео. Машинка на блютуз управлении ардуино

Для этого проекта использовался модуль Motor Shield L293D , два колеса с редукторами, плата Arduino UNO, блютуз модуль HC-05 и два светодиода для фар. Управление происходит дистанционно через Bluetooth сигнал от смартфона или планшета. После сборки модели и установки программ, вы сможете через приложение на смартфоне поворачивать машинкой, ездить вперед и назад, включать и выключать фары.

Машинка на Ардуино своими руками

Для этого проекта нам потребуется:

  • плата Arduino UNO;
  • Motor Control Shield L293D;
  • Bluetooth модуль HC-05/06;
  • два мотора с редукторами и колесами;
  • аккумулятор на 9В (крона);
  • 2 резистора и 2 светодиода;
  • корпус и колеса от старой машинки;
  • паяльник, термопистолет, канцелярский нож;
  • провода, припой и изолента.
Детали для робота — машинки на Ардуино УНО

Схема сборки машинки на Ардуино

Если у вас есть все необходимые детали (в проекте можно обойтись без светодиодов и резисторов), то далее мы рассмотрим, как сделать машинку из ардуино своими руками. Для начала следует припаять к контактам моторчиков провода и зафиксировать их изолентой, чтобы контакты не оторвались. Провода необходимо соединить с клеммниками M1 и M2 на Motor Shield (полярность потом можно будет поменять).


Питание на Bluetooth модуль идет от контактов для сервопривода, в проекте серво нам не понадобятся. А на питание идет стабилизированное напряжение 5 Вольт, что нам подходит. К портам TX и RX удобнее будет припаять коннекторы «мама», а к портам «Pin0» и «Pin1» на Motor Shield припаять штырьки (BLS). Таким образом, вы сможете легко отключать Bluetooth модуль от Arduino при необходимости загрузки скетча.

Управление светодиодами идет от порта «Pin2», здесь провод можно припаять напрямую к порту. Если вы делаете несколько машинок с Блютуз, которыми будете управлять одновременно, то рекомендуем сделать перепрошивку модуля HC-05 . Делается прошивка модуля очень просто, а затем вы уже не будете путать машинки, так как у каждой будет отображаться свое уникальное имя на Андроиде.

Приложение и скетч для машинки на Ардуино

После сборки схемы загрузите следующий скетч для машинки (не забудьте отключать Bluetooth модуль от Ардуино при загрузке) и установите приложение на смартфоне. Все файлы для проекта (библиотека AFMotor.h, скетч для машинки и приложение для Android) можно скачать одним архивом по прямой ссылке .

#include // подключаем библиотеку для шилда AF_DCMotor motor1(1); // подключаем мотор к клеммнику M1 AF_DCMotor motor2(2); // подключаем мотор к клеммнику M2 int val; // освобождаем память в контроллере void setup () { Serial .begin (9600); pinMode (2, OUTPUT ); // Порт для светодиодов motor1.setSpeed (250); motor1.run (RELEASE ); // останавливаем мотор motor2.setSpeed (250); // задаем максимальную скорость мотора motor2.run (RELEASE ); // останавливаем мотор } void loop () { if (Serial .available ()) // проверяем, поступают ли какие-то команды { val = Serial .read (); if (val == "f") { // едем вперед motor1.run (FORWARD ); motor1.setSpeed (250); motor2.run (FORWARD ); motor2.setSpeed (250); } if (val == "b") { // едем назад motor1.run (BACKWARD ); motor1.setSpeed (200); motor2.run (BACKWARD ); motor2.setSpeed (200); } if (val == "s") { // останавливаемся motor1.run (RELEASE ); motor2.run (RELEASE ); } if (val == "l") { // поворачиваем налево motor1.run (FORWARD ); motor1.setSpeed (100); motor2.run (BACKWARD ); motor2.setSpeed (250); } if (val == "r") { // поворачиваем направо motor1.run (BACKWARD ); motor1.setSpeed (250); motor2.run (FORWARD ); motor2.setSpeed (100); } if (val == "1") { // включаем светодиоды digitalWrite (2,HIGH ); } if (val == "0") { // выключаем светодиоды digitalWrite (2,LOW ); } } }

Пояснения к коду:

  1. Для тестирования, можно отправлять команды с компьютера через USB;
  2. Вращение моторов при подключении к аккумулятору будут отличаться;
  3. Вы можете задавать свою скорость вращения моторами.

После проверки работы машинки, установите приложение на смартфон или планшет. При первом подключении к Bluetooth модулю HC-05/06, потребуется сделать сопряжение с Андроид (затем сопряжение будет выполняться автоматически). Если у вас возникли сложности с подключением — прочитайте эту статью

Там же находятся исходники для Android и другая полезная информация. В этой статье я покажу сборку CxemCAR для платформы Arduino. В качестве платы Arduino можно использовать практически любую Arduino-совместимую плату: UNO, Nano, Mega, Leonardo и даже на основе STM32 - Arduino DUE. Я использовал платку Arduino Nano V3, приобретенную на eBay за 9$.

Схема подключения Arduino к Bluetooth модулю HC-06 и драйверу двигателей L298N:

В схеме я использовал джампер (на схеме Jmp1), т.к. при подключенном Bluetooth модуле невозможно было загрузить скетч в Arduino. На время прошивки, снятием перемычки обесточивается Bluetooth-модуль.

В качестве платформы я использовал небольшую RC DIY платформу, купленную на за 25$. Сама платформа представляет из себя алюминиевое основание, куда крепится два двигателя, редуктор и 4 карданные передачи для 4-х колес. Сверху, на 3-х стойках ставится макетная плата.

Платформа не отличается высоким качеством изготовления. После того, как я ее собрал, попробовал подключить питание - двигателя даже не шевельнулись, много перекосов, недоработок и т.п. Пришлось все разбирать, немного ослабить крепления, кое-где подточить, хорошо все промазать смазкой, а также снял 2 кардана с передней оси. Получилась заднеприводная версия машинки.

После этого, я припаял Bluetooth-модуль к Arduino и вывел для него светодиод состояния. О разновидностях Bluetooth модулей, их подключении к Arduino, работы с ними и т.п. можете почитать в данной статье: . Модуль HC-06 поместил в термоусадочную трубку 10мм. Светодиод Bluetooth-состояния с токоограничительным резистором также были помещены в термоусадку, но более тонкую - 5мм.

В макетной плате, которая шла вместе с платформой, я просверлил отверстия и закрепил драйвер двигателей L298N. Плату Arduino прикрепил при помощи двухстороннего скотча.

Между алюминиевой платформой машинки и макетной платой я разместил 3 Li-Po аккумулятора 3.7В 1100 мА*Ч. Питание контроллера и двигателей раздельное: Arduino запитывается от одного аккумулятора 3.7В, а моторчики и драйвер L298N от двух последовательно соединенных аккумуляторов 3.7В. Предусмотрено два 2-х позиционных выключателя питания - в одном положение питание идет от аккумуляторов к потребителям, в другом положении на клеммы зарядки.

Фото машинки на подзарядке:

Программное обеспечение

Программа писалась в среде Arduino IDE 1.01. Код программы я постарался хорошо прокомментировать, но если будут вопросы - спрашивайте на форуме, в .

#include "EEPROM.h" #define D1 2 // направление вращение двигателя 1 #define M1 3 // ШИМ вывод для управления двигателем 1 (левый) #define D2 4 // направление вращение двигателя 2 #define M2 5 // направление вращение двигателя 2 (правый) #define HORN 13 // доп. канал 1 подключен к 13 пину //#define autoOFF 2500 // кол-во миллисекунд через которое робот останавливается при потери связи #define cmdL "L" // команда UART для левого двигателя #define cmdR "R" // команда UART для правого двигателя #define cmdH "H" // команда UART для доп. канала 1 (к примеру сигнал Horn) #define cmdF "F" // команда UART для работы с EEPROM памятью МК для хранения настроек #define cmdr "r" // команда UART для работы с EEPROM памятью МК для хранения настроек (чтение) #define cmdw "w" // команда UART для работы с EEPROM памятью МК для хранения настроек (запись) char incomingByte; // входящие данные char L_Data; // строковый массив для данных левого мотора L byte L_index = 0; // индекс массива char R_Data; // строковый массив для данных правого мотора R byte R_index = 0; // индекс массива char H_Data; // строковый массив для доп. канала byte H_index = 0; // индекс массива H char F_Data; // строковый массив данных для работы с EEPROM byte F_index = 0; // индекс массива F char command; // команда: передача координат R, L или конец строки unsigned long currentTime, lastTimeCommand, autoOFF; void setup() { Serial.begin(9600); // инициализация порта pinMode(HORN, OUTPUT); // дополнительный канал pinMode(D1, OUTPUT); // выход для задания направления вращения двигателя pinMode(D2, OUTPUT); // выход для задания направления вращения двигателя /*EEPROM.write(0,255); EEPROM.write(1,255); EEPROM.write(2,255); EEPROM.write(3,255);*/ timer_init(); // инициализируем программный таймер } void timer_init() { uint8_t sw_autoOFF = EEPROM.read(0); // считываем с EEPROM параметр "включена ли ф-ия остановки машинки при потере связи" if(sw_autoOFF == "1"){ // если таймер останова включен char var_Data; var_Data = EEPROM.read(1); var_Data = EEPROM.read(2); var_Data = EEPROM.read(3); autoOFF = atoi(var_Data)*100; // переменная автовыкл. для хранения кол-ва мс } else if(sw_autoOFF == "0"){ autoOFF = 999999; } else if(sw_autoOFF == 255){ autoOFF = 2500; // если в EEPROM ничего не записано, то по умолчанию 2.5 сек } currentTime = millis(); // считываем время, прошедшее с момента запуска программы } void loop() { if (Serial.available() > 0) { // если пришли UART данные incomingByte = Serial.read(); // считываем байт if(incomingByte == cmdL) { // если пришли данные для мотора L command = cmdL; // текущая команда memset(L_Data,0,sizeof(L_Data)); // очистка массива L_index = 0; // сброс индекса массива } else if(incomingByte == cmdR) { // если пришли данные для мотора R command = cmdR; memset(R_Data,0,sizeof(R_Data)); R_index = 0; } else if(incomingByte == cmdH) { // если пришли данные для доп. канала 1 command = cmdH; memset(H_Data,0,sizeof(H_Data)); H_index = 0; } else if(incomingByte == cmdF) { // если пришли данные для работы с памятью command = cmdF; memset(F_Data,0,sizeof(F_Data)); F_index = 0; } else if(incomingByte == "\r") command = "e"; // конец строки else if(incomingByte == "\t") command = "t"; // конец строки для команд работы с памятью if(command == cmdL && incomingByte != cmdL){ L_Data = incomingByte; // сохраняем каждый принятый байт в массив L_index++; // увеличиваем текущий индекс массива } else if(command == cmdR && incomingByte != cmdR){ R_Data = incomingByte; R_index++; } else if(command == cmdH && incomingByte != cmdH){ H_Data = incomingByte; H_index++; } else if(command == cmdF && incomingByte != cmdF){ F_Data = incomingByte; F_index++; } else if(command == "e"){ // если приняли конец строки Control4WD(atoi(L_Data),atoi(R_Data),atoi(H_Data)); delay(10); } else if(command == "t"){ // если приняли конец строки для работы с памятью Flash_Op(F_Data,F_Data,F_Data,F_Data,F_Data); } lastTimeCommand = millis(); // считываем текущее время, прошедшее с момента запуска программы } if(millis() >= (lastTimeCommand + autoOFF)){ // сравниваем текущий таймер с переменной lastTimeCommand + autoOFF Control4WD(0,0,0); // останавливаем машинку } } void Control4WD(int mLeft, int mRight, uint8_t Horn){ bool directionL, directionR; // направление вращение для L298N byte valueL, valueR; // значение ШИМ M1, M2 (0-255) if(mLeft > 0){ valueL = mLeft; directionL = 0; } else if(mLeft < 0){ valueL = 255 - abs(mLeft); directionL = 1; } else { directionL = 0; valueL = 0; } if(mRight > 0){ valueR = mRight; directionR = 0; } else if(mRight < 0){ valueR = 255 - abs(mRight); directionR = 1; } else { directionR = 0; valueR = 0; } analogWrite(M1, valueL); // задаем скорость вращения для L analogWrite(M2, valueR); // задаем скорость вращения для R digitalWrite(D1, directionL); // задаем направление вращения для L digitalWrite(D2, directionR); // задаем направление вращения для R digitalWrite(HORN, Horn); // дополнительный канал } void Flash_Op(char FCMD, uint8_t z1, uint8_t z2, uint8_t z3, uint8_t z4){ if(FCMD == cmdr){ // если команда чтения EEPROM данных Serial.print("FData:"); // посылаем данные с EEPROM Serial.write(EEPROM.read(0)); // считываем значение ячейки памяти с 0 адресом и выводим в UART Serial.write(EEPROM.read(1)); Serial.write(EEPROM.read(2)); Serial.write(EEPROM.read(3)); Serial.print("\r\n"); // маркер конца передачи EEPROM данных } else if(FCMD == cmdw){ // если команда записи EEPROM данных EEPROM.write(0,z1); // запись z1 в ячейку памяти с адресом 0 EEPROM.write(1,z2); EEPROM.write(2,z3); EEPROM.write(3,z4); timer_init(); // переинициализируем таймер Serial.print("FWOK\r\n"); // посылаем сообщение, что данные успешно записаны } }

В коде используется библиотека для работы с EEPROM памятью AVR. В памяти хранится одна настройка: количество миллисекунд через которое машинка останавливается при потери связи. Можно эту настройку "жестко" прописать в программе, для этого раскомментируйте строчку #define autoOFF 2500 (где 2500 кол-во миллисекунд). После этого, функцию Flash_Op можно удалить, также необходимо будет внести небольшие правки в код, отвечающий за прием команд для работы с EEPROM-памятью.

Основная идея проекта - создать недорогую автономную четырехколесную подвижную платформу.

В проекте используется логика на базе Arduino, недорогая радиоуправляемая машина, источник питания 9 вольт. В качестве датчиков обратной связи используется инфракрасный передатчик.

Так как оборудование недорогое, можно расценивать эту статью исключительно как общую инструкцию и первый шаг для дальнейших модификаций вашей автономной четырехколесной платформы.

Необходимое оборудование и материалы

  • Arduino
  • Arduino Мотор шилд
  • Радиоуправляемая машина
  • Паяльник
  • Припой
  • Инфракрасный передатчик
  • Инфракрасный приемник
  • Батарейка 9 В с коннекторами
  • Переключатель

*Обратите внимание: если в вашей машине установлена большая плата контроллера, то это, скорее всего, чип TX2 или RX2. Если это так, то вы можете сэкономить немного денег и использовать для двигателей встроенные контроллеры. Хороший пример (на английском языке!) есть .

Разбираем машинку

Ваш первый шаг - разобрать машинку. Снимите корпус и извлеките все платы из машинки. Моторы не трогаем. В проекте нам понадобятся родные шасси, колеса и моторы.


Подготавливаем сенсоры

Подготавливаем электронику. Для начала припаяйте резистор на 100 Ом к одному из контактов на вашем ИК передатчике. Припаиваем провода к другой ноге резистора и ноге датчика. После этого припаиваем два провода к ногам вашего ИК приемника.


Устанавливаем Arduino и датчик

В корпусной части машинки надо сделать отверстия под крепеж вашего контроллера Arduino . Отверстия под крепеж зависят от габаритов подвижной платформы машинки. В данном конкретном случае плата была расположена "перпендикулярно" несущей системе. Подобное расположение удобно еще и тем, что расстояния от двигателей передней и задней подвески до пинов платы примерно одинаковое.

Над передней подвеской устанавливаем наши эмиттер и детектор. Их желательно установить повыше относительно земли. В дальнейшем можно предусмотреть сзади светодиоды, которые будут включаться во время заднего хода машинки.



Переходим к следующему шагу.

Питание

В проекте используется одна батарейка на 9 В (крона). В данном случае ее получилось установить под несущей системой платформы на колесах. Крепим пластиковыми стяжками. В принципе, для увеличения времени автономной работы нашего автомобиля, можно установить две кроны параллельно.



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

С подключением можно разобраться и на основании фото. Но на всякий случай, ниже приведена схема подключения в текстовой форме.



ИК светодиод

Позитивный контакт - 5v

Отрицательный контакт - Ground

Позитивный контакт - Analog pin 5

Негативный контакт - Ground

Двигатель

Негативный контакт - Мотор шилд Channel A -

Двигатель для поворота

Позитивный контакт - Мотор шилд Channel B +

Негативный контакт - Мотор шилд Channel B -

Позитивный контакт - Мотор шилд Vin

Негативный контакт - Мотор шилд Gnd

Программа Arduino

Учитывая специфику проекта, вам надо внести в приведенный ниже базовый скетч достаточно много изменений, которые зависят от размера машинки и колес, скорости вращения колес, веса авто, освещения окружающей среды.

int irsensor = A5;

int measure = 1;

int ambientir = 0;

//настройка канала A (Channel A)

pinMode(12, OUTPUT); //инициализация контакта Motor Channel A

pinMode(9, OUTPUT); //Инициализация контакта тормоза - Brake Channel A

pinMode(irsensor, INPUT);

digitalWrite(irsensor, HIGH);

Serial.begin(9600);

ambientir = ambientir + analogRead(irsensor);

measure = measure + 1;

ambientir = ambientir / 10;

distance = analogRead(irsensor);

digitalWrite(12, HIGH); //Обечпечиваем обратное направление вращения ротора на Channel A

digitalWrite(9, LOW); //Отключаем тормоз на Channel A

analogWrite(3, 100); //Вращаем ротор мотора на Channel A на половине максимальных оборотов

if(distance > ambientir - 50){

digitalWrite(12, LOW);

digitalWrite(9, LOW);

analogWrite(3, 100);

Serial.println(distance);

Приведенный выше костяк программы для Arduino можно (и даже нужно!) дорабатывать под вашу конкретную конструкцию, но общий концепт вы должны были уловить.

Результат, тестирование и дальнейшие варианты модификаций

Как видите на фото, оригинальный корпус машинки был окрашен в бежевый цвет и установлен на стойках на подвижную четырехколесную платформу.



После тестирования разработанной конструкции можно выделить следующие проблемы :

  • Ограниченный диапазон чувствительности сенсора;
  • Проблемы, связанные со скоростью машины, а именно - невозможность быстрой остановки;
  • Необходимость подстраивать датчик под разные условия освещения;
  • Ну и конечно же, дешевый китайский пластик никоим образом не придает автономной машинке на Arduino хорошей жесткости и надежности конструкции.

В принципе, внести компенсацию в зависимости от уровня освещения можно, но это отдельная история и модификация, которые не входили в задачи базового проекта.

Машинка не врезается в стены, но с 90% вероятностью соберет бампером все ножки стульев и столов в комнате. То есть, с обнаружением более мелких препятствий есть явные проблемы. Соответственно, надо либо увеличивать количество эмиттеров, либо использовать более дорогостоящие модели с большей чувствительностью.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Главный источник информации - easyelectronics.com

Одной ардуины здесь не хватит. Еще понадобятся:
-силовые модули для управления двигателями и светом
-модуль источника питания
-модуль связи

Ардуина - это только мозги, причем довольно хилые.

Вопрос совместимости моторчика с ардуиной особого смысла не несет. Дело в том, что напрямую к ардуине практически никакой моторчик подключить нельзя, она сгорит.
Между ардуиной и моторчиком будет посредник - силовой модуль. Благодаря этому, ардуина фактически совместима с любым двигателем.

По поводу "где купить" - либо онлайн магазины, либо магазины электронных компонентов. Ищите поиском в вашем городе. В крупных городах можно купить все в одном месте, но переплатив раза в 1,5-5 по сравнению с али.

Как бы делал машинку я.

В качестве мозгов высокого уровня и модуля связи я бы взял что-то из ESP32 или ESP8266. Первая работает с bluetooth и wifi. Вторая работает только c wi-fi.

В качестве контроллера периферии сойдет и ардуина. Но! Я бы не стал городить огород из кучи плат и проводов - вероятнее всего, это не влезет в корпус машинки, а если и влезет - будет очень страшным.

Поэтому все компоненты этой конструкции я бы разместил на специально разработанной печатной плате, которую потом по моему заказу изготовит какой-нибудь Резонит.

1) Зависит от вашего местоположения и допущения в небольшой переплате. Можно всё необходимое заказать из Китая, если готовы ожидать 14-40 суток, что позволит сэкономить небольшую часть общей суммы.
Сам лично заказывал у следующих товарищей:

Проблем, соответственно, никаких не возникло.
2) Если уж на то пошло, то необходимо два DC-двигателя и один серво. Просто вбиваете "DC motor" и "Servo".
Примеры выдачи:

При выборе серво необходимо обратить внимание на шестерёнки и конечно же развиваемую тягу. В принципе, для банальной игрушечной машинки хватит и первого варианта из приведённых в примере. Но на будущее имейте в виду, что пристава "MG" подразумевает металлические шестерёнки, что делает в общем устройство более устойчивым к поломке, хотя и не сводит на нет их.
Для управления всей этой системой вам также потребуется так называемый "motor shield":

Первый из приведённых примеров благодаря наличию сдвигового регистра и двух мостов позволяет одновременно управлять четырьмя моторами. Единственное, в чём будет проблема - питание, т.к. для адекватного функционирования каждого требуется от 5V, иначе могут быть проблемы с развиваемой мощностью.
В принципе, вторым также можно управлять сразу четырьмя колёсами, подключив их просто попарно (для поворота использовать разность скоростей сторон). Но в вашем случае достаточно будет и второго варианта. Тем более он допускает использование больших токов, нежели первый.
3) Просто приобретаете светодиоды и подключаете их либо напрямую (не забывая о резисторах) либо через какую-либо из микросхем.
"Diod"

4) Банально устанавливаете себе Arduino IDE и используете C/C++

Ресурсы для изучения:

p.s. что касается удалённого доступа, то обрати внимание на ответ товарища выше

1) Где купить сам Arduino?
Да
2) Какие двигатели совместимы будут с данным одноплатником? Нужна пара двигателей для хода машинки и так понимаю нужен шаговый двигатель для поворотов машинки.
Любые, но на прямую ни какой двигатель подключать нельзя, нужен специальный шильд управления двигателями, например, такой . Для поворотного механизма используются не шаговые двигатели, а