- 1 Комплектующие
- 2 Схема подключения
- 3 Скетч
- 4 Приложение
- 5 Сборка
- 6 Видео
Самая простая машинка на Arduino с дистанционным управлением со смартфона по Bluetooth. Лёгкая схема, простой скетч. Едет на двух электромоторах, питается от кроны. Рама, на которой всё держится, изготавливается из подручных материалов и ограничивается лишь фантазией.
Вам будет интересно: Bluetooth машинка на Arduino с поворотными колёсами на 3D принтере.
Комплектующие
- Arduino Uno — https://bit.ly/2P3rCI5
- драйвер моторов L298N — https://bit.ly/3dvbDMg
- Bluetooth модуль HC-06 или HC-05 или подобный — https://bit.ly/3x4nhFX
- моторы постоянного тока с редуктором и с колёсами — 4 шт — https://bit.ly/2P4e9Qr
- провода папа-папа, мама-мама, папа-мама 10-30 см — https://bit.ly/3n3z0jl
- аккумулятор 9В, я использовал с разъёмом micro-USB для зарядки — https://bit.ly/2QeFbF6
- зажим для аккумулятора 9В — https://bit.ly/32rmwZi
- тумблер — 1 шт — https://bit.ly/3artZfr
Для изготовления рамы машинки можно использовать разнообразные материалы:
- листовой лёгкий материал, который легко обрабатывать — оргстекло, фанера, текстолит, оргалит и т.п.
- третье колесо, которое будет опорным — оно должно уметь ехать во всех стороны (хорошо подходят мебельные колёсики);
- крепёжные элементы — болты, гайки, шурупы.
Схема подключения
Питание платы берётся от «Кроны» и подаётся на Arduino через пины VIN и GND. Также подаётся отдельно на драйвер двигателей через порты +12V и GND.
Blutooth модуль HC-06 получает питание в 3,3 вольта от Arduino. Если подключить к 5 вольтам, то тоже работает нормально. Выход RX модуля подключается к TX на Arduino, а TX — в RX, то есть наоборот.
На драйвере двигателей нужно снять две боковые перемычки — Enable. Пины под ними позволят нам управлять скоростью вращения двигателей. И эти пины подключаются к Arduino обязательно к ШИМ-портам (обозначенные знаком ~). На схеме это порты 3 и 5.
Питание моторов подаётся на Input драйвера от Arduino с портов 2 и 4, 6 и 7. А сами моторы подключаются к Output A и Output B драйвера.
Если после сборки и прошивки, вы подаёте на машинку сигнал двигаться вперёд, а оба колеса при этом вращаются в разных направления, то нужно поменять местами провода на одном из моторов в выходе Output.
Если при движении вперёд машинка едет назад, то нужно поменять местами провода Output обоих двигателей (хотя, кто знает, где у ней перед, а где зад…).
Если при повороте налево, машинка едет направо, то нужно поменять местами Output A и Output B.
Если подключить всё по схеме, то скетч переделывать не нужно будет.
Скетч
Перед прошивкой обаятельно отключите питание у Blutooth модуля. Для этого надо просто отсоединить один из его проводов питания.
В скетче прописанные необходимые поясняющие комментарии.
Движение и остановка колёс осуществляется за счёт функций. А в дальнейшем нужные комбинации функций просто вызываются в нужных местах кода одной строкой. Получается просто и компактный код. Ниже фрагмент кода примером двух таких функций:
void rightWheelForward () { // Правое колесо вперёд. digitalWrite (motorRight1, LOW); digitalWrite (motorRight2, HIGH); analogWrite(enableRight, motorSpeed); } void leftWheelForward () { // Левое колесо вперёд. digitalWrite (motorLeft1, LOW); digitalWrite (motorLeft2, HIGH); analogWrite(enableLeft, motorSpeed); }
Со смартфона приложение по Bluetooth посылает сигналы в виде латинских букв (W, S, E и т.д.). В зависимости от пришедшей команды, с помощью оператора if, вызываются комбинации тех или иных функции. Если вы будете использовать другое приложение, не то, которое я предоставлю ниже, то оно будет посылать другие команды, другие буквы. Соответственно, придётся переписать их в скетче.
Например, когда по Bluetooth приходит ‘ W ‘ вызываются две функции rightWheelForward (); и leftWheelForward (); что заставит оба мотора крутится вперёд.
if (control == 'W') { // Ехать вперёд. rightWheelForward (); leftWheelForward (); }
А если приходит ‘E’, то вызываются функции rightWheelStop (); и leftWheelForward (); что заставит остановиться правый мотор и вращаться вперёд только левый, от чего машинка поведет вперёд вправо.
if (control == 'E') { // Повернуть направо вперёд. rightWheelStop (); leftWheelForward (); }
Есть три вида скорости, которые включаются, когда приходят команды ‘1’, ‘2’ и ‘3’. Скорость можно задавать от 0 до 250. На каждую и трёх команд в скетче прописаны скорости 120, 170 и 250, соответственно.
Если у вас уровень заряда аккумулятора уже на исходе, то при скорости 120 может не поехать или поехать, но не стабильно. Тогда лучше увеличить значение для первой скорости.
Скорость приходит в виде переменной motorSpeed в функцию analogWrite() и запускает двигатель с заданными оборотами.
Приложение
Так как я не владею навыком написания приложение под Anroid, то для создания пульта управления использовать уже известный у многих начинающих разработчиков инструмент визуального программирования — App inventor.
Что-то подсмотрел у других в интернете, что доработал, и получилось такое простое приложение.
Сначала нужно включить машинку и сделать сопряжение по Bluetooth со смартфоном. Пароль модуля 0000 или 1234. После этого откройте приложение и нажмите «Подключиться к машинке». Подключитесь к модулю HC-06. Светодиод на нём должен перестать мигать.
Если сразу начать нажимать на стрелки направлений движения, то не поедет. В первую очередь нужно нажать на одну из трёх скоростей, а уже потом на стрелки направления. Тогда поедет.
И, так как я не публиковал это приложение в Google Play, смартфон может ругаться на его безопасность. Но можно смело устанавливать. В нём всё работает безопасно.
Сборка
Можно купить готовое шасси для машинки сразу вместе с моторами и колёсами. Останется только установить электронику и всё подключить.
Но намного интереснее создать это самому. Для изготовления подойдёт любой листовой материал, который вам будет легко обрабатывать, и который достаточно лёгкий. Например, оргалит, текстолит, фанера. Я выбрал оргстекло, что сделало мою машинку даже очень похожей на шасси из магазина.
Из инструментов могут понадобиться:
- Ручной или электрический лобзик (я пользовался ручным), чтобы отрезать нужные куски от материала.
- Дрель или шуроповёрт, свёрла.
- Крепёжные элементы — болты, гайки и саморезы любого подходящего диаметра.
Получилось дёшево и сердито. А главное работает.
Паять я тоже ничего не стал, чтобы потом можно было бы легко разобрать эту машинку и модернизировать. Припаивал только провода к моторам.
В магазинном наборе для крепления моторов используются специальный кронштейны, к которым сам мотор прикручивается болтами диаметром 3 мм. Но болтов нужного диаметра и длины у меня не оказалось, хоть и можно было изготовить аналогичный кронштейн. Поэтому пришлось изощряться и использоваться даже детали детского конструктора, чтобы надёжно прикрепить моторы. На видео крепление моторов рассмотрено лучше.
Платы в идеале лучше прикручивать короткими болтами с диаметром 3 мм. Но и таких у меня не оказалось. Поэтому пришлось делать в оргстекле отверстия 2 мм и прикручивать платы саморезами. Держится вполне нормально.
У модуля Bluetooth особая проблема крепления — там отверстий для крепления нет вообще. Пришлось прижимать плату к раме другой деталью из оргстекла. Тут главное не сжать слишком сильно, чтобы не повредить.
Аккумулятор крепится аналогично Bluetooth модулю, только снизу.
И обязательно прикручиваем мебельное поворотное колесо, которое станет опорным, и не будет приводным. Следите за тем, чтобы вся конструкция была в горизонтальном положении, когда стоит на всех трёх колёсах.
Видео
ОБНОВЛЕНИЯ
- v1.1 – улучшена стабильность. Требуется библиотека GyverMotor
05.11.2021 удалена старая версия, оставил только 1.1. Обновлена библиотека GyverMotor в архиве
ОПИСАНИЕ
И вот наконец-то я решился сделать свою собственную машинку на управлении по Bluetooth! Для начала решил сделать всё максимально просто: 4 мотора, 4 колеса, ардуина, блютус модуль, ну и драйвер. Запитаем всё от паурбанка, на него и колёса закрепим. Для Андроид слепил приложеньку GyverJoy, простенький джойстик. Самая главная фишка в том, что в проекте используем FPV камеру и приёмник для смартфона, добавив разделение экрана от новой версии Андроид получим одновременное управление машинкой и вывод видео с камеры! Смотрите видос, проект просто бомбезный!
ВИДЕО
КОМПОНЕНТЫ
Стараюсь оставлять ссылки только на проверенные крупные магазины, из которых заказываю сам. Также по первые ссылки ведут по возможности на минимальное количество магазинов, чтобы минимально платить за доставку. Если какие-то ссылки не работают, можно поискать аналогичную железку в каталоге Ардуино модулей. Также проект можно попробовать собрать из компонентов моего набора GyverKIT.
- Powerbank XiaoMI USBx2 https://ali.ski/WGT1X4
-
Arduino Nano купить в РФ, aliexpress, aliexpress, искать
-
Bluetoth HC-06 aliexpress, aliexpress, искать
-
Драйвер MX1508 aliexpress, aliexpress, искать
- Моторчик и колесо
- https://ali.ski/cr8rh
- https://ali.ski/akKNb0
- 4 мотора и колёса https://ali.ski/WHzSi
-
Макетная плата aliexpress, aliexpress, искать
- Танковое шасси https://ali.ski/6Mlgo7
FPV:
- Камера 3 в 1 https://ali.ski/CwPX9
- FPV OTG приёмник
- https://ali.ski/dOjdwE
- https://ali.ski/m-t6Jp
- Другие варианты приёма видео:
- FPV часы https://ali.ski/geptr
- Крутой дисплей с приёмником https://ali.ski/YJflI
- FPV шлем как у меня https://ali.ski/36ORh
СХЕМЫ
ПРОШИВКА
ВНИМАНИЕ!
Максимально подробный гайд по началу работы с платой и загрузке прошивки для проекта находится ЗДЕСЬ. Изучи его внимательно, прежде чем писать на форум или в группу ВК!
ПОДДЕРЖАТЬ
Вы можете поддержать меня за создание доступных проектов с открытым исходным кодом, полный список реквизитов есть вот здесь.
Этот урок показывает как сделать радиоуправляемую модель машины, которую можно контролировать через смартфон. В этом руководстве мы будем использовать плату Arduino Uno.
Содержание
- Шаг 1. Комплектующие
- Шаг 2. Шасси
- Шаг 3. Моторы (приводы)
- Шаг 4. Установка двигателей
- Шаг 5. Ардуино контроллер
- Шаг 6. H-мост (модуль LM 298)
- Шаг 7. Источник питания
- Шаг 8. Электрические соединения
- Шаг 9. Логика управления
- Шаг 10. Приложение для смартфона
- Шаг 11. Код Ардуино
Шаг 1. Комплектующие
Для того, чтобы сделать модель машины на радиоуправлении (RC-машина) с использованием Ардуино и с возможностью контроля через смартфон, нам понадобятся следующие детали:
- Комплект шасси робота 4WD
- Arduino Uno
- Модуль H-моста LM298
- Модуль Bluetooth HC-05
- Батарея Li-po 12В
- Провода-перемычки
- Провода «папа-папа»
- Клейкая лента или любая другая лента
- Смартфон
Шаг 2. Шасси
Вы можете купить готовый комплект для сборки 4WD шасси или сделать его с помощью ПВХ или любого вида жесткой доски. Наш вариант на фото выше был куплен в онлайн-магазине. Вполне возможно сделать аналог этого шасси своими руками. Не имеет особого значения вид шасси, можно выбрать на свой вкус.
Шаг 3. Моторы (приводы)
В этом проекте используются 6В моторы постоянного тока. Вы можете использовать любой вид приводов на 6В постоянного тока. После того как вы купили моторы, нужно их подготовить перед размещением на шасси.
Отрежьте 4 кусочка красного и черного провода длиной примерно от 5 до 6 дюймов (12 — 15 см). Можно использовать провода 0,5 мм. Снимите изоляцию с проводов на каждом конце. Припаяйте провода к клеммам двигателей.
Вы можете проверить полярность двигателя, подключив его к батарейному блоку. Если он вращается в прямом направлении (красный провод с положительного и черный провод с отрицательного вывода батареи), то соединение правильное.
Шаг 4. Установка двигателей
Следуйте фотографиям выше для того, чтобы понять как установить все двигатели на шасси нашей будущей модели радиоуправляемой машины, которую мы будем контролировать со смартфона.
Шаг 5. Ардуино контроллер
Arduino UNO — это плата микроконтроллера с открытым исходным кодом, основой которой служит микроконтроллер Microchip ATmega328P и разработанная Arduino.cc.
Плата оснащена наборами цифровых и аналоговых пинов ввода/вывода (I/O), которые могут быть подключены к различным платам расширения (экранам) и другим цепям. Плата имеет 14 цифровых контактов, 6 аналоговых контактов и программируется с помощью Arduino IDE (интегрированная среда разработки) через USB-кабель типа B. Плата может питаться от USB-кабеля или от внешней 9-вольтовой батареи, хотя он принимает напряжение от 7 до 20 вольт, по аналогии с Arduino Nano и Leonardo.
Эталонный дизайн оборудования распространяется под лицензией Creative Commons Attribution Share-Alike 2.5 и доступен на веб-сайте Arduino. Макет и производственные файлы для некоторых версий оборудования также доступны. «Uno» означает один на итальянском языке и был выбран в честь выпуска Arduino Software (IDE) 1.0. Плата Uno и версия 1.0 программного обеспечения Arduino (IDE) были эталонными версиями Arduino, теперь разработанными для более новых выпусков.
Плата Uno является первой в серии плат Arduino c USB и эталонной моделью для последующих платформ. ATmega328 на Arduino Uno поставляется с предварительно запрограммированным загрузчиком, который позволяет загружать новый код без использования внешнего аппаратного программера с использованием оригинального протокола STK500. Uno также отличается от всех предыдущих плат тем, что не использует микросхему драйвера FTDI USB-to-serial. Вместо этого он использует Atmega16U2 (Atmega8U2 до версии R2), запрограммированный как преобразователь USB-to-serial.
Микроконтроллеры обычно программируются с использованием диалекта функций из языков программирования C и C++. В дополнение к использованию традиционных наборов инструментов компилятора проект Arduino предоставляет интегрированную среду разработки (IDE).
Шаг 6. H-мост (модуль LM 298)
Термин H-мост (англ. H-bridge) выведен из типичного графического представления такой схемы. Это схема, которая может приводить двигатель постоянного тока в прямом и обратном направлении, см. рисунок выше для понимания работы H-моста.
Он состоит из 4 электронных переключателей S1, S2, S3 и S4 (транзисторы / МОП-транзисторы (MOSFET) / IGBTS). Когда переключатели S1 и S4 замкнуты (а S2 и S3 разомкнуты), на двигатель идет положительное напряжение. Поэтому он вращается в прямом направлении. Аналогично, когда S2 и S3 замкнуты, а S1 и S4 открыты, обратное напряжение идет через двигатель, поэтому он вращается в обратном направлении.
Примечание. Переключатели в одном и том же плече (S1, S2 или S3, S4) никогда не замыкаются в одно и то же время, это приведет к короткому замыканию.
H-мосты доступны в виде интегральных микросхем, или вы можете создать свой собственный, используя 4 обычных транзистора или полевых транзистора (MOSFET). В нашем случае мы используем микросхему H-моста LM298, которая позволяет контролировать скорость и направление вращения двигателей. Ниже перейдем к описанию пинов:
Выход 1: двигатель постоянного тока 1 «+» или шаговый двигатель A+
Выход 2: двигатель постоянного тока 1 «-» или шаговый двигатель A-
Выход 3: двигатель постоянного тока 2 «+» или шаговый двигатель B+
Выход 4: двигатель B выведен
12В контакт: 12В вход, но вы можете использовать от 7 до 35 В
GND: земля
Вывод 5В: выход 5 В, если перемычка 12 В на месте, идеально подходит для питания вашего Arduino
EnA: включает сигнал ШИМ для двигателя А
IN1: включить двигатель A
IN2: включить двигатель A
IN3: включить двигатель B
IN4: включить двигатель B
EnB: включает сигнал ШИМ для двигателя B
Шаг 7. Источник питания
Для нашей радиоуправляемой модели машины на основе Ардуино и с контролем через смартфон могут быть использованы следующие батареи:
- Щелочная батарея типа АА (не перезаряжаемая)
- AA NiMh или NiCd аккумулятор
- Литий-ионный аккумулятор
- Батарея LiPo
Шаг 8. Электрические соединения
Для реализации соединений нужны перемычки. Соедините красные провода двух двигателей (с каждой стороны) вместе и черные провода вместе. Таким образом у нас теперь есть два терминала с каждой стороны. 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,3 В
Питание
12V -> Подключите красный провод аккумулятора
GND -> Подключите черный провод аккумулятора и вывод Arduino GND
5V -> Подключение к контакту Arduino 5V
Шаг 9. Логика управления
Логика управления описывается в таблице ниже.
Шаг 10. Приложение для смартфона
Скачать приложение и установить в смартфон вы можете через Google Play (ссылка).
Для управления RC-автомобилем мы используем смартфон. Смартфон подключается к контроллеру через модуль Bluetooth (HC-06/05). После установки приложения необходимо настроить связь с модулем Bluetooth. Пароль для связи: «1234».
Шаг 11. Код Ардуино
Программная часть довольно простая и не нужна никакая библиотека. Если вы понимаете логическую таблицу на предыдущих шагах, вы сможете написать собственный код. Скачать или скопировать код вы можете ниже:
// Код ошибки: код 01; Радиус поворота выше скорости; Код 02; Скорость выше 255; #define in1 5 //L298n Motor Driver pins. #define in2 6 #define in3 10 #define in4 11 #define LED 13 int command; //Int to store app command state. int Speed = 204; // 0 - 255. int Speedsec; int buttonState = 0; int lastButtonState = 0; int Turnradius = 0; //Set the radius of a turn, 0 - 255 Note:the robot will malfunction if this is higher than int Speed. int brakeTime = 45; int brkonoff = 1; //1 for the electronic braking system, 0 for normal. void setup() { pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(LED, OUTPUT); //Set the LED pin. Serial.begin(9600); //Set the baud rate to your Bluetooth module. } void loop() { if (Serial.available() > 0) { command = Serial.read(); Stop(); //Initialize with motors stoped. switch (command) { case 'F': forward(); break; case 'B': back(); break; case 'L': left(); break; case 'R': right(); break; case 'G': forwardleft(); break; case 'I': forwardright(); break; case 'H': backleft(); break; case 'J': backright(); break; case '0': Speed = 100; break; case '1': Speed = 140; break; case '2': Speed = 153; break; case '3': Speed = 165; break; case '4': Speed = 178; break; case '5': Speed = 191; break; case '6': Speed = 204; break; case '7': Speed = 216; break; case '8': Speed = 229; break; case '9': Speed = 242; break; case 'q': Speed = 255; break; } Speedsec = Turnradius; if (brkonoff == 1) { brakeOn(); } else { brakeOff(); } } } void forward() { analogWrite(in1, Speed); analogWrite(in3, Speed); } void back() { analogWrite(in2, Speed); analogWrite(in4, Speed); } void left() { analogWrite(in3, Speed); analogWrite(in2, Speed); } void right() { analogWrite(in4, Speed); analogWrite(in1, Speed); } void forwardleft() { analogWrite(in1, Speedsec); analogWrite(in3, Speed); } void forwardright() { analogWrite(in1, Speed); analogWrite(in3, Speedsec); } void backright() { analogWrite(in2, Speed); analogWrite(in4, Speedsec); } void backleft() { analogWrite(in2, Speedsec); analogWrite(in4, Speed); } void Stop() { analogWrite(in1, 0); analogWrite(in2, 0); analogWrite(in3, 0); analogWrite(in4, 0); } void brakeOn() { //Here's the future use: an electronic braking system! // read the pushbutton input pin: buttonState = command; // compare the buttonState to its previous state if (buttonState != lastButtonState) { // if the state has changed, increment the counter if (lastButtonState == 'F') { if (buttonState == 'S') { back(); delay(brakeTime); Stop(); } } if (lastButtonState == 'B') { if (buttonState == 'S') { forward(); delay(brakeTime); Stop(); } } if (lastButtonState == 'L') { if (buttonState == 'S') { right(); delay(brakeTime); Stop(); } } if (lastButtonState == 'R') { if (buttonState == 'S') { left(); delay(brakeTime); Stop(); } } } // save the current state as the last state, //for next time through the loop lastButtonState = buttonState; } void brakeOff() { }
На этом всё. Хороших вам проектов.
13 февраля 2019 в 17:30
| Обновлено 7 декабря 2019 в 00:04 (редакция)
Опубликовано:
Уроки, Arduino, Моторы
В этом проекте мы рассмотрим создание роботизированной машины на основе платы Arduino Uno, управляемой по Bluetooth. Для этих целей мы будем использовать модуль Bluetooth HC-05 и приложение для операционной системы Android.
На нашем сайте мы уже рассматривали похожие проекты на Arduino:
— робот, следующий вдоль линии;
— робот, управляемый с помощью жестов;
— робот, управляемый с помощью DTMF сигналов.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Bluetooth модуль HC-05 (купить на AliExpress).
- Драйвер двигателей L293D (купить на AliExpress).
- Двигатели постоянного тока.
- Батарейки на 6 и 9 Вольт.
- Соединитель батарей.
- Игрушечная машина.
Разрабатываемая нами машина будет управляться по протоколу Bluetooth с помощью приложения, установленного на мобильном телефоне с операционной системой Android. Для управления машиной нужно будет всего лишь нажимать кнопки в этом приложении. То есть телефон с Android будет выступать в роли передающего устройства, а Bluetooth модуль, расположенный на машине – в качестве приемного устройства, выполняющего все команды, поступающие с телефона (движение вперед, назад, направо, налево, остановка).
Bluetooth модуль структурно состоит из двух блоков: модуль последовательного интерфейса (для последовательной передачи данных) и адаптер Bluetooth. Модуль последовательного интерфейса предназначен для конвертации данных Bluetooth в данные для передачи по последовательному порту.
После приобретения модуля Bluetooth в магазине вам нет никакой необходимости изменять его настройки – он полностью готов к работе. По умолчанию скорость передачи данных у него составляет 9600 бод/с. Вам просто необходимо подсоединить его контакты rx и tx к микроконтроллеру и подать питающее напряжение постоянного тока 5 В.
Bluetooth модуль может работать в двух режимах: главный режим (master mode) и подчинённый режим (slave mode). Любой из этих режимов можно установить с помощью соответствующих АТ команд. Далее приведены некоторые из АТ команд.
Первым делом при работе с данным модулем необходимо войти в AT режим со скоростью передачи 38400 бод/с при помощи нажатия кнопки EN на Bluetooth модуле или с помощью подачи сигнала высокого уровня на контакт EN. Примечание: все команды должны заканчиваться rn (0x0d и 0x0a) или нажатием клавиши ENTER на клавиатуре.
После того как вы передадите на модуль AT команду модуль ответит вам OK (после ее выполнения).
AT → Test Command
AT+ROLE=0 → Slave Mode select (выбор подчиненного режима)
AT+ROLE=1 → Master Mode select (выбор главного режима)
AT+NAME=xyz → Set Bluetooth Name (установка Bluetooth имени)
AT+PSWD=xyz → Set Password (установка пароля)
AT+UART=<value1>,<value2>,<value3> → set Baud rate (установка бодовой скорости)
Eg. AT+UART=9600,0,0
Распиновка Bluetooth модуля:
1. STATE → Open (открыто)
2. Rx → Serial receiving pin (контакт приема данных)
3. Tx → Serial transmitting pin (контакт передачи данных)
4. GND → ground (земля)
5. Vcc → +5volt dc (+5 В постоянного тока)
6. EN → to enter in AT mode (вход в AT режим)
Принципы работы разрабатываемого устройства
В этом проекте мы использовали игрушечную машину для демонстрации работы устройства. Игрушечная машина должны быть с радиоуправлением и рулевым механизмом, позволяющим поворачивать машину вправо и влево. После покупки данной машины мы заменили ее радиочастотную часть на нашу схему с Arduino. Машина имеет два двигателя постоянного тока. Двигатель, расположенный впереди машины, используется для поворота машины вправо или влево. Двигатель, расположенный сзади машины, используется для движения машины назад или вперед. Bluetooth модуль используется для приема команд от телефона на Android, а плата Arduino Uno используется для управления всей системой. Структурная схема работы устройства приведена на следующем рисунке.
Разрабатываемая нами роботизированная машина на Arduino, управляемая по Bluetooth, подчиняется командам, формируемым приложением на телефоне с операционной системой Android. Поэтому первым делом нам необходимо скачать подобное приложение из Google play. Можно использовать любое Bluetooth приложение, которое поддерживает передачу данных. Пара примеров подобных приложений, с которыми наше устройство точно будет работать корректно:
- Bluetooth Spp pro;
- Bluetooth controller.
После установки подобного приложения вам необходимо открыть его и выбрать желаемое Bluetooth устройство. Затем сконфигурировать клавиши. Для примера в этом проекте мы использовали приложение Bluetooth controller. Последовательность действий в этом случае будет следующая:
- Скачать и установить Bluetooth Controller.
- Включить Bluetooth в настройках телефона.
- Открыть приложение Bluetooth controller.
- Нажать scan.
- Выбрать желаемое Bluetooth устройство.
- Установить клавиши – для этого необходимо нажать кнопку ‘set button’ и установить клавиши согласно приведенному рисунку.
- После установки клавиш нажать ok.
Когда мы будем нажимать кнопку движения вперед в приложении Bluetooth controller, то машина начнет двигаться вперед и будет двигаться в этом направлении пока не поступит следующая команда.
Когда мы будем нажимать кнопку движения назад в приложении Bluetooth controller, то машина начнет двигаться в обратном направлении (назад) и будет двигаться в этом направлении пока не поступит следующая команда.
Когда мы будем нажимать кнопку движения влево в приложении Bluetooth controller, машина начнет поворачивать влево и будет делать это до поступления очередной команды. В этом случае передний двигатель машины повернет ее передние колеса влево, а задний двигатель будет двигать машину прямо.
Когда мы будем нажимать кнопку движения вправо в приложении Bluetooth controller, машина начнет поворачивать вправо и будет делать это до поступления очередной команды. В этом случае передний двигатель машины повернет ее передние колеса вправо, а задний двигатель будет двигать машину прямо.
После нажатия кнопки остановки в приложении Bluetooth controller машина остановится.
Работа схемы
Схема устройства представлена на следующем рисунке.
Драйвер мотора используется для управления двигателями машины. Его контакты 2, 7, 10 и 15 подсоединены к цифровым контактам Arduino 12, 11, 10 и 9 соответственно. Один из двигателей подключен к выходным контактам драйвера мотора 3 и 6, а другой – к контактам 11 и 14. Батарейка 6 Вольт также используется для питания драйвера мотора – а через него для питания двигателей. Контакты rx и tx Bluetooth модуля непосредственно подключены к контактам tx и rx платы Arduino. Батарейка 9 Вольт используется для подачи питания на контакт Arduino Vin.
Исходный код программы
В программе первым делом необходимо инициализировать выходные контакты для подключения двигателей (через драйвер мотора).
#define m11 11 // задний двигатель #define m12 12 #define m21 10 // передний двигатель #define m22 9 |
Затем в функции setup задать направление работы для этих контактов (на вывод данных).
void setup() { Serial.begin(9600); pinMode(m11, OUTPUT); pinMode(m12, OUTPUT); pinMode(m21, OUTPUT); pinMode(m22, OUTPUT); } |
После этого мы будем считывать данные из последовательного порта Arduino, получаемые им от последовательного порта Bluetooth модуля, и выполнять соответствующие инструкции.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | void loop() { while(Serial.available()) { char ch=Serial.read(); str[i++]=ch; if(str[i—1]==‘1’) { Serial.println(«Forward»); forward(); i=0; } else if(str[i—1]==‘2’) { Serial.println(«Left»); right(); i=0; } else if(str[i—1]==‘3’) { Serial.println(«Right»); left(); i=0; } |
Затем мы запрограммируем функции для различных направлений движения машины. Всего будет использоваться пять условий для задания направления движения машины, представленных в следующей таблице:
Далее представлен полный текст программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #define m11 11 // задний двигатель #define m12 12 #define m21 10 // передний двигатель #define m22 9 char str[2],i; void forward() { digitalWrite(m11, LOW); digitalWrite(m12, LOW); digitalWrite(m21, HIGH); digitalWrite(m22, LOW); } void backward() { digitalWrite(m11, LOW); digitalWrite(m12, LOW); digitalWrite(m21, LOW); digitalWrite(m22, HIGH); } void left() { digitalWrite(m11, HIGH); digitalWrite(m12, LOW); delay(100); digitalWrite(m21, HIGH); digitalWrite(m22, LOW); } void right() { digitalWrite(m11, LOW); digitalWrite(m12, HIGH); delay(100); digitalWrite(m21, HIGH); digitalWrite(m22, LOW); } void Stop() { digitalWrite(m11, LOW); digitalWrite(m12, LOW); digitalWrite(m21, LOW); digitalWrite(m22, LOW); } void setup() { Serial.begin(9600); pinMode(m11, OUTPUT); pinMode(m12, OUTPUT); pinMode(m21, OUTPUT); pinMode(m22, OUTPUT); } void loop() { while(Serial.available()) { char ch=Serial.read(); str[i++]=ch; if(str[i—1]==‘1’) { Serial.println(«Forward»); forward(); i=0; } else if(str[i—1]==‘2’) { Serial.println(«Left»); right(); i=0; } else if(str[i—1]==‘3’) { Serial.println(«Right»); left(); i=0; } else if(str[i—1]==‘4’) { Serial.println(«Backward»); backward(); i=0; } else if(str[i—1]==‘5’) { Serial.println(«Stop»); Stop(); i=0; } delay(100); } } |
Видео, демонстрирующее работу схемы
Загрузка…
2 550 просмотров
Первая часть статьи проекта CxemCAR находится здесь. Там же находятся исходники для 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 платформу, купленную на eBay за 25$. Сама платформа представляет из себя алюминиевое основание, куда крепится два двигателя, редуктор и 4 карданные передачи для 4-х колес. Сверху, на 3-х стойках ставится макетная плата.
Платформа не отличается высоким качеством изготовления. После того, как я ее собрал, попробовал подключить питание — двигателя даже не шевельнулись, много перекосов, недоработок и т.п. Пришлось все разбирать, немного ослабить крепления, кое-где подточить, хорошо все промазать смазкой, а также снял 2 кардана с передней оси. Получилась заднеприводная версия машинки.
После этого, я припаял Bluetooth-модуль к Arduino и вывел для него светодиод состояния. О разновидностях Bluetooth модулей, их подключении к Arduino, работы с ними и т.п. можете почитать в данной статье: Arduino и Bluetooth. Модуль HC-06 поместил в термоусадочную трубку 10мм. Светодиод Bluetooth-состояния с токоограничительным резистором также были помещены в термоусадку, но более тонкую — 5мм.
В макетной плате, которая шла вместе с платформой, я просверлил отверстия и закрепил драйвер двигателей L298N. Плату Arduino прикрепил при помощи двухстороннего скотча.
Между алюминиевой платформой машинки и макетной платой я разместил 3 Li-Po аккумулятора 3.7В 1100 мА*Ч. Питание контроллера и двигателей раздельное: Arduino запитывается от одного аккумулятора 3.7В, а моторчики и драйвер L298N от двух последовательно соединенных аккумуляторов 3.7В. Предусмотрено два 2-х позиционных выключателя питания — в одном положение питание идет от аккумуляторов к потребителям, в другом положении на клеммы зарядки.
Фото машинки на подзарядке:
Программное обеспечение
Программа писалась в среде Arduino IDE 1.01. Код программы я постарался хорошо прокомментировать, но если будут вопросы — спрашивайте на форуме, в теме поддержке проекта CxemCAR.
#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[4]; // строковый массив для данных левого мотора L byte L_index = 0; // индекс массива char R_Data[4]; // строковый массив для данных правого мотора R byte R_index = 0; // индекс массива char H_Data[1]; // строковый массив для доп. канала byte H_index = 0; // индекс массива H char F_Data[8]; // строковый массив данных для работы с 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[3]; var_Data[0] = EEPROM.read(1); var_Data[1] = EEPROM.read(2); var_Data[2] = 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[L_index] = incomingByte; // сохраняем каждый принятый байт в массив L_index++; // увеличиваем текущий индекс массива } else if(command == cmdR && incomingByte != cmdR){ R_Data[R_index] = incomingByte; R_index++; } else if(command == cmdH && incomingByte != cmdH){ H_Data[H_index] = incomingByte; H_index++; } else if(command == cmdF && incomingByte != cmdF){ F_Data[F_index] = 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[0],F_Data[1],F_Data[2],F_Data[3],F_Data[4]); } 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("rn"); // маркер конца передачи 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("FWOKrn"); // посылаем сообщение, что данные успешно записаны } }
В коде используется библиотека для работы с EEPROM памятью AVR. В памяти хранится одна настройка: количество миллисекунд через которое машинка останавливается при потери связи. Можно эту настройку «жестко» прописать в программе, для этого раскомментируйте строчку #define autoOFF 2500 (где 2500 кол-во миллисекунд). После этого, функцию Flash_Op можно удалить, также необходимо будет внести небольшие правки в код, отвечающий за прием команд для работы с EEPROM-памятью.
Плата Arduino по USART от Bluetooth модуля получает готовые данные для левого и правого двигателя. Т.е. все основные расчеты происходят в Android приложении.
Код Arduino на GitHub
Теги:
Опубликована: 06.01.2013
Изменена: 19.07.2013
3
Вознаградить
Я собрал
1
0
x
Оценить статью
- Техническая грамотность
- Актуальность материала
- Изложение материала
- Полезность устройства
- Повторяемость устройства
- Орфография
0
Средний балл статьи: 0
Проголосовало: 0 чел.