Из этого туториала Вы узнаете, как управлять направлением и скоростью двигателя постоянного тока с помощью ESP32 и L298N Motor Driver. Мы кратко рассмотрим, как работает драйвер двигателя L298N. Затем покажем пример того, как управлять скоростью и направлением двигателя постоянного тока, используя ESP32 с Arduino IDE и драйвером двигателя L298N.
Примечание. Существует много способов управления двигателем постоянного тока. Мы будем использовать драйвер мотора L298N. Этот пример также совместим с аналогичными модулями драйвера двигателя.
Необходимые компоненты
- Плата ESP32 DOIT DEVKIT V1
- Двигатель постоянного тока.
- Драйвер двигателя L298N.
- Источник питания: 4 батарейки типа 1,5 АА или настольный источник питания.
- 2 керамических конденсатора емкостью 100 нФ (опция),
- 1 ползунковый переключатель SPDT (опция).
Описание L298N Motor Driver
Метод, который здесь используется, подходит для большинства двигателей, для работы которых требуется 6 В или 12 В.
Драйвер двигателя L298N может выдерживать напряжение до 3 А при 35 В. Это позволяет одновременно управлять двумя двигателями постоянного тока, что идеально подходит для создания робота.
Драйвер двигателя L298N показан на следующем рисунке:
Распиновка драйвера мотора L298N
Драйвер двигателя имеет две клеммные колодки на каждой стороне для каждого двигателя. OUT1 и OUT2 слева и OUT3 и OUT4 справа.
- OUT1: клемма A + двигателя постоянного тока
- OUT2: клемма A двигателя постоянного тока - клемма
- OUT3: клемма B + двигателя постоянного тока
- OUT4: клемма B двигателя постоянного тока
Внизу у вас есть три клеммных блока + 12В, GND и + 5В.
Клеммная колодка + 12 В используется для питания двигателей.
Клемма + 5V используется для питания микросхемы L298N.
Однако, если перемычка установлена, микросхема питается от источника питания двигателя, и не нужно подавать напряжение 5 В через клемму + 5 В.
Примечание: если вы хотите подать напряжение более 12 В, необходимо снять перемычку и подать 5 В на клемму + 5 В.
Несмотря на название клеммы + 12 В, с помощью настройки, вы можете подавать любое напряжение от 6 до 12 В. В этом уроке будут использоваться 4 батарейки АА 1,5 В, которые в совокупности выдают примерно 6 В. Можно использовать любой дугой источник питания.
Справа внизу у вас есть четыре входа и две клеммы. Входные контакты используются для управления направлением ваших двигателей постоянного тока, а активирующие контакты используются для управления скоростью каждого двигателя.
- IN1: вход 1 для двигателя A
- IN2: вход 2 для двигателя A
- IN3: вход 1 для двигателя B
- IN4: вход 2 для двигателя B
- EN1: контакт включения для двигателя A
- EN2: контакт включения для двигателя B
По умолчанию на джамперах есть перемычки. Нужно снять эти перемычки чтобы управлять скоростью двигателей.
Управление двигателями постоянного тока с L298N
- Если посылается сигнал HIGH на 1-й контакт, двигатель A включается на максимальной скорости;
- Если посылается сигнал LOW на 1-й контакт, двигатель A отключается;
- Если посылается сигнал ШИМ, можно контролировать скорость двигателя. Скорость двигателя пропорциональна рабочему циклу. При малых рабочих циклах двигатели могут не вращаться и издавать непрерывный гудящий звук.
Входные контакты управляют направлением вращения двигателей. Вход 1 и вход 2 управляют двигателем A, а входы 3 и 4 управляют двигателем B.
- Если подавать LOW на вход 1 и HIGH на вход 2, двигатель будет вращаться вперед, если подать питание наоборот: HIGH на вход 1 и LOW на вход 2, двигатель будет вращаться назад.
Управление двумя двигателями постоянного тока - идеально подходит для создания робота
Для построения робота-авто с двумя двигателями постоянного тока, они должны вращаться в определенных направлениях, чтобы робот двигался влево, вправо, вперед или назад.
Чтобы повернуть робота в одном направлении, нужно быстрее вращать противоположный двигатель. Например, чтобы робот повернул направо, включите двигатель слева и отключите двигатель справа.
Управление двигателем постоянного тока с ESP32 - скорость и направление
Схема
Двигатель, которым мы будем управлять, подключен к выходным контактам двигателя A, поэтому необходимо подключить контакты ENABLE A, INPUT1 и INPUT2 драйвера двигателя к ESP32.
Двигателю требуется большой ток для перемещения, поэтому он должен питаться от внешнего источника питания, а не от ESP32. В этой конфигурации можно использовать источник питания с напряжением от 6 до 12 В.
Рекомендуется припаять керамический конденсатор 0,1 мкФ к положительной и отрицательной клеммам двигателя постоянного тока, как показано на рисунке, чтобы сгладить любые скачки напряжения. (Примечание: двигатели также работают без конденсатора.)
Загрузка кода
Следующий код управляет скоростью и направлением двигателя постоянного тока. Это простой пример, чтобы лучше понять, как управлять скоростью и направлением двигателя постоянного тока с помощью ESP32.
/*********
*********/
// 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 LED PWM functionalitites
ledcSetup(pwmChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(enable1Pin, 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(pwmChannel, 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 и
пин включения к GPIO 14.
int motor1Pin1 = 27;
int motor1Pin2 = 26;
int enable1Pin = 14;
Настройка ШИМ для управления скоростью
Скорость будет пропорциональна рабочему циклу. Чтобы использовать ШИМ с ESP32, сначала нужно установить свойства сигнала ШИМ.
const int freq = 30000;
const int pwmChannel = 0;
const int resolution = 8;
int dutyCycle = 200;
В этом случае мы генерируем сигнал частотой 30000 Гц на канале 0 с 8-битным разрешением. Мы начинаем с коэффициента заполнения 200 (можно установить значение коэффициента заполнения от 0 до 255).
Для частоты, которая используется, когда применяются рабочие циклы меньше 200, двигатель не будет двигаться и издаст гудящий звук.
Примечание: свойства ШИМ, которые мы здесь используются, являются лишь примером. Мотор отлично работает с другими частотами.
SETUP
В SETUP() производится установка пинов в качестве выходов.
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
Затем вам нужно выбрать GPIO, с которого вы получите сигнал. Для этого используйте функцию ledcAttachPin(), которая принимает в качестве аргументов GPIO, где вы хотите получить сигнал, и канал, который генерирует сигнал. В этом примере мы получим сигнал в GP1 enable1Pin, который соответствует GPIO 14. Каналом, который генерирует сигнал, является pwmChannel, который соответствует каналу 0.
ledcAttachPin(enable1Pin, pwmChannel);
Перемещение двигателя постоянного тока вперед
В loop() двигатель движется. Чтобы двигать двигатель вперед, устанавливаете вход 1 на LOW, а вход 2 на HIGH. В этом примере двигатель вращается вперед в течение 2 секунд (2000 миллисекунд).
// Move the DC motor forward at maximum speed
Serial.println("Moving Forward");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
delay(2000);
Перемещение двигателя постоянного тока назад
Чтобы переместить двигатель постоянного тока назад, вы подаете питание на входные контакты двигателя наоборот. ВЫСОКИЙ для входа 1 и НИЗКИЙ для входа 2.
// Move DC motor backwards at maximum speed
Serial.println("Moving Backwards");
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
delay(2000);
Остановить двигатель постоянного тока
Чтобы остановить двигатель постоянного тока, вы можете либо установить на вывод разрешения LOW, либо установить на оба входа 1 и 2 входы LOW. В этом примере мы устанавливаем оба входа на LOW.
// Stop the DC motor
Serial.println("Motor stopped");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
delay(1000);
Управление скоростью двигателя постоянного тока
Чтобы контролировать скорость двигателя постоянного тока, нам нужно изменить коэффициент заполнения сигнала ШИМ. Для этого вы используете функцию ledcWrite (), которая принимает в качестве аргументов канал ШИМ, генерирующий сигнал (не выходной GPIO), и рабочий цикл, как показано ниже.
ledcWrite(pwmChannel, dutyCycle);
В нашем примере у нас есть цикл while, который увеличивает коэффициент заполнения на 5 в каждом цикле.
// Move DC motor forward with increasing speed
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
while (dutyCycle <= 255){
ledcWrite(pwmChannel, dutyCycle);
Serial.print("Forward with duty cycle: ");
Serial.println(dutyCycle);
dutyCycle = dutyCycle + 5;
delay(500);
}
Когда условие while больше не выполняется, мы снова устанавливаем рабочий цикл на 200.
dutyCycle = 200;
Добавить комментарий