ESP32 с драйвером двигателя L298N - управление скоростью и направлением двигателя постоянного тока

Из этого туториала Вы узнаете, как управлять направлением и скоростью двигателя постоянного тока с помощью 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;

 

Добавить комментарий

Restricted HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.