Блог о программировании, электронике и рыбалке

Ведроид-мобиль — робот на Arduino — Часть 2. Подключаем Motor Shield

arduino роботВ этой статье я опишу процесс подключения к Arduino Mega 2560 платы Motor Shield, управление четырьмя электродвигателями и одним сервоприводом MG995.

В предыдущей статье я описал процесс сборки мотоплатформы для будущего Arduino робота и поделился планами на будущее.

Основная задача на сегодня - заставить Ведроид-мобиль двигаться и управлять сервоприводом.

Подключение Motor Shield к Arduino Mega 2560

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

arduino робот

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

arduino робот

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

arduino робот

Затем устанавливаем корпус для элементов питания и закрепляем его. У меня пока есть блок на 4 элемента.

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

Сразу выводим все провода через отверстия наверх.

arduino робот

Теперь закрепляем снаружи на верхней части платформы Arduino Mega 2560 и вставляем в нее наш Motor Drive Shield 2x L293D. Устанавливаем верхнюю часть платформы на место и закрепляем её болтами.

Теперь пришло время подключить двигатели к Motor Shield.

Передние двигатели я подключил к клемам M3 и M4. M4 - передний правый двигатель, M3 - передний левый. Arduino при креплении к верхней крышке стала наоборот, поэтому получился такой сдвиг.

arduino робот

M2 - задний правый двигатель. M1 - задний левый,  Соблюдайте полярность подключения электродвигателей

arduino робот

Подключаем сервопривод MG995.

arduino робот

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

Проблему решил путем подключения питающего провода сервопривода напрямую к источнику питания.

Подключаем провода питания к контактам на Motor Shield. На плюсовую клемму также подключаем провод от сервопривода

arduino робот

Прошу вас сразу обратить внимание на перемычку. Если ее убрать, то питание на контроллер Arduino придется подавать отдельно. На рисунке приведена схема, поясняющая электрические соединения шин питания контроллера Arduino и модуля Motor Shield.

arduino робот

Любуемся нашим шедевром.

arduino робот

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

Занятость портов Arduino при подключенном Motor Shield

После подключения Motor Shield к Arduino некоторые порты нам больше не доступны для работы, так как их использует Motor Shield.

arduino робот

Более подробно об этом расписано на сайте Arduino Shield List.

Пример скетча для работы Arduino с Motor Shield  реализующий управление четырьмя двигателями и одним сервоприводом

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

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

Предлагаю реализовать такой алгоритм:

  • Движение вперед в течении 5 секунд с поворотом сервы на угол 90 градусов
  • Поворот вправо в течении 2 секунд с поворотом сервы на угол 180 градусов
  • Движение назад в течении 5 секунд с поворотом сервы на угол 90 градусов
  • Поворот влево в течении 2 секунд с поворотом сервы на угол 0 градусов
  • Остановка двигателей на 3 секунды с поворотом сервы на угол 90 градусов

Задача поставлена - можно приступать.

Для начала нам необходимо установить библиотеку AFMotor.

