Подключение драйвера двигателей Motor Shield L293D к плате Arduino

Рассмотрим сегодня примеры использования одного из самых популярных драйверов двигателей Motor Shield L293D, разработанного в свое время компанией Adafruit.

Драйвер позволяет одновременно управлять четырьмя коллекторными двигателя и двумя сервоприводами. Вместо четырех коллекторных двигателей можно подключить два шаговых биполярных двигателя или, к примеру, оставить два коллекторных двигателя и подключить один шаговый двигатель. Каждый силовой канал рассчитан на нагрузку в 0,6А, поэтому каждый ваш моторчик должен потреблять ток не более 0,6А. Данный Motor Shield полностью совмести с платами Arduino Mega 2560 и Arduino Uno, то есть вставляется в них прямо сверху. При использовании с другими платами соединение происходит стандартно с помощью проводов.

Стоит обратить внимание на один момент. Если вы будете использовать Motor Shield L293D вместе с платой Arduino Uno, он перекроет вам доступ ко всем пинам платы. Для подсоединения других датчиков вам придется поработать с паяльником, припаяв гребенку в предусмотренном месте на драйвере двигателей для доступа к аналоговым пинам (которые можно использовать как цифровые). Или вам придется подсоединять Motor Shield с помощью проводов для макетирования к плате Arduino Uno, чтобы оставить доступ к свободным пинам. Подумайте, нужны ли вам эти лишние телодвижения, связанные с дополнительной пайкой или кучей лишних проводов? Если вы читаете эту статью, значит, скорей всего находитесь на стадии обучения, и подобные неудобства будут лишние для вас. Поэтому повторюсь ещё раз и в этой статье. Если вы только начинаете изучать работу с микроконтроллерами, берите плату Arduino Mega 2560, чтобы случайно не столкнуться с ситуацией, когда вам не будет хватать пинов для подключения дополнительных датчиков.

И так приступим. Возьмем плату Arduino Mega 2560 и сверху аккуратно вставляем Motor Shield L293D, после чего подключаем двигатели как показано на рисунке.

Подключение драйвера двигателей Motor Shield L293D к плате Arduino

Обратите внимание на подключение питания к внешнему клеммнику (+M GND) и на замкнутый джампер PWR. При таком подключении, мы одновременно подаем энергию, как на силовую часть драйвера двигателей, так и на саму плату Ардуино. Подключая питание, не перепутайте плюс с минусом, так как на плате драйвера двигателей нет защитного диода, и подобные действия её быстро выведут из строя. Джампер PWR соединяет внешний клеммник драйвера двигателей с входом VIN платы Arduino, поэтому если вы подключите питание к разъему 2,1мм платы Arduino, вы также обеспечите совместное питание обоих плат.

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

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

Подключение драйвера двигателей Motor Shield L293D к плате Arduino - раздельное питание

Плату Arduino мы питаем через разъем 2,1мм (к примеру, от батарейки крона или от сети через блок питания). А силовую часть Motor Shield L293D мы питаем через клеммник (+M GND), при этом необходимо снять джампер PWR.

Двигатели мы подсоединяем к клеммникам M1, M2, M3, M4, как показано на рисунке. Между клеммниками M1 и M2, как и между клеммниками M3 и M4 расположены клеммники GND, предназначены они исключительно для удобства при подключении пяти проводных шаговых двигателей.

 

В совмещенном состоянии с платами Arduino Mega 2560 и Arduino Uno, пины плат задействованы следующим образом:

пины управления скоростью вращения двигателей

  • пин 11 платы Ардуино -> Мотор №1 / Шаговый двигатель №1
  • пин 3 платы Ардуино -> Мотор №2 / Шаговый двигатель №1
  • пин 5 платы Ардуино -> Мотор №3 / Шаговый двигатель №2
  • пин 6 платы Ардуино -> Мотор №4 / Шаговый двигатель №2

пины управления отвечающие за направление вращения двигателей

  • пин 4 платы Ардуино -> Мотор №1 / Шаговый двигатель №1
  • пин 7 платы Ардуино -> Мотор №2 / Шаговый двигатель №1
  • пин 8 платы Ардуино -> Мотор №3 / Шаговый двигатель №2
  • пин 12 платы Ардуино -> Мотор №4 / Шаговый двигатель №2

