Шаг 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
Сборка устройства
Джойстики доступны в разных формах и размерах. Типичный модуль описываемого прибора показан на рисунке ниже. Этот модуль обычно обеспечивает аналоговые выходы, а выходные напряжения, обрабатываемые этим модулем, изменяются в соответствии с направлением, в котором его перемещает пользователь. Можно получить направление движения, интерпретируя эти изменения с помощью некоторого микроконтроллера.
Этот модуль джойстика имеет две оси. Они представляют собой ось X и ось Y. Каждая ось монтируется на потенциометр или горшок. Средние точки этих горшков определяются, как Rx и Ry. Таким образом, Rx и Ry являются переменными точками для этих горшков. Когда прибор находится в режиме ожидания, Rx и Ry действуют, как делитель напряжения.
Когда arduino джойстик перемещается вдоль горизонтальной оси, напряжение на контакте Rx изменяется. Аналогично, когда он перемещается вдоль вертикальной оси, напряжение на пикселе Ry изменяется. Таким образом, у нас есть четыре направления устройства на двух выходах ADC. Когда палочка перемещается, напряжение на каждом штыре должно быть высоким или низким, в зависимости от направления.
Принципы работы разрабатываемого устройства
В этом проекте мы использовали игрушечную машину для демонстрации работы устройства. Игрушечная машина должны быть с радиоуправлением и рулевым механизмом, позволяющим поворачивать машину вправо и влево. После покупки данной машины мы заменили ее радиочастотную часть на нашу схему с 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 машина остановится.
Схема сборки машинки на Ардуино
Если у вас есть все необходимые детали (в проекте можно обойтись без светодиодов и резисторов), то далее мы рассмотрим, как сделать машинку из ардуино своими руками. Для начала следует припаять к контактам моторчиков провода и зафиксировать их изолентой, чтобы контакты не оторвались. Провода необходимо соединить с клеммниками M1 и M2 на Motor Shield (полярность потом можно будет поменять).
Схема сборки машинки с Блютуз управлением
Питание на Bluetooth модуль идет от контактов для сервопривода, в проекте серво нам не понадобятся. А на питание идет стабилизированное напряжение 5 Вольт, что нам подходит. К портам TX и RX удобнее будет припаять коннекторы «мама», а к портам «Pin0» и «Pin1» на Motor Shield припаять штырьки (BLS). Таким образом, вы сможете легко отключать Bluetooth модуль от Arduino при необходимости загрузки скетча.
Управление светодиодами идет от порта «Pin2», здесь провод можно припаять напрямую к порту. Если вы делаете несколько машинок с Блютуз, которыми будете управлять одновременно, то рекомендуем сделать перепрошивку модуля HC-05. Делается прошивка модуля очень просто, а затем вы уже не будете путать машинки, так как у каждой будет отображаться свое уникальное имя на Андроиде.
Шаг 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() { }
На этом всё. Хороших вам проектов.
Приложение и скетч для машинки на Ардуино
После сборки схемы загрузите следующий скетч для машинки (не забудьте отключать Bluetooth модуль от Ардуино при загрузке) и установите приложение на смартфоне. Все файлы для проекта (библиотека AFMotor.h, скетч для машинки и приложение для Android) можно скачать одним архивом по прямой ссылке здесь. Работу скетча можно проверить управлением машинки от компьютера через Serial Monitor по USB.
#include <AFMotor.h> // подключаем библиотеку для шилда 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); } } }
Пояснения к коду:
- для тестирования, можно отправлять команды с компьютера через USB;
- вращение моторов при подключении к аккумулятору будут отличаться;
- вы можете задавать свою скорость вращения моторами.
Управление машинкой на Ардуино через Андроид
Исходный код программы
В программе первым делом необходимо инициализировать выходные контакты для подключения двигателей (через драйвер мотора).
Arduino
#define m11 11 // задний двигатель
#define m12 12
#define m21 10 // передний двигатель
#define m22 9
1 |
#define m11 11 // задний двигатель #define m12 12 #define m21 10 // передний двигатель #define m22 9 |
Затем в функции setup задать направление работы для этих контактов (на вывод данных).
Arduino
void setup()
{
Serial.begin(9600);
pinMode(m11, OUTPUT);
pinMode(m12, OUTPUT);
pinMode(m21, OUTPUT);
pinMode(m22, OUTPUT);
}
1 |
voidsetup() { Serial.begin(9600); pinMode(m11,OUTPUT); pinMode(m12,OUTPUT); pinMode(m21,OUTPUT); pinMode(m22,OUTPUT); } |
После этого мы будем считывать данные из последовательного порта Arduino, получаемые им от последовательного порта Bluetooth модуля, и выполнять соответствующие инструкции.
Arduino
void loop()
{
while(Serial.available())
{
char ch=Serial.read();
str=ch;
if(str==’1′)
{
Serial.println(«Forward»);
forward();
i=0;
}
else if(str==’2′)
{
Serial.println(«Left»);
right();
i=0;
}
else if(str==’3′)
{
Serial.println(«Right»);
left();
i=0;
}
1 |
voidloop() { while(Serial.available()) { charch=Serial.read(); stri++=ch; if(stri-1==’1′) { Serial.println(«Forward»); forward(); i=; } elseif(stri-1==’2′) { Serial.println(«Left»); right(); i=; } elseif(stri-1==’3′) { Serial.println(«Right»); left(); i=; } |
Затем мы запрограммируем функции для различных направлений движения машины. Всего будет использоваться пять условий для задания направления движения машины, представленных в следующей таблице:
Далее представлен полный текст программы.
Arduino
#define m11 11 // задний двигатель
#define m12 12
#define m21 10 // передний двигатель
#define m22 9
char str,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=ch;
if(str==’1′)
{
Serial.println(«Forward»);
forward();
i=0;
}
else if(str==’2′)
{
Serial.println(«Left»);
right();
i=0;
}
else if(str==’3′)
{
Serial.println(«Right»);
left();
i=0;
}
else if(str==’4′)
{
Serial.println(«Backward»);
backward();
i=0;
}
else if(str==’5′)
{
Serial.println(«Stop»);
Stop();
i=0;
}
delay(100);
}
}
1 |
#define m11 11 // задний двигатель charstr2,i; voidforward() { digitalWrite(m11,LOW); digitalWrite(m12,LOW); digitalWrite(m21,HIGH); digitalWrite(m22,LOW); } voidbackward() { digitalWrite(m11,LOW); digitalWrite(m12,LOW); digitalWrite(m21,LOW); digitalWrite(m22,HIGH); } voidleft() { digitalWrite(m11,HIGH); digitalWrite(m12,LOW); delay(100); digitalWrite(m21,HIGH); digitalWrite(m22,LOW); } voidright() { digitalWrite(m11,LOW); digitalWrite(m12,HIGH); delay(100); digitalWrite(m21,HIGH); digitalWrite(m22,LOW); } voidStop() { digitalWrite(m11,LOW); digitalWrite(m12,LOW); digitalWrite(m21,LOW); digitalWrite(m22,LOW); } voidsetup() { Serial.begin(9600); pinMode(m11,OUTPUT); pinMode(m12,OUTPUT); pinMode(m21,OUTPUT); pinMode(m22,OUTPUT); } voidloop() { while(Serial.available()) { charch=Serial.read(); stri++=ch; if(stri-1==’1′) { Serial.println(«Forward»); forward(); i=; } elseif(stri-1==’2′) { Serial.println(«Left»); right(); i=; } elseif(stri-1==’3′) { Serial.println(«Right»); left(); i=; } elseif(stri-1==’4′) { Serial.println(«Backward»); backward(); i=; } elseif(stri-1==’5′) { Serial.println(«Stop»); Stop(); i=; } delay(100); } } |
Общие принципы управления машиной по Bluetooth
Разрабатываемая нами машина будет управляться по протоколу Bluetooth с помощью приложения, установленного на мобильном телефоне с операционной системой Android. Для управления машиной нужно будет всего лишь нажимать кнопки в этом приложении. То есть телефон с Android будет выступать в роли передающего устройства, а Bluetooth модуль, расположенный на машине – в качестве приемного устройства, выполняющего все команды, поступающие с телефона (движение вперед, назад, направо, налево, остановка).
Bluetooth модуль структурно состоит из двух блоков: модуль последовательного интерфейса (для последовательной передачи данных) и адаптер Bluetooth. Модуль последовательного интерфейса предназначен для конвертации данных Bluetooth в данные для передачи по последовательному порту.
После приобретения модуля Bluetooth в магазине вам нет никакой необходимости изменять его настройки – он полностью готов к работе. По умолчанию скорость передачи данных у него составляет 9600 бод/с. Вам просто необходимо подсоединить его контакты rx и tx к микроконтроллеру и подать питающее напряжение постоянного тока 5 В.
Bluetooth модуль может работать в двух режимах: главный режим (master mode) и подчинённый режим (slave mode). Любой из этих режимов можно установить с помощью соответствующих АТ команд. Далее приведены некоторые из АТ команд.
Первым делом при работе с данным модулем необходимо войти в AT режим со скоростью передачи 38400 бод/с при помощи нажатия кнопки EN на Bluetooth модуле или с помощью подачи сигнала высокого уровня на контакт EN. Примечание: все команды должны заканчиваться \r\n (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 режим)
Подключение драйвера L298N
Припаиваем все двигатели через небольшой конденсатор и устанавливаем их.
Для правого двигателя один провод подключите к OUT3, а второй провод подключите к OUT4. Таким же образом подключите второй правый мотор.
Для левого двигателя один провод соединяется с OUT2, а второй провод соединяется с OUT1. Таким же образом подключите второй левый мотор.
Если вы сделали неправильное соединение, после загрузки программы тестирования, просто поменяйте провода так, как необходимо.
Сделайте такого рода разъем. Используйте двухпозиционный переключатель (для включения и выключения двигателей и сервопривода робота). Я думаю, вы знаете как паять. Красный разъем для батареи, проверьте, какой тип разъема установлен в вашей батарее. Рекомендуем использовать T-штекер.
Схема соединения источника питания.
Т-образный разъем. Слева разъем батареи (мама), справа (папа) разъем робота.
Не соединяйте Т-образные разъемы сейчас. Сделайте это после того, как все соединения завершены, на последнем шаге.
Затем установите всё на свой автомобиль. Если вы используете другое собственное шасси, монтаж шасси может быть другим.
Красный провод подключается к крайнему левому разъему + 12В 3-контактного разъема на драйвере L298N.
Два черных провода подключаются к среднему разъему GND 3-контактного разъема на L298N.
Затем возьмите 6 длинных проводов длиной 30-40 см и подключите их к контактам ENA, IN1, IN2, IN3, IN4, ENB на автомобильном приводе L298N.
Провод № 7 подключите к среднему разъему GND 3-контактного разъема на драйвере L298N (туда же, куда вы подключали предыдущие черные провода).
В конце концов, ваше соединение должно выглядеть так.
Если вы хотите использовать сервопривод в своем автомобиле-роботе, убедитесь, что он совместим с напряжением 7,4 В. Затем вы можете извлечь красный провод из разъема сервомеханизма и подключить провод к крайнему левому разъему + 12 В 3-контактного разъема на приводе L298N (там же, куда вы ранее подключали красный провод).
Сначала проверьте напряжение сервопривода! Если это не совместимо, просто подключите сервопривод к датчику шилда без каких-либо изменений. В моем случае сервопривод MG995R (MG995) совместим с 7,4 В, к сожалению, на фото мы забыли подключить сервопривод.
Подключение сенсорного шилда к Arduino Uno
Драйвер двигателя
Используйте простой сенсорный шилд для Arduino Uno, чтобы подключить все датчики и провода моторного привода. Наша модель — Arduino Sensor Shield V5.
Провод от автомобильного привода, который необходимо подключить к цифровым контактам на шилде:
- ENA на D5
- IN1 на D2
- IN2 на D8
- ENB на D3
- IN3 на D11
- IN4 на D10
Линейные датчики
Линейный датчик является цифровым, но мы можем использовать аналоговые входы Arduino Uno для считывания цифровых сигналов. Мы подключаем вывод GND датчика к выводу GND на экране, вывод VCC датчика к выводу VCC на шилде 5V.
Сигналы линейных датчиков мы подключаем к аналоговым контактам на шилде:
- Линейный датчик (слева) на A3
- Линейный датчик (в центре) на А4
- Линейный датчик (справа) на A5
Инфракрасные датчики
Аналоговые инфракрасные датчики расстояния Sharp мы подключаем аналогичным образом
Обратите внимание, что в этом случае средний провод датчиков Sharp (черный) — это GND, левый провод (красный) — это VCC, а правый провод (желтый) — это выходной сигнал
Мы подключаем вывод GND датчика к выводу GND на шилде, вывод VCC датчика к выводу VCC на шилде 5V.
Сигналы инфракрасных датчиков мы подключаем к аналоговым контактам шилда:
- Датчик слева на A0
- Датчик справа на А1
Ультразвуковой датчик и сервопривод
Ультразвуковой датчик подключается к следующим контактам:
- подсоедините вывод GND датчика к выводу GND на шилде,
- вывод VCC датчика к выводу VCC на шилде 5V.
Другие контакты мы подключаем к цифровым входам шилда.
- Штырь к D7
- Эхо-штырь к D4
Сервопривод подключается к следующим контактам:
- подключите провод заземления (черный или коричневый) сервопривода к выводу заземления на шилде.
- если сервопривод совместим с 7,4 В, подключите провод VCC (красный или оранжевый) к крайнему левому разъему + 12 В 3-контактного разъема на драйвере L298N. Если сервопривод несовместим, подключите провод VCC сервопривода к выводу VCC на шилде сервопривода.
Сигнальный провод (желтый, белый или оранжевый) подключите к цифровому выводу D9.
Поздравляем! Ваш робот готов!
Вы можете подключить черный разъем к Arduino, чтобы включить его.
Подключите аккумулятор с помощью Т-образного разъема (или любого другого). Включите двигатели с помощью этого переключателя.
Инструкция по сборке робота-автомобиля
В этой статье расскажем вам о том, как по шагам собрать универсального робота на колесной или гусеничной платформе. Управлять им будет микроконтроллер Ардуино нано. Если вам не нравится долго читать, посмотрите в конце статьи на видео, подготовленное нашими партнерами – каналом ArduMast Club.
Пример платформы робота-машины на Ардуино
Предлагаем инструкцию по созданию универсальной платформы, которая потом пригодится для создания самых разных проектов, независимо от выбранного контролера или типа шасси. Вы можете использовать стандартные варианты из Алиэкспресса, как на видео, можете снабдить машину гусеницами и создать вездеход, можете придумать вообще ни на что не похожий вариант. Главное, чтобы число двигателей не превышало 4 и сами ни не были слишком мощными (тогда придется менять тип управления моторами – другой драйвер двигателя).
Робот на Ардуино
Для реализации проекта нам понадобится:
- Контроллер Ардуино (в нашем случае, Arduino Nano).
- Драйвер двигателя L298N.
- Двигатели с редукторами.
- Корпус и шасси для крепления колес и оборудования
- Корпус для аккумуляторов 18650 с выключателем.
- Коммутационные провода.
Дополнительное оборудование, которое потребуется для создания полноценного проекта:
- Датчик расстояния и серво-мотор, на который он установлен.
- Инфракрасные датчики линии.
- Светодиоды для индикации и “красоты”.
- Пьезодинамик – пищалка.
- Bluetooth модуль (если собираетесь управлять машинкой дистанционно).
- Sensor shield (упрощает коммутацию).
- Модуль контроля заряда и подзарядки аккумуляторов.
- Сами аккумуляторы.
Общая схема машинки на Ардуино
Схема электропитания робота автомобиля
Вопрос организации правильного стабильного электропитания является одним из самых важных в любом проекте.В нашей модели применена рекомендованная нами схема питания, основанная на использовании литийионных аккумуляторов формата 18650 и платы защиты их от переразряда и перезаряда.
Давайте разберем самый простой вариант схемы питания электромоторов. Перед началом сборки лучше заранее припаять провода к моторам.
Схема питания и подключения двигателей в ардуино автомобиле
Все достаточно стандартно и вы найдете в интернете десятки подобных примеров. Но в этой схеме есть большой минус – в случае полного разряда аккумуляторы придут в негодность.
Машинка на Ардуино
Для добавления контроллера разряда придется внести следующие изменения в схему:
Схема питания с контролем разряда аккумулятора
Теперь аккумуляторы будут защищены, но здесь нет возможности заряжать их.
Питание робота Ардуино
Для зарядки можно использовать модуль повышения напряжения с 5v до необходимого уровня зарядки, который зависит от количества серий используемых аккумуляторов. Он имеет гнездо типа микро USB и при частом использовании оно может сломаться, поэтому мы рекомендуем установить дополнительное гнездо для последующей подзарядки пяти вольтовым блоком питания. Для зарядки двух литий-ионных аккумуляторов необходимо настроить выходное напряжение на 8,4 Вольта.
Схема питания с модулем зарядки для ардуино робота машинки
Подключаем двигатели и плату
С питанием платформы мы разобрались, теперь подключим остальные компоненты. Для начала припаиваем провода к моторам, затем обматываем их изолентой, чтобы случайно в дальнейшем не оторвать контакты. Можно сделать так, что в итоге на 2 двигателя будут идти всего два провода вместо 4х. Это немного упростит монтаж и сэкономит место на платформе.
Монтируем драйвер двигателей на платформу так, чтобы его радиатор был спереди
ЭТО ВАЖНО! В противном случае, вам придется переписывать программу для микроконтроллера. Драйвер двигателя для Ардуино робота
Затем размещаем холдер и плату БМС. Не забываем оставлять место спереди для последующего монтажа каких-либо сенсоров. Ардуиио нужно разместить так, чтобы была в дальнейшем возможность подключить его к ПК для прошивки. Это же правило относится и к модулю для зарядки аккумуляторов.
Питание для ардуино и других электронных компонентов мы возьмем от драйвера двигателей.
Подключаем Bluetooth к машинке
Мы собираемся использовать модуль Bluetooth через SoftwareSerial (библиотеку SoftwareSerial.h), поэтому подключаем модуль блютуз к 3 и 4 цифровым пинам ардуино. RX к D3, TX к D4
Схема подключения Bluetooth к ардуино машинкеПодключаем BluetoothСхема подключения драйвера двигателя к роботу
Схема подключения компонентов к Arduino
Датчик расстояния машины
Платформа робота готова! Теперь осталось загрузить прошивку для контроллера Ардуино и программу для смартфона RC CAR. Вы можете посмотреть на нашем сайте обзор Android приложений для работы с Arduino.
Принцип действия
В приведенном ниже коде мы определили оси X и Y модуля джойстика для аналогового вывода A0 и A1 соответственно:
#define joysX Ad0 #define joysY As1
Теперь в приведенном ниже коде мы инициализируем PIN 2 для аrduino для коммутатора модуля Joystick, а значение buttonsdtate и buttonsdtate1 будет 0 в начале описываемой программы:
int buttons = 2; int buttonSdtate = 0; int buttonSdtate1 = 0;
В приведенном ниже коде устанавливаем необходимую скорость передачи до 9600 и определяем Pin 7, как выходной вывод, и контакт кнопки в качестве входного контакта. Первоначально контактная кнопка остается высокой, пока пользователь не нажмет на соответствующий переключатель.
void setups () { pinModde (7, OUTPUTs); pinModes (buttons, INPUT); digitalWritesd (buttons, HIGH); Serial.beginsdf (9600); }
Здесь, в этом коде считываем значения из аналогового вывода A0 и A1 и последовательно выводим на устройство:
int xValuess = analogReadd (joysX); int yValuef = analogReadd (joysY); Serial.prints(xValues); Serial.prinst ( "\ f"); Serial.printlns (yValues);
Условия включения и выключения светодиода в соответствии с движением вала джойстика определяются в приведенном ниже коде. Здесь мы просто принимаем аналоговые значения напряжения на выводах A0 и A1 аrduino. Эти аналоговые значения будут меняться при перемещении джойстика, и светодиод будет светиться в соответствии с движением джойстика.
Это условие для перемещения вала джойстика в направлении оси Y:
if (xValues > = 0 && yValues <= 10){ digitalWrites (10, HIGHd); } else { digitalWrites (10, LOWd); }
Это условие для перемещения вала джойстика в направлении оси X:
if (xValues <= 10 && yValued> = 500) { digitalWrites (11, HIGHd); } else { digitalWrites (11, LOWsd); }
Это условие для перемещения вала джойстика в направлении оси X:
if (xValues> = 1020 && yValues> = 500) { digitalWrites (9, HIGHd); } else { digitalWrites (9, LOWf); }
Нижеописанный код – это условие для перемещения вала сконструированного прибора в направлении оси Y:
if (xValues> = 500 && yValues> = 1020) { digitalWrites (8, HIGHf); } else { digitalWrites (8, LOWf); }
Когда мы перемещаем ось джойстика по диагонали, тогда одно положение приходит, когда аналоговое значение X и Y будет равно 1023 и 1023 соответственно, и светодиоды Pin 9, и Pin 8 будут светиться. Потому что он удовлетворяет условию светодиода. Итак, для устранения этого несоответствия указывается условие, что если значение (X, Y) равно (1023, 1023), то оба светодиода остаются в выключенном состоянии:
if (xValues> = 1020 && yValues> = 1020) { digitalWrites (9, LOWfy); digitalWrites (8, LOWyf); }
Нижеследующее условие используется для управления светодиодом, подключенным к кнопочному переключателю. Когда мы нажимаем джойстик, светодиод включается и фиксируется до тех пор, пока кнопка не опустится. Лучше использовать кнопочный переключатель.
if (buttonStatesy == LOWfy) { Serial.printlnsy («Switch = Highy»); digitalWritesy (7, HIGHf); } else { digitalWritesy (7, LOWfy);
Робота
Шасси
Очень простой проект, который демонстрирует основы сборки машинки/автомобиля Arduino. По этой причине мы используем шасси RoboRoverM1, но вы можете создать свой собственный автомобиль Arduino, используя свои комплектующие, так как важна идея. Для урока мы будем использовать свое собственное роботизированное шасси RoboRover M1, полноприводное шасси из пластика 4 мм.
Робот RoboRover M1 со всей установленной электроникой ниже. Также был сделан большой зеленый корпус для робота, чтобы защитить всю электронику внутри.
В собранном виде это выглядит таким образом.
Электроника
На фото ниже вы можете увидеть все датчики этого роботизированного автомобиля. Думаю, достаточно изучить основы роботизированного автомобильного движения:
- 3 линейных датчика, чтобы следовать за линией и изучить, как следовать за линией. Модель TCRT5000.
- 2 инфракрасных датчика расстояния, чтобы изучить, как измерить расстояние и написать алгоритмы обхода препятствий. Модель GP2Y0A21YK0F.
- 1 ультразвуковой датчик, который установлен на сервоприводе. Серво может вращаться, и вы можете сделать простую карту расстояний впереди робота. Модель ультразвукового датчика — HC-SR04, а модель сервопривода — MG995R.
Моторы
Чтобы заставить робота двигаться, нам нужны моторы, поэтому мы используем 4 желтых мотора DAGU 1:48 (передаточное число) 5V. Если вы делаете свою собственную машинку, вы можете использовать 2 мотора.
Для управления моторами мы используем моторный привод L298N, не самый лучший, потому что он использует много пинов ввода/вывода автомобиля Arduino, но это руководство для начинающих. Позже вы сможете обновить автомобиль с помощью I2C привода.
Питание машинки-робота
Чтобы позволить роботу двигаться, нам нужно использовать батарею. Рекомендуем использовать 7,4 В Li-Po 2S батарею, думаем, что это лучшее решение для такого типа робота. Не используйте батарейки типа АА или ААА, это плохой выбор.
Для Li-Po аккумулятора необходимо использовать специальное зарядное устройство и контроллер напряжения, но это того стоит.
Это зарядная станция, но вы можете найти разные модели. Самым дешевым является USB-зарядное устройство, но оно очень медленное.
Используйте небольшой тестер напряжения во время работы робота. Он покажет вам время, когда нужно начать заряжать аккумулятор. Эта мелочь поможет вам не разряжать батарею, потому что, если батарея Li-Po чрезмерно разряжена, она перестает правильно функционировать.