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

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

Там же находятся исходники для 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 и различных робоплатформ позволило любителям создавать радиоуправляемые машинки на любой вкус. А широкое распространение смартфонов позволило использовать их в качестве контроллеров этих машинок. Главной проблемой для многих любителей Arduino является отсутствие опыта в программировании под Android. Сегодня я расскажу, как легко решить эту проблему, используя среду визуальной разработки android-приложений App Inventor 2.



Постройку любой машинки надо начинать с «железа», поэтому вкратце опишу, что использовал для своей машинки:
arduino nano
bluetooth module HC-05
Z-Mini Motor Sensor Shield L293D
2WD Motor Chassis
Конфигурация «железа» не играет большой роли в этом проекте, поэтому шасси, шилд и саму ардуино можно заменить на любые аналоги.

Теперь перейдем к созданию приложения для Android. App Inventor - среда визуальной разработки android-приложений, работает из браузера. Заходим на сайт, разрешаем доступ к своему аккаунту в Google, нажимаем кнопку «create» и создаем новый проект. В новом проекте методом «Drag and Drop» создаем 4 кнопки для выбора направления движения и одну для подключения к нашему bluetooth модулю. Примерно так:

Теперь остается скомпилировать приложение, нажав на кнопку «Build».

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

скетч

int val;
int IN1 = 4;
int IN2 = 7;
int EN1 = 6;
int EN2 = 5;

Void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(EN1, OUTPUT);
pinMode(EN2, OUTPUT);

}
void loop()
{
if (Serial.available())
{
val = Serial.read();

// Задаём движение вперёд
if (val == "W") // При нажатии клавиши «W»
{
// Выводы конфигурируются согласно работе Motor Shield"а
// Моторы крутятся вперед
digitalWrite(EN1, HIGH);
digitalWrite(EN2, HIGH);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
}

// Задаём движение назад
if (val == "S")
{
digitalWrite(EN1, HIGH);
digitalWrite(EN2, HIGH);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
}

// Задаём движение вправо
if (val == "D")
{
digitalWrite(EN1, HIGH);
digitalWrite(EN2, HIGH);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
}

// Задаём движение влево
if (val == "A")
{
digitalWrite(EN1, HIGH);
digitalWrite(EN2, HIGH);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
}

// Стоп режим
// При отпускании клавиш в программе в порт шлется «T»
if (val == "T") // При нажатии клавиши «T»
{
// Выводы ENABLE притянуты к минусу, моторы не работают
digitalWrite(EN1, LOW);
digitalWrite(EN2, LOW);
}
}
}


Итак, вот такая у меня получилась машинка:

Те, кому нравится дизайн в приложениях, могут немного поменять. Подробно описывать как это делать не буду, там не сложно самому разобраться. Скажу лишь, что для этого в основном нужно использовать.png файлы, вместо.jpeg, которые не поддерживают прозрачный фон. Например, сделать такой дизайн за полчаса или час сможет любой неподготовленный человек:

P.S. Для тех, кто не сталкивался с разработкой приложений в App Inventor 2, я сделал более подробный гайд по разработке этого приложения (для просмотра нужно перейти на ютуб).

P.P.S. Сборник из более 100 обучающих материалов по ардуино для начинающих и профи

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

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

Итак, давайте разберем на живом примере как сделать своими руками дистанционно управляемую по bluetooth c android планшета или смартфона машинку. Статья, как ни странно, рассчитана на начальный уровень знаний. Здесь нет руководства по редактированию кода в Arduino IDE, да и мы использовать его будем только для заливки нашего кода. А составлять алгоритм управления будем в программе под названием FLProg. Программа управления со смартфона — HmiKaskada_free. Но сначала о железе, которое нам понадобится.

Машинка на arduino и Bluetooth — аппаратная часть.

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

Для управления электродвигателями нашего будущего творения понадобится Н-мост на микросхеме L298N Ссылка на Али, я брал у именно этот. Картинка кликабельна.

Н-мост для arduino