пины управления сервоприводами

  • пин 9 платы Ардуино - Сервопривод №1
  • пин 10 платы Ардуино - Сервопривод №2

 

С питанием разобрались, моторы подключили, перейдем к написанию простейшего скетча для управления нашими двигателями. Для начала нам необходимо скачать и установить специально разработанную библиотеку AFMotor.h предназначенную для работы с Motor Shield L293D. Разархивируем скачанный архив в папку libraries программы Arduino IDE, перезагружаем программу. Всё готово, библиотека установлена, можно приступать к написанию скетча.

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

#include <AFMotor.h> // Подключаем библиотеку для работы с Motor Shield L293D

// Придумываем имя мотору и объявляем клеммник к которому он подсоединен
AF_DCMotor my_motor1(1);

void setup() // НАСТРОЙКИ
  {
  my_motor1.setSpeed(250); // задаем скорость вращения двигателя
  }

void loop() // ОСНОВНОЙ ЦИКЛ
  {
  my_motor1.run(FORWARD); // вращаем вперед
  delay(5000); // делаем 5 секунд
  my_motor1.run(RELEASE); // остановка
  delay(3000); // делаем 3 секунды
  my_motor1.run(BACKWARD); // вращаем назад
  delay(5000); // делаем 5 секунд
  my_motor1.run(RELEASE); // остановка
  delay(3000); // делаем 3 секунды
  }

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

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

#include <AFMotor.h> // Подключаем библиотеку для работы с Motor Shield L293D

// Придумываем имена моторам и объявляем клеммники к которым они подсоединены
AF_DCMotor my_motor1(1);
AF_DCMotor my_motor2(2);
AF_DCMotor my_motor3(3);
AF_DCMotor my_motor4(4);


// Чтобы код не получался слишком громоздким, лучше всего создавать функции
// для тех действий, которые будут применяться в нашем скетче неоднократно
void set_speed(int speed) // функция СКОРОСТЬ
  {
  my_motor1.setSpeed(speed);
  my_motor2.setSpeed(speed);
  my_motor3.setSpeed(speed);
  my_motor4.setSpeed(speed);
  }

void motor_forward() // функция ПЕРЕДНИЙ ХОД
  {
  my_motor1.run(FORWARD);
  my_motor2.run(FORWARD);
  my_motor3.run(FORWARD);
  my_motor4.run(FORWARD);
  delay(100);
  }

void motor_backward() // функция ЗАДНИЙ ХОД
  {
  my_motor1.run(BACKWARD);
  my_motor2.run(BACKWARD);
  my_motor3.run(BACKWARD);
  my_motor4.run(BACKWARD);
  delay(100);
  }

void motor_release() // функция ОСТАНОВКА ДВИГАТЕЛЕЙ
  {
  my_motor1.run(RELEASE);
  my_motor2.run(RELEASE);
  my_motor3.run(RELEASE);
  my_motor4.run(RELEASE);
  delay(100);
  }

void setup() // НАСТРОЙКИ
  {
  // Посмотрите насколько проще работать с кодом после создания функций
  // нам нужна всего лишь одна строка вызова нужной функции, с помощью которой мы дадим команду сразу четырем двигателям 
  set_speed(200); // вызываем функцию СКОРОСТЬ - устанавливаем начальную скорость двигателей
  }

void loop() // ОСНОВНОЙ ЦИКЛ
  {
  motor_forward(); // вызываем функцию ПЕРЕДНИЙ ХОД
  delay(5000); // выполняем функцию ПЕРЕДНИЙ ХОД в течение 5 секунд
  motor_release(); // вызываем функцию ОСТАНОВКИ ДВИГАТЕЛЕЙ
  delay(3000); // держим остановленными двигатели в течении 3 секунд
  set_speed(255); // вызываем функцию СКОРОСТЬ - увеличиваем скорость двигателей до 255
  motor_backward(); // вызываем функцию ЗАДНИЙ ХОД
  delay(5000); // выполняем функцию ЗАДНИЙ ХОД в течение 5 секунд
  motor_release(); // вызываем функцию ОСТАНОВКИ ДВИГАТЕЛЕЙ
  delay(3000); // держим остановленными двигатели в течении 3 секунд
  }

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

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

 

Управление шаговым двигателем с помощью драйвера двигателей Motor Shield L293D

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

Управление биполярным шаговым двигателем с помощью драйвера двигателей Motor Shield L293D

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

