Управление двигателями постоянного тока с помощью микросхемы L293D и Arduino
Если вы планируете собрать двухколёсного робота, одно из первых, что вам нужно выяснить — как управлять двигателями постоянного тока. Это самый простой тип двигателей в использовании — просто подайте напряжение, и они начнут вращаться.
Итак, если двигателям постоянного тока нужно только напряжение, почему нельзя подключить их напрямую к Arduino? Проблема в токе. Двигатели обычно потребляют гораздо больше тока, чем выходные выводы Arduino рассчитаны выдержать. Если вы попытаетесь управлять двигателем напрямую от вывода Arduino, вы рискуете перегрузить его — и, возможно, повредить микроконтроллер.
Вот тут на помощь приходит драйвер двигателя L293D. Он выступает в роли моста между Arduino и двигателем. Вы отправляете небольшие управляющие сигналы с Arduino, а L293D безопасно обрабатывает более высокий ток, необходимый двигателю. Все довольны — двигатель получает нужную мощность, а Arduino остаётся в безопасности.
В этом руководстве вы узнаете всё, что нужно знать об использовании L293D с Arduino. Мы покажем, как управлять скоростью и направлением вращения двух двигателей постоянного тока с помощью простого кода и понятной схемы подключения.
Независимо от того, строите ли вы робота или просто экспериментируете с двигателями, это руководство поможет вам сдвинуться с места — в буквальном смысле. Начнём!
Основы управления двигателями
Прежде чем изучать драйвер двигателя L293D, важно понять два ключевых концепта:
Схема H-моста — позволяет управлять направлением вращения двигателя
ШИМ (широтно-импульсная модуляция) — помогает управлять скоростью двигателя постоянного тока
Управление направлением с помощью H-моста
Как уже упоминалось, двигатели постоянного тока — самые простые в использовании! Если вы подключите батарею к двигателю постоянного тока, он будет вращаться в одном направлении. Если поменять провода местами, он начнёт вращаться в другом направлении. Но вы не можете каждый раз физически менять провода, когда хотите изменить направление. Вот тут-то и пригодится H-мост!
H-мост — это специальная схема с четырьмя электронными переключателями, расположенными в форме буквы «H», с двигателем посередине.
Включая и выключая эти переключатели в определённом порядке, можно заставить ток протекать через двигатель в одном или противоположном направлении. Этот хитрый приём позволяет управлять направлением вращения двигателя без физического переключения проводов.
Анимация ниже показывает, как работает H-мост.
Управление скоростью с помощью ШИМ (широтно-импульсной модуляции)
Когда на двигатель постоянного тока подаётся фиксированное напряжение, он вращается с постоянной скоростью. Если вы хотите изменить скорость, нужно изменить напряжение. Более высокое напряжение заставляет двигатель вращаться быстрее, а более низкое — медленнее.
Однако постоянно менять напряжение физически не очень практично. Вот тут на помощь приходит ШИМ, или широтно-импульсная модуляция.
ШИМ — это умный способ управления средней мощностью, подаваемой на двигатель. Вместо фиксированного напряжения, ШИМ быстро включает и выключает напряжение очень короткими импульсами.
«Ширина» каждого включённого импульса, также называемая коэффициентом заполнения, определяет, как долго напряжение «включено» в каждом цикле.
Если напряжение включено большую часть времени (более широкий импульс), двигатель получает более высокое среднее напряжение и вращается быстрее.
Если напряжение выключено большую часть времени (более узкий импульс), двигатель получает более низкое среднее напряжение и вращается медленнее.
На изображении ниже показано, как разные коэффициенты заполнения создают разные средние напряжения, которые в свою очередь влияют на скорость двигателя.
Микросхема драйвера двигателей L293D
L293D — это очень популярная и широко используемая интегральная микросхема (ИС), предназначенная в первую очередь для управления индуктивными нагрузками, такими как двигатели постоянного тока, шаговые двигатели, реле и соленоиды. Она работает как усилитель тока — принимает слаботочные управляющие сигналы от микроконтроллера (например, Arduino) и усиливает их до более высоких уровней тока и напряжения, необходимых для работы двигателей.
В основе L293D лежат две отдельные схемы H-моста. Помните, как H-мост помогает управлять направлением вращения двигателя постоянного тока? Поскольку L293D имеет два таких моста, она может одновременно управлять двумя разными двигателями постоянного тока. Вы даже можете объединить эти два H-моста для управления биполярным шаговым двигателем.
Питание
L293D довольно гибкая в плане питания. Она может работать с широким диапазоном напряжений — от 4,5 В до 36 В, что означает совместимость с многими различными типами двигателей.
Кроме того, L293D способна обрабатывать приличный ток. Каждый канал L293D может обеспечить до 600 миллиампер (мА) непрерывного тока и выдерживать кратковременные пики до 1,2 ампер (А) на канал. Хотя эти цифры могут показаться небольшими, на самом деле они идеально подходят для большинства маленьких двигателей, которые обычно используют любители и студенты в своих проектах.
Встроенные защитные диоды
Одна из самых важных функций безопасности L293D — это встроенные защитные диоды (также называемые обратными или рекуперативными диодами). Они очень важны при работе с индуктивными нагрузками, такими как двигатели.
Когда вы внезапно отключаете двигатель, его магнитное поле коллапсирует. Это может послать импульс напряжения обратно в схему. Это обратное напряжение (называемое обратной ЭДС, или электродвижущей силой) может повредить ваш микроконтроллер или другие чувствительные компоненты.
Защитные диоды в L293D дают этому опасному обратному току безопасный путь для протекания, защищая как саму микросхему, так и остальную часть вашей схемы.
Термозащита
L293D также включает встроенную термозащиту. Это означает, что если микросхема перегреется — например, потому что двигатель потребляет слишком много тока или микросхема плохо охлаждается — L293D автоматически отключит свои выходы на время для предотвращения повреждения. Как только микросхема остынет до безопасной температуры, она автоматически возобновит работу.
Технические характеристики
Вот технические характеристики:
Напряжение питания двигателя |
4,5 В – 36 В |
|---|---|
Напряжение логического входа |
5 В |
Выходной ток на канал |
600 мА |
Пиковый выходной ток на канал |
1,2 А |
Для получения дополнительной информации обратитесь к техническому описанию ниже.
Распиновка микросхемы L293D
L293D имеет 16 выводов.
Давайте рассмотрим каждую группу выводов, чтобы понять, что они делают и как работают.
Выводы питания
L293D требует два отдельных источника питания:
VSS (VCC1) питает внутреннюю логическую схемотехнику микросхемы. Этот вывод нужно подключить к источнику питания 5 В.
VS (VCC2) подаёт питание на двигатели. Вы можете подключить любое напряжение от 4,5 В до 36 В, в зависимости от используемого двигателя.
Выводы GND — это общие выводы заземления. Микросхема имеет четыре вывода заземления, и все они соединены внутренне. Эти выводы выполняют две важные функции — они обеспечивают общую точку отсчёта для всех напряжений в схеме и, что не менее важно, помогают отводить тепло.
Двигатели являются индуктивными нагрузками и могут потреблять значительные токи, особенно при запуске, смене направления или под большой нагрузкой. Этот высокий ток, протекающий через внутренние транзисторы H-моста, генерирует тепло. Множественные выводы заземления действуют как тепловые каналы, позволяя теплу, выделяемому внутри микросхемы, отводиться к медным дорожкам на печатной плате (PCB), к которым они припаяны. Подключая эти выводы к большому медному полигону или плоскости заземления на PCB, сама плата действует как радиатор, помогая предотвратить перегрев микросхемы и переход в режим термозащитного отключения.
Выходные выводы двигателей
Это выводы, к которым вы непосредственно подключаете двигатели постоянного тока.
Выводы OUT1 и OUT2 подключаются к первому двигателю (двигатель A), а выводы OUT3 и OUT4 — ко второму двигателю (двигатель B). Вы можете подключить любой двигатель постоянного тока, работающий от 5 до 36 В.
Выводы управления направлением
Эти выводы управляют направлением вращения двигателей, включая и выключая внутренние переключатели H-моста:
Микросхема имеет два вывода управления направлением для каждого двигателя. Выводы IN1 и IN2 управляют направлением вращения двигателя A, а выводы IN3 и IN4 управляют направлением вращения двигателя B.
Устанавливая различные комбинации сигналов HIGH или LOW на этих выводах, вы можете заставить двигатели вращаться вперёд, назад или остановиться. Таблица ниже показывает, как это работает:
IN1 |
IN2 |
Направление вращения |
|---|---|---|
Low(0) |
Low(0) |
Двигатель ВЫКЛ |
High(1) |
Low(0) |
Вперёд |
Low(0) |
High(1) |
Назад |
High(1) |
High(1) |
Двигатель ВЫКЛ |
Выводы управления скоростью
Выводы ENA и ENB управляют скоростью вращения двигателей.
На самом деле эти выводы работают как простые переключатели вкл/выкл. Когда вы подаёте HIGH на один из них, соответствующий двигатель включается и вращается на полной скорости в соответствии с сигналами направления. Когда вы подаёте LOW, двигатель полностью отключается и не вращается.
Но эти выводы могут делать больше, чем просто включать и выключать двигатели. Подавая сигнал ШИМ (широтно-импульсной модуляции) на ENA или ENB, вы можете управлять скоростью каждого двигателя.
С помощью ШИМ вы быстро включаете и отключаете двигатель много раз в секунду. Ключевым является коэффициент заполнения, то есть как долго сигнал остаётся включённым в каждом цикле. Более длительное время включения означает, что двигатель активен большую часть цикла, поэтому он вращается быстрее. Более короткое время включения означает, что он включён меньше времени за цикл, поэтому вращается медленнее.
Подключение двигателей к Arduino с помощью L293D
Теперь пора подключить драйвер двигателя L293D к Arduino и управлять двигателями!
Начнём с подключения питания к двигателям. В этом эксперименте мы используем TT-двигатели, которые обычно применяются в двухколёсных роботах. Эти двигатели обычно хорошо работают при напряжении от 3 В до 6 В. Поскольку мы будем использовать внешний источник питания 5 В для наших двигателей, нам нужно подключить это напряжение 5 В к выводу VS (VCC2) микросхемы L293D.
Далее нам нужно запитать логическую схемотехнику внутри L293D. Для этого подключим вывод VSS (VCC1) к выходу 5 В на Arduino.
Также очень важно убедиться, что всё имеет общее заземление — это означает подключение вывода заземления Arduino к заземлению внешнего источника питания двигателей, а также подключение вывода GND на L293D к заземлению Arduino.
После подключения питания можно подключить управляющие выводы. L293D имеет два вывода разрешения (ENA и ENB) и четыре входных вывода (IN1, IN2, IN3 и IN4). Мы подключим ENA к выводу 9 Arduino, IN1 к выводу 8, IN2 к выводу 7, IN3 к выводу 5, IN4 к выводу 4 и ENB к выводу 3.
Стоит отметить, что выводы 9 и 3 на Arduino поддерживают ШИМ, что означает, что позже мы сможем использовать их для управления скоростью двигателей с помощью ШИМ.
Наконец, подключим двигатели. Возьмите один двигатель и подключите его два провода к выводам OUT1 и OUT2 на L293D. Затем подключите второй двигатель к выводам OUT3 и OUT4. Не беспокойтесь о том, какой провод к какому выводу подключать — вы можете поменять их местами, если двигатель вращается в противоположном направлении от ожидаемого, так как единственно правильного способа подключения не существует.
Вот краткая справочная таблица подключений:
| L293D Motor Driver | Arduino | |
| GND | GND | |
| ENA | 9 | |
| IN1 | 8 | |
| IN2 | 7 | |
| IN3 | 5 | |
| IN4 | 4 | |
| ENB | 3 |
На изображении ниже показана полная схема подключения.
Пример кода Arduino
Вот простой скетч Arduino, который показывает, как управлять направлением и скоростью вращения двух двигателей постоянного тока с помощью драйвера двигателя L293D и Arduino. Для этого скетча не нужны специальные библиотеки — он использует только базовые встроенные функции Arduino IDE.
Этот пример — отличный способ получить практический опыт использования L293D для управления скоростью и направлением двигателей. Как только вы разберётесь в этом, вы сможете легко создавать более сложные системы управления двигателями, подобные тем, что используются в простых роботах или машинках на дистанционном управлении.
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
// This function lets you control spinning direction of motors
void directionControl() {
// Set motors to maximum speed
digitalWrite(enA, HIGH);
digitalWrite(enB, HIGH);
// Turn on motor A & B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// This function lets you control speed of the motors
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
При разгоне или замедлении двигателя постоянного тока вы можете услышать гудение, особенно при низких значениях ШИМ. Не беспокойтесь — это совершенно нормально. Это происходит потому, что двигателям постоянного тока требуется определённое минимальное напряжение для начала вращения, и при низких значениях ШИМ напряжение может быть недостаточным для плавной работы двигателя.
Объяснение кода:
В начале скетча мы определяем, какие выводы Arduino будут использоваться для управления двигателем A и двигателем B. Для двигателя A у нас есть вывод разрешения (позволяющий управлять его скоростью через ШИМ) и два вывода управления направлением. Аналогично для двигателя B — вывод разрешения и два вывода управления направлением.
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
В функции setup() мы настраиваем все шесть выводов управления двигателями как выходы, поскольку отправляем сигналы с Arduino на L293D. Также мы убеждаемся, что оба двигателя выключены, устанавливая все выводы управления направлением в LOW. Это гарантирует, что двигатели не начнут внезапно вращаться при включении Arduino.
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
В функции loop() мы вызываем две пользовательские функции с задержкой в одну секунду между ними. Первая функция — directionControl(), вторая — speedControl().
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
Давайте разберём, что делает каждая из этих функций.
Функция directionControl() демонстрирует, как управлять направлением вращения обоих двигателей. Сначала мы устанавливаем максимально возможную скорость для обоих двигателей, подавая HIGH на оба вывода разрешения. Затем мы отправляем необходимые сигналы на выводы управления направлением, чтобы оба двигателя A и B вращались вперёд. После двух секунд вращения в этом направлении мы меняем сигналы на выводах направления, что заставляет оба двигателя вращаться в обратном направлении ещё две секунды. В конце мы останавливаем двигатели, устанавливая все выводы управления направлением в LOW.
void directionControl() {
// Set motors to maximum speed
digitalWrite(enA, HIGH);
digitalWrite(enB, HIGH);
// Turn on motor A & B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
Функция speedControl() демонстрирует, как управлять скоростью двигателей с помощью ШИМ. Сначала мы устанавливаем выводы управления направлением так, чтобы оба двигателя вращались в одном направлении. Затем мы медленно увеличиваем скорость двигателей, постепенно повышая значение ШИМ от 0 до 255. Это имитирует эффект разгона. Как только двигатели достигнут максимальной скорости, мы выполняем обратный процесс — медленно уменьшаем значение ШИМ с 255 до 0, что заставляет двигатели постепенно замедляться и останавливаться. В конце мы останавливаем двигатели, устанавливая все выводы управления направлением в LOW.
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
Альтернативы L293D
Микросхема драйвера двигателя L293D была впервые представлена ещё в 1986 году. Несмотря на то, что она существует уже давно, L293D по-прежнему широко используется сегодня. Это потому, что она проста в использовании, очень надёжна и доступна по низкой цене, что делает её популярным выбором — особенно в школах, любительских проектах и для начинающих электронщиков.
Однако сейчас существуют более современные альтернативы с улучшенными характеристиками для определённых ситуаций. Например, L298N — это похожий драйвер двигателя, но способный обрабатывать более высокие токи, что полезно при питании более мощных двигателей. DRV8833 основан на технологии MOSFET, что делает его более эффективным и позволяет ему оставаться холоднее. Ещё один хороший вариант — TB6612FNG, который предлагает лучшую эффективность, работает при более низких напряжениях и имеет меньший размер корпуса, что делает его идеальным для компактных или работающих от батарей проектов.
Тем не менее, L293D по-прежнему отличный выбор для обучения, экспериментов или работы с маленькими роботами и другими маломощными приложениями. Если вам интересны другие драйверы, у нас уже есть руководства по каждому из них. Можете изучить их и выбрать тот, который лучше всего подходит для вашего проекта.