Может управлять двумя двигателями в диапазоне напряжений 5 — 35 вольт. Поддерживает ШИМ, то есть можно регулировать обороты двигателей. На плате есть вывод стабилизированного напряжения 5 вольт для питания ардуино.

Схема подключения проста и незатейлива:

Следующей неотъемлемой частью электронной начинки нашего проекта является bluetooth модуль HC-06 . Самый обычный модуль для ардуино, настолько популярен что в дополнительном описании не нуждается.

HC-06 bluetooth for arduino

Основным элементом и мозгом в моем случае выступает arduino nano , тут даже фото выкладывать не буду ибо все о ней знают и умеют с ней работать. Кстати подойдет любая плата ардуино, лишь бы в корпус поместилась 😀

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

Машинка на arduino и Bluetooth — составление скетча.

Повторюсь — никакого копания в коде тут не будет. Мы будем использовать популярную программу FLProg. Скачать ее последнюю версию можно на официальном сайте . Интерфейс проги прост и незатейлив, но имеется огромный функционал и поддержка практически всех популярных модулей. Как ей пользоваться писать не буду так как это потянет на пару статей. Скажу только что я не встречал более удобной и доступной программы для составления скетчей для arduino и ее клонов. Скрин интерфейса:

Интерфейс FLProg

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

Мой проект для дистанционно-управляемой машины можно скачать с яндекс-диска через сервис сокращения ссылок.

Машинка на arduino и Bluetooth — интерфейс управления на планшете android.

По многочисленным просьбам написал подробную инструкцию по разработке интерфейса управления на базе HmiKaskada android в статье . Ссылка кликабельна.

Для устройств под управлением android существует программа HmiKaskada (ссылка на ЯндексДиск) . Изначально она разрабатывалась как альтернатива дорогим промышленным HMI панелям. Но пытливые умы быстро смекнули что управлять она может чем угодно. В нашем случае машинкой. Поддерживает беспроводные интерфейсы Wi-Fi и Bluetooth, кроме того можно девайс подключить напрямую через USB.

Есть платная и бесплатная версии программы. У меня есть обе но я принципиально сделал проект в бесплатной версии что бы показать вам и в очередной раз убедиться в абсолютной работоспособности free версии. Основное отличие free от PRO версий это работа только по блютуз.

На форуме FLProg есть гигантская ветка по вопросу совместимости с КаСкадой, да и разработчик активен и общителен. Скрин панели управления выкладывать не вижу смысла — он есть в видеоролике.

Это первый роботизированный проект, который я когда-либо делал, и если вы никогда не пробовали собрать робота, то, скорее всего, думаете что это сложно. Но Ардуино и шасси 2WD / 4WD сделают вашу сборку намного проще, и вы соберете своего первого робота с радиоуправлением на Ардуино без каких-либо мучений.


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

Файлы

Шаг 1: Нужные части и инструмент

Я воспользовался готовыми решениями, и все запчасти и инструменты были приобретены через интернет.

Запчасти:

  1. Набор шасси 4WD для робота (GearBest)
  2. Arduino Nano (GearBest)
  3. Модуль H-моста LM298 (GearBest)
  4. Модуль bluetooth HC-06 (Amazon)
  5. Литий-ионные батарейки 2 x 18650 (GearBest)
  6. Отсек для батареек 2x 18650 (GearBest)
  7. Небольшая макетная плата (GearBest)
  8. Провода сечением 0.5 мм2
  9. Провода с джамперами папа-мама (Amazon)
  10. Провода с джамперами мама-мама (Amazon)
  11. Малярная лента, изолента или что-то подобное (Amazon)

Для робота, объезжающего препятствия:

Ультразвуковой модуль измерения расстояния HC — SR04 (GearBest)

Необходимый инструмент:

  1. Паяльник (Amazon)
  2. Кусачки (Amazon)
  3. Стриппер для провод (GearBest)
  4. Клеевой пистолет (GearBest)

Шаг 2: Что такое робот?

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

Робот состоит из следующих компонентов:

  1. Структура / Шасси
  2. Привод / Мотор
  3. Контроллер
  4. Вводные устройства / Датчики
  5. Источник питания

