В этой статье я опишу процесс подключения к Arduino Mega 2560 платы Motor Shield, управление четырьмя электродвигателями и одним сервоприводом MG995.
В предыдущей статье я описал процесс сборки мотоплатформы для будущего Arduino робота и поделился планами на будущее.
Основная задача на сегодня - заставить Ведроид-мобиль двигаться и управлять сервоприводом.
Подключение Motor Shield к Arduino Mega 2560
Не будем тянуть время и приступим. Снимаем верхнюю часть платформы и припаиваем провода ко всем четырём двигателям. Соблюдайте полярность. У меня на всех верхних контактах синий провод, а на нижних - желтый.
Паяйте очень аккуратно, чтобы не испортить клеммы на двигателях. В результате должно получиться что-то подобное.
Сразу закрепим сервопривод MG995 и аккуратно уложим провода внутри мотоплатформы, чтобы они не цеплялись за колеса и нам больше не пришлось снимать её верхнюю часть.
Затем устанавливаем корпус для элементов питания и закрепляем его. У меня пока есть блок на 4 элемента.
Если у вас есть тумблер и ненужный разъем, через который будет осуществляться зарядка аккумуляторов, то установите их сейчас. К сожалению, у меня под рукой их не оказалось.
Сразу выводим все провода через отверстия наверх.
Теперь закрепляем снаружи на верхней части платформы Arduino Mega 2560 и вставляем в нее наш Motor Drive Shield 2x L293D. Устанавливаем верхнюю часть платформы на место и закрепляем её болтами.
Теперь пришло время подключить двигатели к Motor Shield.
Передние двигатели я подключил к клемам M3 и M4. M4 - передний правый двигатель, M3 - передний левый. Arduino при креплении к верхней крышке стала наоборот, поэтому получился такой сдвиг.
M2 - задний правый двигатель. M1 - задний левый, Соблюдайте полярность подключения электродвигателей
Подключаем сервопривод MG995.
Провод питания сервопривода пришлось откусить потому, что встроенный в Arduino стабилизатор напряжения не выдавал достаточный ток для его работы. В результате появился глюк в работе.
Проблему решил путем подключения питающего провода сервопривода напрямую к источнику питания.
Подключаем провода питания к контактам на Motor Shield. На плюсовую клемму также подключаем провод от сервопривода
Прошу вас сразу обратить внимание на перемычку. Если ее убрать, то питание на контроллер Arduino придется подавать отдельно. На рисунке приведена схема, поясняющая электрические соединения шин питания контроллера Arduino и модуля Motor Shield.
Любуемся нашим шедевром.
На этом с аппаратной частью на сегодня мы заканчиваем и переходим к написанию тестового скетча для робота.
Занятость портов Arduino при подключенном Motor Shield
После подключения Motor Shield к Arduino некоторые порты нам больше не доступны для работы, так как их использует Motor Shield.
Более подробно об этом расписано на сайте Arduino Shield List.
Пример скетча для работы Arduino с Motor Shield реализующий управление четырьмя двигателями и одним сервоприводом
Основная задача - разобраться с управлением четырьмя двигателями и вращением одного сервопривода.
Сразу давайте обсудим первоначальный функционал нашего тестового скетча.
Предлагаю реализовать такой алгоритм:
- Движение вперед в течении 5 секунд с поворотом сервы на угол 90 градусов
- Поворот вправо в течении 2 секунд с поворотом сервы на угол 180 градусов
- Движение назад в течении 5 секунд с поворотом сервы на угол 90 градусов
- Поворот влево в течении 2 секунд с поворотом сервы на угол 0 градусов
- Остановка двигателей на 3 секунды с поворотом сервы на угол 90 градусов
Задача поставлена - можно приступать.
Для начала нам необходимо установить библиотеку AFMotor.
afmotor.rar (9,2 KiB, 3 570 hits)
Скачайте архив и распакуйте его содержимое в \arduino-1.XX\libraries\
Все пояснения я добавил в комментариях к коду, поэтому построчно разбирать его не буду. Единственное что поясню - это повороты. Так как колеса нашей мотоплатформы не могут поворачиваться, то поворот в стороны реализованы разнонаправленным вращением двигателей, т.е. при повороте вправо переднее правое и заднее правое колесо начинают вращаться назад, а переднее левое и заднее левое вращаются вперед.
#include <AFMotor.h> // Подключаем библиотеку для управления двигателями
#include <Servo.h> // Подключаем библиотеку для сервоприводом//Создаем объекты для двигателей
AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый
AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый
AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый
AF_DCMotor motor4(4); //канал М4 на Motor Shield — передний правый// Создаем объект для сервопривода
Servo myservo;void setup() {
// Выбираем пин к которому подключен сервопривод
myservo.attach(9); // или 10, если воткнули в крайний разъём
// Поворачиваем сервопривод в положение 0 градусов при каждом включении
myservo.write(0);
// Пауза 5 секунд
delay(5000);
}void loop() {
//Устанавливаем скорость 100% (0-255)
motor1.setSpeed(255);
motor2.setSpeed(255);
motor3.setSpeed(255);
motor4.setSpeed(255);// Задаем направление движение
// FORWARD - вперед
// BACKWARD - назад
// RELEASE - стоп// Движение вперед в течении 5 секунд с поворотом сервы на угол 90 градусов
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
myservo.write(90); // Поворот сервы на угол 90 градусов
delay(5000);// Поворот вправо в течении 2 секунд с поворотом сервы на угол 180 градусов
motor1.run(FORWARD);
motor2.run(BACKWARD);
motor3.run(FORWARD);
motor4.run(BACKWARD);
myservo.write(180); // Поворот сервы на угол 180 градусов
delay(2000);// Движение назад в течении 5 секунд с поворотом сервы на угол 90 градусов
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
myservo.write(90); // Поворот сервы на угол 90 градусов
delay(5000);//Поворот влево в течении 2 секунд с поворотом сервы на угол 0 градусов
motor1.run(BACKWARD);
motor2.run(FORWARD);
motor3.run(BACKWARD);
motor4.run(FORWARD);myservo.write(0); // Поворот сервы на угол 0 градусов
delay(2000);// Остановка двигателей на 3 секунды с поворотом сервы на угол 90 градусов
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
myservo.write(90); // Поворот сервы на угол 90 градусов
delay(3000);
}
Демонстрация работы
P.S.
В следующий раз я попробую реализовать управление Ведроид-мобилем по Bluetooth со смартфона на Android.
Класс! Ещё бы сонар подключить бы.
Если просто интересует работа Arduino с дальномером, то ранее я уже описывал это.
Если по роботу, то я еще не продумал алгоритм работы. Существующие варианты меня не полностью устраивают
Скажу больше - я еще не решил какой алгоритм будет использоваться.
Пока рассматриваю 4 варианта:
- движение с объездом препятствий
- прохождение лабиринта
- аля робот пылесос - построение карты помещения и обход всей его площади (привязал сзади мокрую тряпку и пусть себе моет)
- из точки А попасть в точку Б
Пока склоняюсь к варианту прохождения лабиринта, но может реализую все алгоритмы.
P.S. не забыть сделать сверку данных с дальномера с измерениями произведенными ранее - это на случай если робот застрянет (это пометка для меня - на будущее)
Отличный материал, я заказал шасси на китайском сайте и набор для начинающих с уно + мотор шилд, запаял провода на движки подключил шилду, шилд насадил прямо на ардуино загрузил прогу ииии и у машинки колесча стали коутиться в разные стороны) отчего она нелепо каталась взад-вперед, перенил клемы и все стало -собака в восторге)))
а какой стабилизатор напряжения использовался на схеме
встроенные в Arduino и Motor Shield
Уточните, зачем использовать Arduino Mega 2560? Можно ли схему реализовать на другом контроллере, скажем Arduino Leonardo (на mega32)?
конкретно про Леонардо не скажу - в нем памяти мало. Если скетч влезет, то можно
Подскажите, не понял-для чего нужна серва- типа указатель-стрелка-куда будет ехать робот?
я на нее дальномер установил
Здравствуйте. Отличный проект! Собираю такого же, но пока на на 2 колесах. Вы запитали аппарат через клемник ext_pwr. Перемычка PWR в этом случае снимается? Какие элементы питания используете?
Автор меня игнорирует?
перемычка остается
использую 4 штуки аккумуляторов 18650
Спасибо за ответ! Очень вовремя. Жду как раз 8 штук 18650 на 5300 с зарядкой. Все остальное уже собрал. Как надолго хватает 4 аккумуляторов?
на 14 часов
А можно подключить на один канал сразу два таких двигателя ( параллельно, чтобы работали идентично)?
конечно, если суммарный ток потребления двигателей не превышает максимально допустимый ток на канале Motor Shield
Добрый день!
Вы в своём проекте используете 2шт. Motor Shield L293D?
И можно ли всё это реализовать на Arduino UNO?
Спасибо.
тут есть 2 проблемы: надо перепаивать выводы на втором шилде и переписывать библиотеку
Но если перепаять, то можно, верно?
не так понял ваш вопрос
1 motor shield использую на 4 канала
на UNO все должно пойти
Из шилдов можно "этажерку" собрать? и как использовать остальные выходы ардуино?
P.S. Я очень чайник, прошу сильно не пинать) спасибо)
Из шилдов можно «этажерку» собрать, припаяв второй к первому (контакты)? И как использовать остальные выходы ардуино, если сверху все закрыл shield?
P.S. Arduino приобрел совсем недавно, посему прошу сильно не пинать
Перепаяйте разъем, как это сделал я
https://geekelectronics.org/arduino/vedroid-mobil-robot-na-arduino-chast-3-podklyuchaem-bluetooth.html
сделал все по этой схеме, только на ардуино уно. Возникла такая проблема - моторы не крутятся. Питание подаю отдельно на ардуино и отдельно на моторшилд. На ардуино 4 батарейки на 1,5 вольта на моторшилд 2 последовательно соединенные кроны. Можете подсказать в чем проблема? Похоже не хватает питания. В инете нашел описание подобных ситуаций, но решения нигде нет.
Аналогичная проблема. Что делать не понимаю.
не хватает тока у ваших источников питания
Просто кроны не подходят. К ардуино дайте 5 вольт с средней ёмкостью от акамулятора, можно меньше 5(у меня 4.8), а СИЛОВОЕ ПИТАНИЕ лучше акамулятор на 7 вольт примерно, купите на радиорынке или подобном магазине. Кроны используют в местах где нужен сильный и короткий сигнал(пульт управления), а как питание для двигателей это и дорого и не работает как надо.
хотел спросить и что бы видео посмотреть по подробнее что бы подключить к моторам на 24 вольта 250 ватт эту плату драйвер двигателя и ардуино,если подключить к ардуино там я как понял ардуино питается 5 вольт ,подключаем на верх плату драйвер двигателя и потом если я в 2 эти клеймы запущу напряжение 24 вольта 9 ампер или 12 ампер сгорит плата или нет и ардуино всё равно будет работать или тоже сгорит?будут ли при этом токе работать двигателя очень нужен ответ,и если так подключать нельзя то как так сделать что бы 24 вольта подключить для управления моторами мало,плавно,и быстро через такую плату или есть другая такая же плата но по мощьнее
Вот характеристики мотор шилда:
L293D is a monolithic integrated, high voltage, high current, 4-channel driver?you can use DC motors and power supplies of up to 36 Volts, the L293D chip is also known as a type of H-Bridge?which is typically an electrical circuit that enables a voltage to be applied across a load in either direction to an output, e.g. motor.
2 interface for 5V Servo connected to the Arduino's high-resolution dedicated timer - no jitter.
Can drive 4 DC motors or 2 stepper motors or 2 Servo.
Up to 4 bi-directional DC motors with individual 8-bit speed selection.
Up to 2 stepper motors (unipolar or bipolar) with single coil, double coil or interleaved stepping.
4 H-Bridges: per bridge provides 0.6A (1.2A peak current) with thermal protection, can run motors on 4.5V to 36V DC.
Pull down resistors keep motors disabled during power-up.
2 external terminal power interface, for seperate logic/motor supplies.
Tested compatible for Arduino Mega, Diecimila & Duemilanove.
reset button.
Думаю платка погорит
дак я не понял,тут написано что до 36 вольт можно подключить а мне 24 к мотор шилд нужно подключить 9 ампер часа,а саму ардуино я подключу отдельно на 5 вольт,сниму перемычку,тогда не сгорит или всё равно мотор шилд сгорит,очень нужно знать???если сгорит тогда как перепоять что бы выдерживала,моторы у меня есть на 24 вольта 9 или их даже можно 20 ампер часа подключить только хочу через мотор шилд подключить большого робота нужно сделать для работы
Всем чайникам на память. По схеме приведенной выше видно, что при указанном положении перемычки на Motor Shield можно подавать питание 7-12 В через разъем на Motor Shield если моторы позволяют. Питание логики идет через стабилизатор на плате Arduino 5 В. Если Ваши моторы допускают питание менее 7 В или более 12 В тогда перемычка ставится в другое положение и питание на Arduino и Motor Shield подается раздельно на каждую плату. Питание логики по прежнему идет 5 В с платы контроллера. Сила тока через моторы не должна превышать 0,6 А по паспортным данным ключей, напряжение не более 36 В.
поставь на выход с шилда полевеки, например irf740 и питай моторы хоть от 220 вольт
На Motor Shield также используются вывод GND, который идет сразу же за D13, а если надо запитать плату Arduino от внешнего питания, то надо соединить еще вывод Vin.
Также подтверждаю, что указанная схема прекрасно работает с платой Arduino UNO.
Здравствуйте. Только начал знакомится с микроконтроллерами, очень нужно по работе. Подскачажите, ваш робот ездит без гироскопа? Просто поворот расчитывается от длины колёс?
без - на тот момент его не было
поворот просто длится определенное время
Это не точный угол получается? Насколько мне известно, гирокомпас довольно быстро сбивается. Как этого избежать, чтоб робот ехал по строгому углу?
не подскажу. гироскоп с акселерометром валяется пока без дела - так и не проверил
Добрый день. Эти колеса можно просто на обычную ось надеть? Внутри есть круглое отверстие для оси, или они только для "квадратного" привода?
Для прямоугольного, но можно рассверлить.
Я бы не рекомендовал именно эти колеса - качество плохое. Резина постоянно слазит. Пробовал приклеить клеем "Момент" - резину разъело.
УМОЛЯЮ ПОСМОТРИТЕ И ПОМОГИТЕ!!!!
СДЕЛАЛ НА ИК УПРАВЛЕНИИ( ИНФРАКРАСНОМ ) МАШИНКУ А КРУТЯТСЯ ТОЛЬКО ДВА ПЕРЕДНИХ КОЛЕСА(1 И 2), А ЗАДНИЕ(3 И 4) НЕТ. ДЕЛО НЕ В СБОРКЕ 100% Т.К. С ДРУГИМИ КОДАМИ РАБОТАЮТ ВСЕ КОЛЁСА (С КОДАМИ ГДЕ МАШИНКА ПРОСТО ЕЗДИТ ВОСЬМЁРКОЙ. ПОМОГИТЕ ПЖ!!!!
НА КОММЕНТАРИИ КОДЕ НЕ ОБРАЩАТЬ ВНИМАНИЯ Т.К. ОНИ ОТ ПРОШЛЫХ КОДОВ
#include "IRremote.h"
#include // Подключаем библиотеку для работы с Motor Shield L293D
IRrecv irrecv(10);
decode_results results;
// Придумываем имя моторам и объявляем клеммник к которому он подсоединен
AF_DCMotor my_motor1(1);
AF_DCMotor my_motor2(2);
AF_DCMotor my_motor3(3);
AF_DCMotor my_motor4(4);
void setup() // НАСТРОЙКИ
{
Serial.begin(9600);
irrecv.enableIRIn();
my_motor1.setSpeed(255);// задаем скорость вращения двигателя
my_motor2.setSpeed(255);// задаем скорость вращения двигателя
my_motor3.setSpeed(255);// задаем скорость вращения двигателя
my_motor4.setSpeed(255);// задаем скорость вращения двигателя
}
void loop() // ОСНОВНОЙ ЦИКЛ
{
if ( irrecv.decode(&results)) {
Serial.println(results.value, HEX);
if (results.value == 0x3D9AE3F7){
my_motor1.run(FORWARD);
my_motor2.run(FORWARD);
my_motor3.run(FORWARD);
my_motor4.run(FORWARD); //движение вперёд
delay(1000);
}
if (results.value == 0x449E79F){
my_motor1.run(FORWARD);
my_motor2.run(BACKWARD);
my_motor3.run(BACKWARD);
my_motor4.run(FORWARD); //поворот вправо
delay(1000);
}
if (results.value == 0x8C22657B){
my_motor1.run(BACKWARD);
my_motor2.run(FORWARD);
my_motor3.run(FORWARD);
my_motor4.run(BACKWARD); //поворот влево
delay(1000);
}
if (results.value == 0x1BC0157B){
my_motor1.run(BACKWARD);
my_motor2.run(BACKWARD);
my_motor3.run(BACKWARD);
my_motor4.run(BACKWARD); //поворот влево
delay(1000);
}
if (results.value == 0x488F3CBB){
my_motor1.run(RELEASE);
my_motor2.run(RELEASE);
my_motor3.run(RELEASE);
my_motor4.run(RELEASE); // назад
}
irrecv.resume();
}
}