#include <AFMotor.h> // Подключаем библиотеку для работы с Motor Shield L293D

// Придумываем имя шаговому двигателю (например: stepper_motor),
// указываем количество шагов для полного оборота (48) и номер порта к которому подсоединен шаговик
// порт №1 - клеммы M1 и M2, порт №2 клеммы M3 и M4
AF_Stepper stepper_motor(48, 2);

void setup() // НАСТРОЙКИ
  {
  // можем ничего здесь не писать, если нет необходимости задать какие-то предварительные настройки
  // но сама функция void setup() должна присутствовать в коде в любом случае, даже пустая
  }

int s; // объявляем переменную, которая нам будет служить в качестве счетчика шагов (имя переменной можете придумать любое)

void loop() // ОСНОВНОЙ ЦИКЛ
  {
  // Делаем вращение в одном направлении
  // SINGLE - тип шага
  for (s=0; s<48; s++)
    {
    stepper_motor.step(1, FORWARD, SINGLE);
    delay(50);
    }
  // Делаем вращение в другом направлении  
  for (s=48; s!=0; s--)
    {
    stepper_motor.step(1, BACKWARD, SINGLE);
    delay(50);
    }  
  }

Здесь мы рассмотрели пример управления шаговым двигателем с помощью библиотеки AFMotor. На самом деле существует библиотека AccelStepper предоставляющая гораздо большие возможности (управление методом полушага, удобное управление одновременно несколькими шаговыми двигателям, контроль темпов разгона и т.д). Библиотеку AccelStepper мы рассматривали на примере управления униполярным шаговым двигателем в статье "Подключение униполярного шагового двигателя 28BYJ-48 через драйвер ULN2003". Для первых более серьезных ваших проектов с применением шаговых двигателей, рекомендую обратить внимание именно на работу с этой библиотекой. Но, так как в этой статье речь идет о драйвере двигателей Motor Shield L293D и библиотеке AFMotor.h, написанной специально для него, не будет заострять здесь внимание на других библиотеках.

 

Управление сервоприводом с помощью драйвера двигателей Motor Shield L293D

Нам осталось рассмотреть принцип подключения сервоприводов к драйверу двигателей Motor Shield L293D

Подключение сервоприводов к драйверу двигателей Motor Shield L293D

Как видим тут все просто. Черный провод к минусу, красный к плюсу и желтый к пину S. Штырьки S отвечающие за управление сервоприводами соединены с выходами платы Arduino следующим образом:

пин 9 платы Ардуино - Сервопривод №1
пин 10 платы Ардуино - Сервопривод №2

Если вы подключаете к драйверу двигателей Motor Shield L293D только сервоприводы, смысла в раздельном питании нет, так как сервоприводы в любом случаю будут брать питание от платы Ардуино.

Управление сервоприводами стандартное с помощью библиотеки Servo.h, с примером которого вы можете познакомиться в статье "Подключение к плате Arduino cервопривода TowerPro SG90".

 

 

 

Комментарии  

 
0 # Дмитрий 26.11.2016 18:46
Почему нельзя управлять шилдом без библиотеки? а если можно то как ?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
+1 # Volt0m 26.11.2016 19:25
Цитирую Дмитрий:
Почему нельзя управлять шилдом без библиотеки? а если можно то как ?


Библиотеки просто упрощают процесс программирования часто используемых задач. Вы можете не подключать библиотеки, но в таком случае у вас должны быть более глубокие познания в программировании и придется написать намного больше строк кода для выполнения аналогичной задачи.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
0 # iniren 14.12.2016 10:54
Здравствуйте!
Подскажите, а какое максимальное кол-во драйверов двигателей, которое можно подключить к одной плате Arduino? Один?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
+2 # Volt0m 14.12.2016 15:24
Цитирую iniren:
Здравствуйте!
Подскажите, а какое максимальное кол-во драйверов двигателей, которое можно подключить к одной плате Arduino? Один?

