В данной статье мы рассмотрим управление электродвигателем постоянного тока с помощью платы Arduino и драйвера двигателя L298N. Данный принцип управления электродвигателем находит широкое применение при создании различных проектов машин с дистанционным управлением, роботов и других устройствах.
Ранее на нашем сайте мы уже рассматривали применение драйвера двигателя L298N в следующих проектах:
- измерение скорости, пройденного пути и угла поворота с помощью Arduino и датчика LM393;
- объезжающий препятствия робот на Arduino;
- машина с автономным обнаружением линии на Raspberry Pi и OpenCV.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Модуль драйвера двигателя LM298N (купить на AliExpress).
- Электродвигатели постоянного тока, работающие от напряжения 12V (купить на AliExpress).
- Редукторы для электродвигателей.
- Потенциометр.
- Кнопка.
- Резистор.
- Макетная плата.
- Соединительные провода.
Общие принципы управления электродвигателями постоянного тока
Один из наиболее простых способов управления скоростью вращения электродвигателя постоянного тока с помощью микроконтроллера (микроконтроллерной платы) — это использование широтно-импульсной модуляции (ШИМ).
Что такое H-мост и как он работает
Как мы уже разобрались, скоростью вращения двигателя постоянного тока можно управлять изменяя коэффициент заполнения ШИМ сигнала. А чтобы управлять направлением вращения двигателя нам необходимо изменять направление тока, протекающего через двигатель. Один из самых распространенных способов сделать это — использование H-моста. Типовой H-мост содержит 4 переключающих элемента, транзистора или MOSFET, с двигателем в центре этой схемы. Таким образом, мы получаем конфигурацию наподобие английской буквы H. Управляя двумя переключателями одновременно, мы можем изменить направление протекания тока, таким образом, изменяя направление вращения двигателя.
То есть, используя комбинацию ШИМ и H-моста, мы можем получить полный контроль над двигателем — сможем управлять и направлением, и скоростью его вращения.
Драйвер двигателей L298N
Сейчас на рынке присутствует достаточно много разнообразных модулей драйверов двигателей, L298N — является одним из самых популярных среди них. Он представляет собой двойной H-мост, что позволяет ему управлять двумя электродвигателями постоянного тока одновременно. Модуль позволяет управлять двигателями с питающим напряжением от 5 до 35 В и пиковым током до 2 А.
Модуль L298N содержит две идентичные пары контактов для двигателей A и B, а также группу контактов, включающую Ground (общий провод/земля), питающее напряжение (VCC) для двигателей и контакт 5V, который может быть как входом, так и выходом.
Падение напряжения на модуле L298N составляет около 2 В. То есть если мы используем источник питания с напряжением 12 В, то напряжение на контактах, к которым подключаются двигатели, составляет около 10 В, то есть в данном случае мы не сможем достичь максимальной скорости вращения нашего двигателя постоянного тока, работающего от 12 В.
Схема проекта
Схема подключения модуля драйвера двигателей 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); } } |