В следующих шагах я опишу каждый из этих компонентов, и вы всё легко поймёте.

Шаг 3: Структура / Шасси



Структура состоит из физических компонентов. Робот имеет один или несколько физических компонентов, которые каким-либо образом двигаются для выполнения задания. В нашем случае структура робота – это шасси и колёса.

Шаг 4: Приводы



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

В нашем случае привод – это DC-мотор, скорость которого равна 3000 оборотам в минуту, а вращающий момент 0.002 Н м. Теперь добавим к нему шестерню с передаточным числом 1:48. Новая скорость уменьшается на коэффициент 48 (в результате давая 3000/44 = 68 оборотов в минуту) и вращающий момент увеличивается на коэффициент 48 (в результате давая 0.002 x 48 = 0.096 Н м).

Шаг 5: Подготавливаем клеммы моторчиков




Отрежьте по 4 провода красного и черного цвета длиной примерно 12-15 см. Я использовал провода сечением 0.5 мм2. Оголите концы проводов. Припаяйте провода к клеммам моторчиков.

Вы можете проверить полярность моторчиков, соединив их с отсеком для батареек. Если он движется в прямом направлении (с красным проводом на позитивной и черным на негативной клеммах батареек), то с соединением все в порядке.

Шаг 6: Устанавливаем мотор




Прикрепите две акриловые распорки к каждому мотору при помощи двух длинных болтов и двух гаек. Для наглядности вы можете посмотреть видео .

Возьмите на заметку, что провода на каждом моторе ведут к центру шасси. Соедините оба красных и оба черных провода от моторов с каждой стороны шасси. После соединения у вас будет две клеммы на левой стороне и две на правой.

Шаг 7: Устанавливаем крышу

Послу установки 4 моторов нужно установить крышу. Приладьте 6 медных стоек при помощи гаек, клеммы проводов выведите сквозь отверстие в крыше.

Шаг 8: Контроллер

Теперь у нас установлены шасси и приводы, но нам не хватает контроллера. Шасси без контроллера никуда не поедут. Робот будет оставаться на месте, оставаясь безжизненным. Поэтому, для того чтобы робот перемещался, нам нужен мозг (контроллер).

Контроллер – программируемое устройство, способное работать по заданной программе и отвечающее за все вычисления, принятие решений и коммуникацию. В нашем случае в качестве контроллера мы используем микроконтроллер Ардуино Нано.

Контроллер принимает входные данные (с датчиков, удалённо и т.д.), обрабатывает их и затем даёт команду приводам (моторам) выполнить выбранное задание.

Если вы подключите позитивный провод от батарей на одну строну моторчика, затем подключите негативный провод от батарей на другой контакт моторчика, то он начнёт крутиться вперёд. Если вы поменяете провода местами, то мотор начнёт вращаться в другую сторону.

Микроконтроллер можно использовать, чтобы вращать мотор в одном направлении, но если вам хочется с помощью микроконтроллера вращать мотор и вперёд, и назад, то вам нужна дополнительная схема – H-мост. В следующем шаге я объясню, что это такое.

Шаг 9: Н-мост (модуль LM 298)




Что такое Н-мост?

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

Принцип работы:
Посмотрите приложенную картинку для понимания принципа работы схемы Н-моста. Мост состоит из 4 электронных выключателей S1, S2, S3, S4 (транзисторы / MOSFET/ IGBTS).

Когда выключатели S1 и S4 закрыты, а остальные два открыты, положительное напряжение будет проходить через мотор, и он будет вращаться в прямом направлении. Таким же образом, когда закрыты выключатели S2 и S3, а S1 и S4 открыты, обратное напряжение будет даваться на мотор и он начнёт вращаться в обратном направлении.

Заметка: выключатели на одной руке (то есть S1, S2 или S3, S4) никогда не закрываются одновременно – это создаст короткое замыкание.

Н-мосты доступны в виде интегральных схем, либо можно собрать свой мост при помощи 4 транзисторов или MOSFET. В моём случае используется интегральная схема Н-моста LM298, которая позволяет управлять скоростью и направлением моторов.