afmotor.rar (9,2 КиБ, 3 689 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.

Присоединяйтесь к нашей группе в Telegram @GeekElectronics
  • keyboard_arrow_downВедроид-мобиль — робот на Arduino — Часть 2. Подключаем Motor Shield
    • Автор:
    • Миниатюра: Ведроид-мобиль — робот на Arduino — Часть 2. Подключаем Motor Shield
    • Рубрика: Arduino от А до Я
    • Обновлено: 06.02.2020
    • Комментариев: 40
    • Просмотров: 42 540
  • Оцените пожалуйста статью
    1 Star2 Stars3 Stars4 Stars5 Stars
    Загрузка...
  • Поделитесь с друзьями
Geek Electronics

Комментариев: 40

    • Avatar for source
      source™:

      Если просто интересует работа Arduino с дальномером, то ранее я уже описывал это.
      Если по роботу, то я еще не продумал алгоритм работы. Существующие варианты меня не полностью устраивают
      Скажу больше - я еще не решил какой алгоритм будет использоваться.
      Пока рассматриваю 4 варианта:
      - движение с объездом препятствий
      - прохождение лабиринта
      - аля робот пылесос - построение карты помещения и обход всей его площади (привязал сзади мокрую тряпку и пусть себе моет)
      - из точки А попасть в точку Б

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

      P.S. не забыть сделать сверку данных с дальномера с измерениями произведенными ранее - это на случай если робот застрянет (это пометка для меня - на будущее)

  • Avatar for source
    Олег:

    Отличный материал, я заказал шасси на китайском сайте и набор для начинающих с уно + мотор шилд, запаял провода на движки подключил шилду, шилд насадил прямо на ардуино загрузил прогу ииии и у машинки колесча стали коутиться в разные стороны) отчего она нелепо каталась взад-вперед, перенил клемы и все стало -собака в восторге)))

  • Avatar for source
    Дмитрий:

    а какой стабилизатор напряжения использовался на схеме

  • Avatar for source
    vernigor:

    Уточните, зачем использовать Arduino Mega 2560? Можно ли схему реализовать на другом контроллере, скажем Arduino Leonardo (на mega32)?

    • Avatar for source
      source:

      конкретно про Леонардо не скажу - в нем памяти мало. Если скетч влезет, то можно

  • Avatar for source
    yamaxa:

    Подскажите, не понял-для чего нужна серва- типа указатель-стрелка-куда будет ехать робот?

  • Avatar for source
    MeHecTPeJlb:

    Здравствуйте. Отличный проект! Собираю такого же, но пока на на 2 колесах. Вы запитали аппарат через клемник ext_pwr. Перемычка PWR в этом случае снимается? Какие элементы питания используете?

      • Avatar for source
        source:

        перемычка остается
        использую 4 штуки аккумуляторов 18650

        • Avatar for source
          MeHecTPeJlb:

          Спасибо за ответ! Очень вовремя. Жду как раз 8 штук 18650 на 5300 с зарядкой. Все остальное уже собрал. Как надолго хватает 4 аккумуляторов?

  • Avatar for source
    Petr:

    А можно подключить на один канал сразу два таких двигателя ( параллельно, чтобы работали идентично)?

    • Avatar for source
      source:

      конечно, если суммарный ток потребления двигателей не превышает максимально допустимый ток на канале Motor Shield

  • Avatar for source
    Александр:

    Добрый день!
    Вы в своём проекте используете 2шт. Motor Shield L293D?
    И можно ли всё это реализовать на Arduino UNO?
    Спасибо.

    • Avatar for source
      source:

      тут есть 2 проблемы: надо перепаивать выводы на втором шилде и переписывать библиотеку

        • Avatar for source
          source:

          не так понял ваш вопрос
          1 motor shield использую на 4 канала
          на UNO все должно пойти

          • Avatar for source
            Никита:

            Из шилдов можно "этажерку" собрать? и как использовать остальные выходы ардуино?
            P.S. Я очень чайник, прошу сильно не пинать) спасибо)

  • Avatar for source
    Никита:

    Из шилдов можно «этажерку» собрать, припаяв второй к первому (контакты)? И как использовать остальные выходы ардуино, если сверху все закрыл shield?
    P.S. Arduino приобрел совсем недавно, посему прошу сильно не пинать

    • Avatar for source
      source:

      Перепаяйте разъем, как это сделал я
      https://geekelectronics.org/arduino/vedroid-mobil-robot-na-arduino-chast-3-podklyuchaem-bluetooth.html

  • Avatar for source
    Алексей:

    сделал все по этой схеме, только на ардуино уно. Возникла такая проблема - моторы не крутятся. Питание подаю отдельно на ардуино и отдельно на моторшилд. На ардуино 4 батарейки на 1,5 вольта на моторшилд 2 последовательно соединенные кроны. Можете подсказать в чем проблема? Похоже не хватает питания. В инете нашел описание подобных ситуаций, но решения нигде нет.

        • Avatar for source
          Сыр:

          Просто кроны не подходят. К ардуино дайте 5 вольт с средней ёмкостью от акамулятора, можно меньше 5(у меня 4.8), а СИЛОВОЕ ПИТАНИЕ лучше акамулятор на 7 вольт примерно, купите на радиорынке или подобном магазине. Кроны используют в местах где нужен сильный и короткий сигнал(пульт управления), а как питание для двигателей это и дорого и не работает как надо.

  • Avatar for source
    саша:

    хотел спросить и что бы видео посмотреть по подробнее что бы подключить к моторам на 24 вольта 250 ватт эту плату драйвер двигателя и ардуино,если подключить к ардуино там я как понял ардуино питается 5 вольт ,подключаем на верх плату драйвер двигателя и потом если я в 2 эти клеймы запущу напряжение 24 вольта 9 ампер или 12 ампер сгорит плата или нет и ардуино всё равно будет работать или тоже сгорит?будут ли при этом токе работать двигателя очень нужен ответ,и если так подключать нельзя то как так сделать что бы 24 вольта подключить для управления моторами мало,плавно,и быстро через такую плату или есть другая такая же плата но по мощьнее

    • Avatar for source
      MeHecTPeJlb:

      Вот характеристики мотор шилда:
      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.
      Думаю платка погорит

  • Avatar for source
    саша:

    дак я не понял,тут написано что до 36 вольт можно подключить а мне 24 к мотор шилд нужно подключить 9 ампер часа,а саму ардуино я подключу отдельно на 5 вольт,сниму перемычку,тогда не сгорит или всё равно мотор шилд сгорит,очень нужно знать???если сгорит тогда как перепоять что бы выдерживала,моторы у меня есть на 24 вольта 9 или их даже можно 20 ампер часа подключить только хочу через мотор шилд подключить большого робота нужно сделать для работы

    • Avatar for source
      minotarius:

      Всем чайникам на память. По схеме приведенной выше видно, что при указанном положении перемычки на Motor Shield можно подавать питание 7-12 В через разъем на Motor Shield если моторы позволяют. Питание логики идет через стабилизатор на плате Arduino 5 В. Если Ваши моторы допускают питание менее 7 В или более 12 В тогда перемычка ставится в другое положение и питание на Arduino и Motor Shield подается раздельно на каждую плату. Питание логики по прежнему идет 5 В с платы контроллера. Сила тока через моторы не должна превышать 0,6 А по паспортным данным ключей, напряжение не более 36 В.

      • Avatar for source
        Диз:

        поставь на выход с шилда полевеки, например irf740 и питай моторы хоть от 220 вольт

  • Avatar for source
    Flint:

    На Motor Shield также используются вывод GND, который идет сразу же за D13, а если надо запитать плату Arduino от внешнего питания, то надо соединить еще вывод Vin.
    Также подтверждаю, что указанная схема прекрасно работает с платой Arduino UNO.

  • Avatar for source
    Алексей:

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

    • Avatar for source
      source™:

      без - на тот момент его не было
      поворот просто длится определенное время

      • Avatar for source
        Алексей:

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

        • Avatar for source
          source™:

          не подскажу. гироскоп с акселерометром валяется пока без дела - так и не проверил

  • Avatar for source
    Игорь:

    Добрый день. Эти колеса можно просто на обычную ось надеть? Внутри есть круглое отверстие для оси, или они только для "квадратного" привода?

    • Avatar for source
      source:

      Для прямоугольного, но можно рассверлить.
      Я бы не рекомендовал именно эти колеса - качество плохое. Резина постоянно слазит. Пробовал приклеить клеем "Момент" - резину разъело.

  • Avatar for source
    Эльдар:

    УМОЛЯЮ ПОСМОТРИТЕ И ПОМОГИТЕ!!!!
    СДЕЛАЛ НА ИК УПРАВЛЕНИИ( ИНФРАКРАСНОМ ) МАШИНКУ А КРУТЯТСЯ ТОЛЬКО ДВА ПЕРЕДНИХ КОЛЕСА(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();
    }
    }

Добавить комментарий

arrow_upward