Если вы планируете управлять электродвигателями постоянного тока, то простой драйвер двигателя L293D - один из самых подходящих помощников на эту роль. В данной статье мы рассмотрим принципы работы данного драйвера двигателя и как его подключить к плате Arduino.
Ранее на нашем сайте мы уже рассматривали проекты с применением драйвера двигателя L293D:
- подключение двигателя постоянного тока к микроконтроллеру AVR ATmega16;
- управление двигателем постоянного тока с помощью Arduino Uno;
- робот-пылесос на Arduino для автоматической уборки помещений;
- шилд драйвера двигателей на NodeMCU ESP8266 и микросхеме L293D.
Необходимые компоненты
- Плата Arduino UNO (купить на AliExpress).
- Драйвер двигателей L293D (купить на AliExpress, также данный драйвер двигателя можно купить в виде готового модуля).
- Электродвигатели постоянного тока - 2 шт.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Управление двигателем постоянного тока с помощью микроконтроллера
Для управления двигателями постоянного тока с помощью микроконтроллеров в современной схемотехнике используется ШИМ (широтно-импульсная модуляция) и устройства под названием H-мосты. ШИМ применяется для управления скоростью вращения вращения двигателя, а H-мосты - для управления направлением его вращения.
ШИМ для управления скоростью вращения двигателя
Для того чтобы изменить скорость вращения двигателя постоянного тока необходимо изменить амплитуду входного напряжения, подаваемого на двигатель. Распространенным методом для этого является ШИМ (широтно-импульсная модуляция). Регулируя величину цикла занятости/коэффициента заполнения (duty cycle) ШИМ можно изменять среднюю величину напряжения ШИМ и, следовательно, управлять скоростью вращения двигателя.
Чем больше значение коэффициента заполнения, тем выше среднее значение напряжения, подаваемого на двигатель постоянного тока (что приводит к более высокой скорости его вращения), а чем меньше значение коэффициента заполнения, тем ниже среднее значение напряжения, подаваемого на двигатель (что приводит к более низкой скорости его вращения).
Управление направлением вращения двигателя с помощью H-моста
Чтобы изменить направление вращения двигателя необходимо изменить полярность приложенного к нему напряжения. Один из наиболее простых способов сделать это - использование H-моста. По своей структуре H-мост состоит из 4-х переключателей (обычно это MOSFET транзисторы). Принцип действия H-моста наглядно показан на следующем видео.
Замкнув/включив два противоположных переключателя H-моста, мы можем изменить направление протекание тока, тем самым изменив направление вращения двигателя.
Микросхема драйвера двигателя L293D
L293D - это микросхема драйвера двигателей, способная управлять двумя двигателями постоянного тока, способными вращаться в обе стороны, либо одним шаговым двигателем. По принципу действия L293D представляет собой четырехкратный сильноточный полупроводниковый драйвер. Он способен управлять токами до 600 мА при напряжении от 4,5 В до 36 В. Также микросхема L293D может использоваться для управления индуктивными нагрузками, такими как реле, соленоиды, двигатели постоянного тока и биполярные шаговые двигатели.
L293D чаще всего используется для управления двигателями, но благодаря выходному драйверу тотемного полюса его можно использовать для управления соленоидами, четырьмя однонаправленными двигателями постоянного тока, двумя двунаправленными двигателями постоянного тока или одним шаговым двигателем.
Примечание . Обратите внимание, что L293 и L293D — это два разных варианта драйвера двигателя, микросхема L293 не имеет встроенных обратных диодов, поэтому вам необходимо добавить их в свою схему, если вы используете версию L293. В версии L293D все обратновходовые диоды подключены внутри микросхемы, поэтому для при использованииL293D вам не нужно подключать внешние диоды.
Распиновка микросхемы драйвера двигателя L293D
Распиновка микросхемы драйвера двигателя L293d показана на следующем рисунке. L293D имеет в общей сложности 16 контактов, которые можно подключить к микроконтроллерам и двигателям.
ENA, ENB - контакты 1 и 9 микросхемы. При подаче на эти контакты напряжения низкого уровня (low) двигатели перестают вращаться. Подавая на эти контакты ШИМ сигнал можно управлять скоростью вращения двигателей.
IN1, IN2, IN3, IN4 - контакты для управления направлением вращения двигателей. IN1 и IN2 управляют двигателем A, а IN3 и IN4 - двигателем B.
OUT1, OUT2, OUT3, OUT4 - выходные контакты драйвера L293D. OUT1 и OUT2 для управления первым двигателем, OUT3 и OUT4 - вторым. Данные контакты выдерживают ток до 600mA и на них можно подавать напряжение в диапазоне 5-36V.
GND - контакты 4,5 и 12,13 являются контактами общего провода (земли) данной микросхемы. Также данные контакты являются своеобразным радиатором (теплоотводом) микросхемы.
VCC1 - контакт для подачи питания на двигатели, на него можно подавать напряжение от 4.5V до 36V.
VCC2 - контакт для питания внутренней логики микросхемы, на него необходимо подавать 5V.
Часто задаваемые вопросы по микросхеме драйвера двигателя L293D
Почему мы используем L293D?
L293D предназначен для обеспечения двунаправленного управляющего тока до 600 мА при напряжении от 4,5 В до 36 В. Он способен управлять индуктивными нагрузками, такими как реле, соленоиды, двигатели постоянного тока и биполярные шаговые двигатели, а также другие высоковольтные устройства, токовые/высоковольтные нагрузки в приложениях с положительным питанием.
Как работает L293D?
Микросхема L293D получает сигналы от микропроцессора и передает соответствующий сигнал на двигатели. Она имеет два контакта подачи питания, один из которых используется для подачи тока для работы самой микросхемы L293D, а другой используется для подачи напряжения на двигатель.
Могу ли я подключить 4 двигателя к L293D?
Данный драйвер может управлять четырьмя соленоидами, четырьмя однонаправленными двигателями постоянного тока, двумя двунаправленными двигателями постоянного тока или одним шаговым двигателем. Микросхема L293D имеет диапазон подачи питания на подключенные устройства от 4,5 В до 36 В и способна выдавать пиковый выходной ток 1,2 А на канал, поэтому она очень хорошо работает с большинством современных двигателей.
Сколькими двигателями может управлять L293D?
L293D — это 16-контактная микросхема драйвера двигателя, которая может одновременно управлять двумя двигателями постоянного тока в любом направлении.
Как L293D управляет скоростью вращения двигателей?
L293D не имеет собственных возможностей управления скоростью вращения. Для этого вам необходимо использовать ШИМ от микроконтроллера или любого другого источника, способного управлять скоростью вращения.
Схема проекта
Схема подключения драйвера двигателя L293D к плате Arduino представлена на следующем рисунке.
Для нашей схемы мы будем использовать небольшой редукторный двигатель постоянного тока 3 В, поэтому мы будем питать микросхему драйвера от внешнего источника питания 5 В на ее выводе VCC1. Также нам необходимо подключить 5 В к выводу VCC2 микросхемы, которое будет питать ее внутреннюю логическую схему. Также мы подключили контакты 9 и 3 к контактам ENA и ENB Arduino, контакты 9 и 3 являются контактами ШИМ (PWM), поэтому мы сможем управлять скоростью вращения двигателя с помощью платы Arduino. Контакты 8,7,5,4 платы подключены к контактам IN1, IN2, IN3 и IN4 микросхемы драйвера. Наконец, контакты OUT1, OUT2, OUT3 и OUT4 подключаются к двигателям (в нашем проекте мы для простоты использовали один двигатель, хотя на представленной схеме продемонстрирована возможность подключения двух двигателей).
Объяснение кода программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе мы инициализируем используемые контакты.
1 2 3 4 |
// Motor A connections int ENA= 9; int IN1= 8; int IN2 = 7; |
Затем, в функции setup(), мы зададим режимы работы используемых контактов и на контакты, работающие в качестве цифровых выходов, подадим уровень low чтобы избежать ложного срабатывания двигателя при подаче питания на схему.
1 2 3 4 5 6 7 8 9 |
void setup() { pinMode(ENA, OUTPUT); // Set ENA as OUTPUT pinMode(IN1, OUTPUT); // Set IN1 as OUTPUT pinMode(IN2, OUTPUT); // Set IN2 as OUTPUT digitalWrite(IN1, LOW); // Make the Arduino Pin 8 Low digitalWrite(IN2, LOW); // Make the Arduino Pin 7 Low } |
Далее, в функции loop(), мы сначала дадим возможность двигателю вращаться, подав уровень high на контакт ENA с помощью функции analogWrite(), а затем подадим на IN1 уровень high, а на IN2 - уровень LOW, чтобы наш двигатель вращался по часовой стрелке.
1 2 3 4 5 |
// Rotate Motor Clockwise for 4 Seconds analogWrite(ENA, 255); // Enable the L293D IC digitalWrite(IN1, HIGH); // Make PIN 8 of the Arduino High digitalWrite(IN2, LOW); // Make PIN 7 of the Arduino LOW delay(4000); // wait for 4 Sec |
После этого мы подадим на IN1 LOW, а на IN2 - HIGH, чтобы двигатель вращался против часовой стрелки.
1 2 3 4 |
// Rotate Motor counter-Clockwise for 4 Seconds digitalWrite(IN1, LOW); // Make PIN 8 of the Arduino LOW digitalWrite(IN2, HIGH);// Make PIN 7 of the Arduino HIGH delay(4000); |
Затем подадим на контакты IN1 и IN2 драйвера уровень low - в результате этого двигатель должен остановиться.
1 2 3 4 |
// Stop Rotating the Motor digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); |
После этого снова заставим вращаться двигатель по часовой стрелке.
1 2 3 |
// Turn on motors digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); |
Но теперь в цикле мы будем постепенно увеличивать скорость вращения двигателя, подавая ШИМ сигнал на контакт ENA микросхемы L293D.
1 2 3 4 5 |
// Accelerate from minimum to maximum speed for (int i = 0; i < 256; i++) { analogWrite(ENA, i); delay(20); } |
А затем в цикле постепенно уменьшим коэффициент заполнения ШИМ сигнала со 100 до 0%.
1 2 3 4 5 |
// Decelerate from maximum speed to minimum for (int i = 255; i >= 0; --i) { analogWrite(ENA, i); delay(20); } |
Потом снова остановим двигатель.
1 2 3 4 |
// Now turn off motors digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); |
Тестирование работы проекта
На представленном ниже видео показана работа нашего проекта. Мы написали код программы таким образом, чтобы после определенной задержки двигатель менял свое направление вращения, а после этого изменялась скорость вращения двигателя, чтобы наглядно показать работу функции ШИМ.
Возможные проблемы с подключением драйвера двигателя L293D к Arduino
- Самая распространенная проблема, с которой вы можете столкнуться — это проблема с питанием. Рекомендуемое рабочее напряжение драйвера двигателя L293D составляет от 4,5 В до 36 В, поэтому при напряжении ниже этого драйвер двигателя не будет работать, а напряжение более 36 В, безусловно, повредит устройство.
- Еще одна распространенная проблема, обнаруженная в драйвере L293D, заключается в том, что когда вы включаете микросхему L293D, она начинает вращать двигатель или микросхема экспоненциально нагревается. Это явный признак повреждения микросхемы, которую следует немедленно заменить.
- Контакты микросхемы L293D устойчивы к напряжению +5 В, однако большее значение напряжение может вывести ее из строя.
- При работе с микросхемой L293D вам необходимо учитывать сопротивление обмотки двигателя, если сопротивление обмотки двигателя низкое, он будет потреблять больше тока, чем рассчитано, и это также может привести к необратимому повреждению устройства.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
// Motor A connections int ENA = 9; // L293D Enable Pin int IN1 = 8; // L293D IN1 Pin int IN2 = 7; // L293D IN2 Pin void setup() { pinMode(ENA, OUTPUT); // Set ENA as OUTPUT pinMode(IN1, OUTPUT); // Set IN1 as OUTPUT pinMode(IN2, OUTPUT); // Set IN2 as OUTPUT digitalWrite(IN1, LOW); // Make the Arduino Pin 8 Low digitalWrite(IN2, LOW); // Make the Arduino Pin 7 Low } void loop() { // Rotate Motor Clockwise for 4 Seconds analogWrite(ENA, 255); // Enable the L293D IC digitalWrite(IN1, HIGH); // Make PIN 8 of the Arduino High digitalWrite(IN2, LOW); // Make PIN 7 of the Arduino LOW delay(4000); // wait for 4 Se // Rotate Motor counter-Clockwise for 4 Seconds digitalWrite(IN1, LOW); // Make PIN 8 of the Arduino LOW digitalWrite(IN2, HIGH);// Make PIN 7 of the Arduino HIGH delay(4000); // Stop Rotating the Motor digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); // Turn on motors digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // Accelerate from minimum to maximum speed for (int i = 0; i < 256; i++) { analogWrite(ENA, i); delay(20); } // Decelerate from maximum speed to minimum for (int i = 255; i >= 0; --i) { analogWrite(ENA, i); delay(20); } // Now turn off motors digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); delay(1000); } |