Описание распиновки:

Out 1: DC мотор 1 «+» или шаговый двигатель A+
Out 2: DC мотор 1 «-» или шаговый двигатель A-
Out 3: DC мотор 2 «+» или шаговый двигатель B+
Out 4: вывод мотора B
12v: вход 12V, но можно использовать от 7 до 35V
GND: Земля
5v: выход 5V, если джампер 12V стоит на месте, идеально для питания Arduino (и т.п.)
EnA: позволяет получать сигналы PWM для мотора A (Пожалуйста, прочитайте секцию «Arduino Sketch Considerations»)
IN1: включает мотор A
IN2: включает мотор A
IN3: включает мотор B
IN4: включает мотор B
BEnB: позволяет получать сигналы PWM для мотора B (Пожалуйста, прочитайте секцию «Arduino Sketch Considerations»)

Шаг 10: Входы / Датчики

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

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

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

Шаг 11: Источник питания





Чтобы управлять приводами (моторами) и питать контроллер, роботу нужен источник питания. Большинство роботов питается от батарей. Когда мы говорим о батареях, то имеем в виду множество вариантов:

  1. Алкалиновые батарейки AA (не заряжаются)
  2. Никель-металгидридные или никель-кадмиевые батарейки AA (заряжаются)
  3. Литий-ионные батареи
  4. Литий-полимерные батареи

В зависимости от ваших нужд, нужно выбрать подходящий вид батарей. По-моему мнению, нужно всегда выбирать заряжаемые батареи достаточной ёмкости. Я использовал 2 литий-ионные батареи стандарта 18650 ёмкостью 2600mAh. Если для автономности вам нужно больше мощности, используйте большой комплект батарей, например 5A turnigy.

Отсек для батарей:
Отсек для батарей я заказал в Китае, он не подходил для батарей с плоским верхом, поэтому я использовал два неодимовых магнита для придания батарейкам нужной формы.

Зарядка:
Для зарядки батарей нужен хороший зарядник. По моему опыту, эти зарядники хорошо зарекомендовали себя:

  1. PowerEx AA Charger-Analyzer (Amazon)
  2. XTAR LiIon Battery Charger (Amazon)
  3. Turnigy LiPo Battery Charger (Amazon)

Шаг 12: Установка компонентов


Цельная схема устанавливается на крыше. Отсек для батарей, драйвер двигателей LM 298 и маленькую макетную плату я закрепил горячим клеем, но можно просто прикрутить их. Модуль bluetooth закрепляется скотчем. Ардуино нано вставьте в макетную плату.

Шаг 13: Электропроводка






Для соединения модулей понадобятся провода с джамперами.
Соедините красные провода двух моторов вместе (на каждой стороне) и затем черные провода. В итоге у вас выйдет по две клеммы с каждой стороны.

MOTORA отвечает за два правых мотора, соответственно два левых мотора соединены с MOTORB.
Для соединения всех компонентов следуйте инструкции:

Соединение моторов:

Out1 -> красный провод левостороннего мотора (+)
Out2 -> черный провод левостороннего мотора (—)
Out3 -> красный провод правостороннего мотора (+)
Out4 -> черный провод правостороннего мотора (—)
LM298 — > Arduino
IN1 -> D5
IN2-> D6
IN2 ->D9
IN2-> D10
Модуль Bluetooth -> Arduino
Rx-> Tx
Tx ->Rx
GND -> GND
Vcc -> 3.3V
Питание
12V — > красный провод батарей
GND -> черный провод батарей и пин GND на Arduino
5V -> соедините с пином 5V Arduino

Шаг 14: Логика управления

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

Шаг 16: Тестирование



Чтобы проверить робота-машину, я положил её на маленькую картонную коробку. Таким образом, колёса будут крутиться, но машинка будет оставаться на месте. Проверьте работоспособность, нажимая все доступные кнопки. Если всё работает, то можно по-настоящему управлять ей.

