В данной статье мы рассмотрим управление электродвигателем постоянного тока с помощью платы Arduino и драйвера двигателя L298N. Данный принцип управления электродвигателем находит широкое применение при создании различных проектов машин с дистанционным управлением, роботов и других устройствах.
Ранее на нашем сайте мы уже рассматривали применение драйвера двигателя L298N в следующих проектах:
- измерение скорости, пройденного пути и угла поворота с помощью Arduino и датчика LM393;
- объезжающий препятствия робот на Arduino;
- машина с автономным обнаружением линии на Raspberry Pi и OpenCV.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Модуль драйвера двигателя LM298N (купить на AliExpress).
- Электродвигатели постоянного тока, работающие от напряжения 12V (купить на AliExpress).
- Редукторы для электродвигателей.
- Потенциометр.
- Кнопка.
- Резистор.
- Макетная плата.
- Соединительные провода.
Общие принципы управления электродвигателями постоянного тока
Один из наиболее простых способов управления скоростью вращения электродвигателя постоянного тока с помощью микроконтроллера (микроконтроллерной платы) - это использование широтно-импульсной модуляции (ШИМ).
С помощью ШИМ можно регулировать средний уровень напряжения, подаваемый на управляемое электронное устройство. Данный средний уровень напряжения зависит от коэффициента заполнения (duty cycle) ШИМ сигнала, представляющий собой отношение активного состояния сигнала (состояние ON) ко всему периоду сигнала. Более подробно про это можно прочитать в статье про использование ШИМ в плате Arduino.
Таким образом мы можем, к примеру, подключить ШИМ контакт Arduino к затвору MOSFET транзистора и управлять скоростью вращения двигателя, изменяя коэффициент заполнения ШИМ сигнала, как показано на следующем рисунке.
Что такое H-мост и как он работает
Как мы уже разобрались, скоростью вращения двигателя постоянного тока можно управлять изменяя коэффициент заполнения ШИМ сигнала. А чтобы управлять направлением вращения двигателя нам необходимо изменять направление тока, протекающего через двигатель. Один из самых распространенных способов сделать это - использование H-моста. Типовой H-мост содержит 4 переключающих элемента, транзистора или MOSFET, с двигателем в центре этой схемы. Таким образом, мы получаем конфигурацию наподобие английской буквы H. Управляя двумя переключателями одновременно, мы можем изменить направление протекания тока, таким образом, изменяя направление вращения двигателя.
То есть, используя комбинацию ШИМ и H-моста, мы можем получить полный контроль над двигателем - сможем управлять и направлением, и скоростью его вращения.
Драйвер двигателей L298N
Сейчас на рынке присутствует достаточно много разнообразных модулей драйверов двигателей, L298N - является одним из самых популярных среди них. Он представляет собой двойной H-мост, что позволяет ему управлять двумя электродвигателями постоянного тока одновременно. Модуль позволяет управлять двигателями с питающим напряжением от 5 до 35 В и пиковым током до 2 А.
Модуль L298N содержит две идентичные пары контактов для двигателей A и B, а также группу контактов, включающую Ground (общий провод/земля), питающее напряжение (VCC) для двигателей и контакт 5V, который может быть как входом, так и выходом.
Модуль содержит встроенный регулятор 5V, который можно включить или выключить с помощью джампера. Если питающее напряжение двигателя не превышает 12V, мы можем задействовать регулятор 5V и в этом случае мы можем использовать контакт 5V в качестве выхода и запитывать с его помощью, к примеру, плату Arduino. Но если питающее напряжение двигателя более 12V мы должны с помощью джампера отключить этот контакт поскольку такие напряжения могут вывести из строя встроенный регулятор 5V. В этом случае мы можем использовать контакт 5V в качестве входа и подключить его к источнику питания 5V, от которого будет запитываться наш модуль.
Падение напряжения на модуле L298N составляет около 2 В. То есть если мы используем источник питания с напряжением 12 В, то напряжение на контактах, к которым подключаются двигатели, составляет около 10 В, то есть в данном случае мы не сможем достичь максимальной скорости вращения нашего двигателя постоянного тока, работающего от 12 В.
Контакты Enable A и Enable B модуля L298N используются для включения и регулировки скорости вращения двигателей. Если на этих контактах присутствует джампер, то двигатель будет включен и вращаться с максимальной скоростью, если мы удалим джампер, то мы можем подключить эти контакты в выходам ШИМ микроконтроллера (платы) и с помощью сигнала ШИМ регулировать скорость вращения двигателей. Если мы подключим один из этих контактов к общему проводу/земле (Ground), то соответствующий двигатель будет отключен.
Контакты Input 1 и Input 2 модуля L298N используются для задания направления вращения двигателя A, а контакты inputs 3 и 4 - для задания направления вращения двигателя B. С помощью данных контактов мы фактически управляем переключателями H-мостов внутри микросхемы L298N. Если на input 1 уровень LOW, а на input 2 уровень HIGH, то двигатель A будет вращаться в прямом направлении и наоборот, если на input 1 уровень HIGH, а на input 2 уровень LOW, то двигатель будет вращаться в обратном направлении. Если на обоих этих контактах одинаковый уровень, LOW или HIGH, двигатель остановится. Аналогично и для контактов inputs 3 и 4 и двигателя B.
Схема проекта
Схема подключения модуля драйвера двигателей L298N к плате Arduino представлена на следующем рисунке.
В нашем проекте мы будем управлять скоростью вращения двигателя с помощью потенциометра, а изменять направление его вращения с помощью кнопки.
Исходный код программы (скетча)
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 |
/* Arduino DC Motor Control - PWM | H-Bridge | L298N - Example 01 by Dejan Nedelkovski, www.HowToMechatronics.com */ #define enA 9 #define in1 6 #define in2 7 #define button 4 int rotDirection = 0; int pressed = false; void setup() { pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(button, INPUT); // Set initial rotation direction digitalWrite(in1, LOW); digitalWrite(in2, HIGH); } void loop() { int potValue = analogRead(A0); // считываем значение с потенциометра int pwmOutput = map(potValue, 0, 1023, 0 , 255); // приводим считанное с потенциометра значение к диапазону 0-255 analogWrite(enA, pwmOutput); // подаем ШИМ сигнал на контакт Enable модуля L298N // Read button - Debounce (борьба с дребезгом контактов кнопки) if (digitalRead(button) == true) { pressed = !pressed; } while (digitalRead(button) == true); delay(20); // если кнопка нажата - изменяем направление вращения двигателя if (pressed == true & rotDirection == 0) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); rotDirection = 1; delay(20); } // если кнопка нажата - изменяем направление вращения двигателя if (pressed == false & rotDirection == 1) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); rotDirection = 0; delay(20); } } |