Здравствуйте! Драйвер двигателей Motor Shield L293D сделан как Arduino совместимый, то есть надевается на плату Ардуино сверху, поэтому именно в таком виде он может использоваться только один.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
+1 # Алексей 07.02.2017 20:28
Спасибо, моторчик закрутился
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
0 # Иван 08.02.2017 21:57
Здравствуйте!
Подскажите, пробую ваш скетч который на 4 мотора.
И как-то не понятно работают, когда 2 мотора подключены то всё ок вперёд-назад 1-2 двиг спереди крутятся. когда все 4 подключены то вперёд крутятся все, назад только 2 причём 3-4.
Когда скидываю провод например с 4-го то вперёд крутятся все 3, назад только 1-2.
скинул для проверки с 3-го, тоже самое 1,2,4 вперёд вместе, назад только 1-2.
с чем может быть связанно?
подключаю с 3 по 8 и 11,12 пины на шилде ив точно такой-же последовательности на Ардуино НАНО в D c 3 по 8 и 11,12.
что не так может быть?(
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
+1 # VoltOm 09.02.2017 09:11
Здравствуйте! Тут явно дело не в скетче. Питания на 4 мотора и микроконтроллер хватает? Посмотрите лучше что, как и каким питанием обеспечили. На моторы отдельно питание подаете (то есть на сам Motor Shield L293D) или с той же линии, с которой питаете микроконтроллер? Запустите каждый мотор отдельно, если по отдельности они правильно выполняют скетч и правильно в итоге крутятся, значит о правильности подключения к нужным пинам управления и к самому скетчу сомнений может не оставаться. Смотрите, что и как подключили и хватает ли питания.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
0 # Dmitriy 24.02.2017 13:20
Можно ли на этой плате собрать "рисовалку"?
Ось X и Y шаговые двигатели, "Z" сервопривод. Какие библиотеки подключать и какими программами можно управлять?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
0 # VoltOm 27.02.2017 14:09
Можно. Для этого есть достаточно много программ типа Type 3, Mach3, 3D Builder, Artcam и других. Это довольно обширная тема скорей другой статьи и в рамках комментариев её не раскрыть.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
0 # Никитич 01.03.2017 18:12
здравствуйте можете подсказать как должен выглядеть скетч в котором можно будет управлять двигателями по команде с Монитор порта?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
0 # VoltOm 01.03.2017 19:14
Цитирую Никитич:
здравствуйте можете подсказать как должен выглядеть скетч в котором можно будет управлять двигателями по команде с Монитор порта?


int comand = 0;

void setup()
{
Serial.begin(9600);
}

void loop()
{
if (Serial.available() > 0)
{
comand = Serial.read();
Serial.print("I received: ");
Serial.write(comand);
Serial.println();
}
}

Serial.avaliable() - проверяет состояние буфера
Serial.read() - читает байты из буфера

В итоге все что вы будете вводить в монитор порта, будет записываться в переменную comand. Далее работаете с условиями в зависимости от того, какую информацию вы послали через монитор порта. Например:

if (comand == start)
{
my_motor1.run(FORWARD); // вращаем вперед
delay(5000); // делаем 5 секунд
}

В данном случае, если мы посылаем слово "start" через монитор порта, двигатель будет вращаться вперед 5 секунд. И так далее, создаем условия для каждой команды которую задумали.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
-1 # Андрей 31.05.2017 09:15
А к каким портам подсоединяется сервопривод если мы его к этому шилду подключаем?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
-1 # VoltOm 31.05.2017 15:07
В статье же написано

пины управления сервоприводами:

пин 9 платы Ардуино - Сервопривод №1
пин 10 платы Ардуино - Сервопривод №2
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
-3 # Виталий 23.08.2017 14:03
Друзья, понимаю, что вопрос дурацкий, но нигде не могу найти внятного ответа. Ситуация: есть Ардуино Уно, к нему через микроконтроллер (отдельная плата) ULN2003 подключен шаговый двигатель 28BYj-48. Вопрос такой: На ноуте я напишу скетч для работы этого двигателя, так вот - я потом могу отсоединить плату Ардуино Уно от микроконтроллера ULN2003, к которому подключен двигатель, т.е. Ардуино Уно выполнил свою работу, как программатор - и может быть удален (т.е. дальнейшая работа будет выглядеть так: UNL2003 - двигатель)? Или работать все это добро может только совместно (Ардуино - ULN2003 - двигатель)?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 
 
-1 # Игорь 03.02.2018 20:21
А как к Motor Shield L293D и плате Arduino добавить ещё радиомодуль NRF24L01? Это возможно?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
 

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

Защитный код
Обновить

шт.
Корзина пуста
Принимаем к оплате: