Motor Shield L293D + Arduino

Подключение драйвера двигателей 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, после чего подключаем двигатели как показано на рисунке.


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

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


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

#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


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

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

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

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

Комментарии

Популярные сообщения из этого блога

Перенос Armbian на SSD

Установка Home Assistants на Orange pi

Радиореле 220В 433МГц c кодировкой сигнала eV1527