ESP32 с двигателем постоянного тока и драйвером L298N – управление скоростью и направлением
В этом руководстве показано, как управлять направлением и скоростью двигателя постоянного тока с помощью ESP32 и драйвера L298N. Сначала мы кратко рассмотрим, как работает драйвер L298N. Затем мы покажем вам пример управления скоростью и направлением двигателя постоянного тока с помощью драйвера L298N, используя ESP32, запрограммированный в Arduino IDE.
Обновлено 11 июня 2024
Примечание: существует множество способов управления двигателем постоянного тока. Мы будем использовать драйвер L298N. Это руководство также совместимо с аналогичными модулями драйверов двигателей.
Вы используете ESP8266? Следуйте этому руководству: ESP8266 NodeMCU with DC Motor and L298N Motor Driver – Control Speed and Direction (Arduino IDE)
Предварительные требования
Перед тем как приступить, убедитесь, что выполнены следующие предварительные требования:
ESP32 с Arduino IDE
Мы будем программировать ESP32 с помощью Arduino IDE. Поэтому убедитесь, что у вас установлено дополнение ESP32. Следуйте следующему руководству, если вы ещё этого не сделали:
Также вы можете программировать ESP32, используя VS Code и расширение PlatformIO:
Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
Плата ESP32 DOIT DEVKIT V1 – обзор и сравнение плат разработки ESP32
Источник питания: 4 батарейки AA 1,5 В или лабораторный блок питания
Керамический конденсатор 100 нФ (необязательно)
Переключатель SPDT (необязательно)
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Знакомство с драйвером L298N
Существует несколько способов управления двигателем постоянного тока. Метод, который мы будем использовать здесь, подходит для большинства любительских двигателей, которым для работы требуется 6 В или 12 В.
Мы собираемся использовать драйвер L298N, который способен работать с токами до 3 А при напряжении 35 В. Кроме того, он позволяет управлять двумя двигателями постоянного тока одновременно, что идеально для создания робота.
Драйвер двигателя L298N показан на следующем рисунке:
Распиновка драйвера L298N
Давайте рассмотрим распиновку драйвера L298N и разберёмся, как он работает.
Драйвер двигателя имеет двухконтактные клеммные колодки с каждой стороны для каждого двигателя. OUT1 и OUT2 слева и OUT3 и OUT4 справа.
OUT1: клемма + двигателя A постоянного тока
OUT2: клемма – двигателя A постоянного тока
OUT3: клемма + двигателя B постоянного тока
OUT4: клемма – двигателя B постоянного тока
Внизу расположена трёхконтактная клеммная колодка с +12V, GND и +5V. Клемма +12V используется для питания двигателей. Клемма +5V используется для питания микросхемы L298N. Однако, если перемычка установлена, микросхема питается от источника питания двигателей, и вам не нужно подавать 5 В через клемму +5V.
Важно: несмотря на название клеммы +12V, вы можете подавать любое напряжение от 5 В до 35 В (рекомендуемый диапазон от 6 В до 12 В).
Примечание: если вы подаёте более 12 В, необходимо снять перемычку и подать 5 В на клемму +5V.
В этом руководстве мы будем использовать 4 батарейки AA 1,5 В, которые в сумме дают примерно 6 В, но вы можете использовать любой другой подходящий источник питания. Например, вы можете использовать лабораторный блок питания для тестирования этого руководства.
Итого:
+12V: клемма +12V – сюда подключается источник питания двигателей
GND: GND источника питания
+5V: подайте 5 В, если перемычка снята. Работает как выход 5 В, если перемычка установлена
Перемычка: перемычка установлена – микросхема питается от источника питания двигателей. Перемычка снята: необходимо подать 5 В на клемму +5V. Если вы подаёте более 12 В, необходимо снять перемычку
В правом нижнем углу расположены четыре входных контакта и два контакта включения (enable). Входные контакты используются для управления направлением вращения двигателей, а контакты включения – для управления скоростью каждого двигателя.
IN1: Вход 1 для двигателя A
IN2: Вход 2 для двигателя A
IN3: Вход 1 для двигателя B
IN4: Вход 2 для двигателя B
EN1: Контакт включения для двигателя A
EN2: Контакт включения для двигателя B
По умолчанию на контактах включения установлены перемычки. Вам нужно снять эти перемычки, чтобы управлять скоростью двигателей. В противном случае они будут либо остановлены, либо будут вращаться на максимальной скорости.
Управление двигателями постоянного тока с помощью L298N
Теперь, когда вы знакомы с драйвером L298N, давайте рассмотрим, как его использовать для управления двигателями постоянного тока.
Контакты включения (Enable)
Контакты включения работают как переключатель ВКЛ/ВЫКЛ для ваших двигателей. Например:
Если вы подаёте сигнал HIGH на контакт enable 1, двигатель A готов к управлению и работает на максимальной скорости;
Если вы подаёте сигнал LOW на контакт enable 1, двигатель A выключается;
Если вы подаёте ШИМ-сигнал, вы можете управлять скоростью двигателя. Скорость двигателя пропорциональна коэффициенту заполнения. Однако обратите внимание, что при малых коэффициентах заполнения двигатели могут не вращаться и издавать непрерывный жужжащий звук.
Сигнал на контакте Enable |
Состояние двигателя |
|---|---|
HIGH |
Двигатель включён |
LOW |
Двигатель выключен |
ШИМ (PWM) |
Двигатель включён: скорость пропорциональна коэффициенту заполнения |
Входные контакты (Input)
Входные контакты управляют направлением вращения двигателей. Вход 1 и вход 2 управляют двигателем A, а входы 3 и 4 управляют двигателем B.
Если подать LOW на вход 1 и HIGH на вход 2, двигатель будет вращаться вперёд;
Если подать питание наоборот: HIGH на вход 1 и LOW на вход 2, двигатель будет вращаться назад. Двигатель B можно контролировать таким же способом, подавая HIGH или LOW на входы 3 и 4.
Например, для двигателя A логика следующая:
Направление |
Вход 1 |
Вход 2 |
Enable 1 |
|---|---|---|---|
Вперёд |
0 |
1 |
1 |
Назад |
1 |
0 |
1 |
Стоп |
0 |
0 |
0 |
Управление 2 двигателями – идеально для робота
Если вы хотите собрать робота-машинку с двумя двигателями постоянного тока, они должны вращаться в определённых направлениях, чтобы робот двигался влево, вправо, вперёд или назад.
Например, если вы хотите, чтобы ваш робот двигался вперёд, оба двигателя должны вращаться вперёд. Чтобы двигаться назад, оба должны вращаться назад.
Чтобы повернуть робота в одном направлении, нужно, чтобы противоположный двигатель вращался быстрее. Например, чтобы повернуть робота направо, включите двигатель слева и отключите двигатель справа. В следующей таблице показаны комбинации состояний входных контактов для направлений робота.
Направление |
Вход 1 |
Вход 2 |
Вход 3 |
Вход 4 |
|---|---|---|---|---|
Вперёд |
0 |
1 |
0 |
1 |
Назад |
1 |
0 |
1 |
0 |
Вправо |
0 |
1 |
0 |
0 |
Влево |
0 |
0 |
0 |
1 |
Стоп |
0 |
0 |
0 |
0 |
Рекомендуемое чтение: Build Robot Car Chassis Kit for ESP32, ESP8266, Arduino, etc…
Управление двигателем постоянного тока с ESP32 – скорость и направление
Теперь, когда вы знаете, как управлять двигателем постоянного тока с помощью драйвера L298N, давайте создадим простой пример для управления скоростью и направлением одного двигателя постоянного тока.
Подключение двигателя постоянного тока к ESP32 (драйвер L298N)
Двигатель, которым мы будем управлять, подключён к выходным контактам двигателя A, поэтому нам нужно подключить контакты ENABLEA, INPUT1 и INPUT2 драйвера к ESP32. Следуйте следующей схеме для подключения двигателя постоянного тока и драйвера L298N к ESP32.
Драйвер L298N |
Input 1 |
Input 2 |
Enable |
GND |
|---|---|---|---|---|
ESP32 |
GPIO 27 |
GPIO 26 |
GPIO 14 |
GND |
Мы используем GPIO, указанные в таблице выше, для подключения к драйверу. Вы можете использовать любые другие подходящие GPIO, при условии, что вы соответственно измените код. Узнайте больше о GPIO ESP32: Справочное руководство по распиновке ESP32.
Питание драйвера L298N
Двигатель постоянного тока требует большого скачка тока для начала движения, поэтому двигатели должны питаться от внешнего источника, отдельного от ESP32. В качестве примера мы используем 4 батарейки AA, но вы можете использовать любой другой подходящий источник питания. В этой конфигурации вы можете использовать источник питания с напряжением от 6 В до 12 В.
Переключатель между батарейным отсеком и драйвером необязателен, но очень удобен для включения и отключения питания. Таким образом, вам не нужно постоянно подключать и отключать провода для экономии энергии.
Мы рекомендуем припаять керамический конденсатор 0,1 мкФ к положительной и отрицательной клеммам двигателя постоянного тока, как показано на схеме, чтобы сгладить возможные скачки напряжения. (Примечание: двигатели также работают без конденсатора.)
Код: ESP32 с двигателем постоянного тока – управление скоростью и направлением
Следующий код управляет скоростью и направлением двигателя постоянного тока. Этот код может не иметь практического применения в реальном мире, но является отличным примером для понимания того, как управлять скоростью и направлением двигателя постоянного тока с помощью ESP32.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-dc-motor-l298n-motor-driver-control-speed-direction/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/
// Motor A
int motor1Pin1 = 27;
int motor1Pin2 = 26;
int enable1Pin = 14;
// Setting PWM properties
const int freq = 30000;
const int pwmChannel = 0;
const int resolution = 8;
int dutyCycle = 200;
void setup() {
// sets the pins as outputs:
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
// configure LEDC PWM
ledcAttachChannel(enable1Pin, freq, resolution, pwmChannel);
Serial.begin(115200);
// testing
Serial.print("Testing DC Motor...");
}
void loop() {
// Move the DC motor forward at maximum speed
Serial.println("Moving Forward");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
delay(2000);
// Stop the DC motor
Serial.println("Motor stopped");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
delay(1000);
// Move DC motor backwards at maximum speed
Serial.println("Moving Backwards");
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
delay(2000);
// Stop the DC motor
Serial.println("Motor stopped");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
delay(1000);
// Move DC motor forward with increasing speed
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
while (dutyCycle <= 255){
ledcWrite(enable1Pin, dutyCycle);
Serial.print("Forward with duty cycle: ");
Serial.println(dutyCycle);
dutyCycle = dutyCycle + 5;
delay(500);
}
dutyCycle = 200;
}
Загрузите код на ESP32. Убедитесь, что выбрана правильная плата и COM-порт. Давайте рассмотрим, как работает этот код.
Объявление контактов двигателя
Сначала вы определяете GPIO, к которым подключены контакты двигателя. В данном случае вход 1 для двигателя A подключён к GPIO 27, вход 2 к GPIO 26, а контакт Enable к GPIO 14.
int motor1Pin1 = 27;
int motor1Pin2 = 26;
int enable1Pin = 14;
Настройка свойств ШИМ для управления скоростью
Как мы видели ранее, вы можете управлять скоростью двигателя постоянного тока, подавая ШИМ-сигнал на контакт enable драйвера L298N. Скорость будет пропорциональна коэффициенту заполнения. Для использования ШИМ с ESP32 необходимо сначала задать свойства ШИМ-сигнала.
const int freq = 30000;
const int pwmChannel = 0;
const int resolution = 8;
int dutyCycle = 200;
В данном случае мы генерируем сигнал частотой 30000 Гц на канале 0 с 8-битным разрешением. Мы начинаем с коэффициента заполнения 200 (вы можете задать значение от 0 до 255).
Для используемой нами частоты, при коэффициентах заполнения менее 200, двигатель не будет вращаться и будет издавать странный жужжащий звук. Поэтому мы установили начальный коэффициент заполнения 200.
Примечание: свойства ШИМ, которые мы задаём здесь, – это всего лишь пример. Двигатель нормально работает и на других частотах.
setup()
В функции setup() вы начинаете с настройки контактов двигателя как выходов.
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
Вам нужно настроить контакт LEDC с ранее определёнными свойствами ШИМ с помощью функции ledcAttachChannel(), которая принимает в качестве аргументов контакт, которым вы хотите управлять, частоту, разрешение и канал ШИМ:
// configure LEDC PWM
ledcAttachChannel(enable1Pin, freq, resolution, pwmChannel);
Движение двигателя вперёд
В функции loop() происходит движение двигателя. Код хорошо прокомментирован о том, что делает каждая часть. Для движения двигателя вперёд вы устанавливаете контакт input 1 в LOW и контакт input 2 в HIGH. В этом примере двигатель вращается вперёд в течение 2 секунд (2000 миллисекунд).
// Move the DC motor forward at maximum speed
Serial.println("Moving Forward");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
delay(2000);
Движение двигателя назад
Для вращения двигателя в обратном направлении подайте питание на входные контакты двигателя наоборот. HIGH на вход 1 и LOW на вход 2.
// Move DC motor backwards at maximum speed
Serial.println("Moving Backwards");
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
delay(2000);
Остановка двигателя
Чтобы остановить двигатель, вы можете либо установить контакт enable в LOW, либо установить оба входных контакта 1 и 2 в LOW. В этом примере мы устанавливаем оба входных контакта в LOW.
// Stop the DC motor
Serial.println("Motor stopped");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
delay(1000);
Управление скоростью двигателя
Для управления скоростью двигателя постоянного тока нужно изменить коэффициент заполнения ШИМ-сигнала. Для этого используется функция ledcWrite(), которая принимает в качестве аргументов GPIO, выводящий сигнал, и коэффициент заполнения:
ledcWrite(enable1Pin, dutyCycle);
В нашем примере есть цикл while, который увеличивает коэффициент заполнения на 5 в каждой итерации.
// Move DC motor forward with increasing speed
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
while (dutyCycle <= 255){
ledcWrite(enable1Pin, dutyCycle);
Serial.print("Forward with duty cycle: ");
Serial.println(dutyCycle);
dutyCycle = dutyCycle + 5;
delay(500);
}
Когда условие while больше не выполняется, мы снова устанавливаем коэффициент заполнения равным 200.
dutyCycle = 200;
Заключение
В этом руководстве мы показали вам, как управлять направлением и скоростью двигателя постоянного тока с помощью ESP32 и драйвера L298N. Подведём итоги:
Для управления направлением вращения двигателя используются контакты input 1 и input 2;
Подайте LOW на вход 1 и HIGH на вход 2 для вращения двигателя вперёд. Подайте питание наоборот, чтобы двигатель вращался назад;
Для управления скоростью двигателя подайте ШИМ-сигнал на контакт enable. Скорость двигателя пропорциональна коэффициенту заполнения.
Надеемся, что это руководство было для вас полезным.
Источник: ESP32 with DC Motor and L298N Motor Driver – Control Speed and Direction