Заметка: если моторы вращаются в противоположном направлении, то просто поменяйте местами провода.

Шаг 17: Планы на будущее




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

  1. Добавление ультразвукового датчика для объезда препятствий
  2. Использование модуля WiFi, например ESP8266 или Node MCU вместо Bluetooth, для удлинения дистанции управления.
  3. Добавление солнечной панели для зарядки батарей.

Что нам понадобится:

1. Шасси для робота, =9,50$
2. Драйвер двигателя, =1,22$
3. Датчик, который будет определять препятствие, я остановился на самом популярном и дешевом варианте =0,94$
Однако, никто не мешает воспользоваться более дорогими или чем-то подобным
4. Крепление датчика, не самый лучший, но жизнеспособный вариант. =1,08$
В качестве аналогов: , еще существует неуловимый желтый, наиболее прошаренный, но ссылку так и не нашел. Кто будет искать на вид он похож на синий, но имеет нормальные отверстия под винт м3 и 4 шурупа для крепления дальномера.
5. Плата arduino, которая будет обрабатывать данные с датчика и выдавать решение, куда ехать дальше. Остановился на , как на самой удобной для моделирования на «лету» =5.88$
Эта плата выбрана из-за возможности заменить микроконтроллер в случае фатальной неудачи, так что можно купить версию

Итого я потратил примерно 19$ на самое основное

!!! терминалы, разъемы, клещи можно заменить

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

Парочка фото на закуску

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


Стойки, болты, гайки, шайбы

Сборка

Переходим к самому интересному - к созданию Франкенштейна!
Первым делом сверлим в синем кронштейне отверстие под болт м3, потому как иного варианта крепления я не нашел


на термоклей сажаем дальномер.


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

Крепим драйвер двигателя, подключаем моторы.



Приспосабливаем повербанк вместо батарейного отсека.
Для этого делаем два отверстия под винты м3 для крепления на шасси, припаиваем два проводка "+" и "-" к USB на плате и выводим провода через еще одно просверленное отверстие. К сожалению у меня не было под руками подходящего выключателя, так что эту функцию будет выполнять отключение проводков от ардуины. Далее крепим это дело на шасси.





Ставим ардуину, подключаем провода




Удобно, что заряжается аккумулятор через повербанк.

Вставляем аккумулятор прошиваем (воспользовался средой atmel studio 6), переворачиваем, чтобы не убежала, и тестируем, что получилось.

На первый взгляд все норм, если появляется препятствие машинка отворачивает в сторону, проверяет наличие препятствия и в случае повторного обнаружения поворачивает в другую сторону. Что получилось на практике: препятствия обнаруживает на ура, поворачивает неплохо, опытным путем поставил нужные задержки, но практически не способна ехать по прямой из-за заднего направляющего колеса. Скорее всего это мне попался такой «тугой» вариант, но из-за этого машинка всегда едет по диагонали, мелочь, а неприятно.

Подведем итоги

Для начала, тем, кто решит делать что-то подобное, стоит обратить внимание на шасси с четырьмя моторами. Такой шаг, в теории, исключит вероятность движения по дуге, но может добавить головной боли при подборе драйвера двигателя. Но не спешите ломать голову, можно оставить этот, все должно отлично работать, по токам проходит впритык - два мотора на канал. А вот однобаночного повербанка не хватит точно. На мой взгляд это уже повод рискнуть. Так же придется покупать шайбы, т.к. при креплении к пластмассе могут быть неприятные вещи. Еще было бы отлично разделить питание ардуины и моторов, либо воспользоваться стабилизатором, на худой конец впаять конденсатор большой емкости, но это для истинных ценителей, у меня работает и так. На практике я уложился в цену примерно 2000 руб, можно было и дешевле, но это была моя зарядка для ума и первый опыт в программировании (для чего собственно все и затевалось), особо экономить не стал. Появится время прикручу радиоуправление и выключатель.

P.S. Проблему движения по дуге решала замена моторов, спасибо за совет. При покупке шасси не спешите подтверждать, сначала испытайте его в деле. Больше косяков нет, все работает.