ESP8266 NodeMCU с двигателем постоянного тока и драйвером L298N – управление скоростью и направлением (Arduino IDE)
Узнайте, как управлять направлением и скоростью двигателя постоянного тока с помощью платы ESP8266 NodeMCU и драйвера L298N Motor Driver. Мы начнём с объяснения того, как работает драйвер L298N. Затем мы покажем вам, как управлять скоростью и направлением двигателя постоянного тока с помощью драйвера L298N, используя ESP8266, запрограммированный в Arduino IDE.
Примечание: существует множество способов управления двигателем постоянного тока. Мы будем использовать драйвер L298N. Это руководство также совместимо с аналогичными модулями драйверов двигателей.
Содержание
В этом руководстве рассматриваются следующие темы:
Управление двигателями постоянного тока с помощью драйвера L298N
Управление двигателем постоянного тока с ESP8266 NodeMCU – скорость и направление
Вы используете ESP32? Следуйте этому руководству: ESP32 с двигателем постоянного тока и драйвером L298N – управление скоростью и направлением.
Необходимые условия
Перед тем как продолжить, убедитесь, что вы выполнили следующие предварительные условия:
ESP8266 с Arduino IDE
Мы будем программировать ESP8266 с помощью Arduino IDE. Поэтому убедитесь, что у вас установлена плата ESP8266. Следуйте следующему руководству, если вы ещё этого не сделали:
Альтернативно, вы также можете программировать ESP8266 с помощью VS Code и расширения PlatformIO:
Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
Плата ESP8266 – читайте Сравнение плат ESP8266
Источник питания: 4x 1.5 AA батарейки + держатель батареек, или лабораторный блок питания
Керамический конденсатор 0.1 мкФ (опционально)
1x ползунковый переключатель SPDT (опционально)
Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Знакомство с драйвером L298N
Существует несколько способов управления двигателем постоянного тока. Метод, который мы будем использовать здесь, подходит для большинства любительских двигателей, которым требуется напряжение 6В или 12В.
Мы будем использовать драйвер L298N, который может работать с токами до 3А при напряжении 35В. Кроме того, он позволяет управлять двумя двигателями постоянного тока одновременно, что идеально подходит для создания робота. Если вы используете другой драйвер двигателя, не волнуйтесь, большинство таких модулей работают аналогично и имеют одинаковые входные и выходные контакты.
Драйвер L298N показан на следующем рисунке:
Распиновка драйвера L298N
Давайте рассмотрим распиновку драйвера L298N и разберёмся, как он работает.
Драйвер имеет двухконтактный клеммный блок с каждой стороны для каждого двигателя. OUT1 и OUT2 слева и OUT3 и OUT4 справа.
OUT1: DC двигатель A, контакт +
OUT2: DC двигатель A, контакт –
OUT3: DC двигатель B, контакт +
OUT4: DC двигатель 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В, если перемычка установлена
Перемычка (Jumper): перемычка установлена – используется питание двигателя для питания микросхемы. Перемычка снята: вам нужно подать 5В на клемму +5V. Если вы подаёте более 12В, перемычку следует снять
Внизу справа расположены четыре входных контакта и две клеммы разрешения (enable). Входные контакты используются для управления направлением вращения двигателей, а контакты разрешения используются для управления скоростью каждого двигателя.
IN1: Вход 1 для двигателя A
IN2: Вход 2 для двигателя A
IN3: Вход 1 для двигателя B
IN4: Вход 2 для двигателя B
EN1: Контакт разрешения для двигателя A
EN2: Контакт разрешения для двигателя B
По умолчанию на контактах разрешения установлены перемычки. Вам нужно снять эти перемычки, чтобы управлять скоростью ваших двигателей. В противном случае они будут либо остановлены, либо вращаться на максимальной скорости.
Управление двигателями постоянного тока с помощью драйвера L298N
Теперь, когда вы понимаете, как работает драйвер двигателя, давайте посмотрим, как использовать его для управления двигателем постоянного тока.
Контакты разрешения (Enable)
Контакты разрешения работают как переключатель ВКЛ и ВЫКЛ для двигателей. Например:
Если вы отправляете сигнал HIGH на контакт enable 1, двигатель A готов к управлению и работает на максимальной скорости;
Если вы отправляете сигнал LOW на контакт enable 1, двигатель A выключается;
Если вы отправляете ШИМ-сигнал (PWM), вы можете управлять скоростью двигателя. Скорость двигателя пропорциональна скважности. Однако обратите внимание, что при малой скважности двигатели могут не вращаться, а издавать непрерывный жужжащий звук.
Сигнал на контакте 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 |
Рекомендуемое чтение: Сборка шасси машинки-робота для ESP32, ESP8266, Arduino и т.д.
Управление двигателем постоянного тока с ESP8266 NodeMCU – скорость и направление
Теперь, когда вы знаете, как работает драйвер L298N и как управлять двигателем постоянного тока, давайте создадим простой пример скетча для управления скоростью и направлением одного двигателя постоянного тока с помощью ESP8266.
Подключение двигателя постоянного тока к ESP8266 (драйвер L298N)
Двигатель, которым мы будем управлять, подключён к выходным контактам двигателя A, поэтому нам нужно подключить контакты ENABLEA, INPUT1 и INPUT2 драйвера двигателя к ESP8266. Следуйте приведённой ниже схеме для подключения двигателя постоянного тока и драйвера L298N к плате ESP8266 NodeMCU.
Мы используем GPIO, указанные в следующей таблице, для подключения к драйверу двигателя. Вы можете использовать любые другие подходящие GPIO, если соответственно измените код.
Драйвер LN298N |
Вход 1 |
Вход 2 |
Enable |
GND |
ESP8266 |
GPIO 12 (D6) |
GPIO 14 (D5) |
GPIO 13 (D7) |
GND |
Рекомендуемое чтение: Справочник по распиновке ESP8266: какие GPIO использовать?
Питание драйвера LN298N
Двигатель постоянного тока требует большого скачка тока для начала движения, поэтому двигатели должны питаться от внешнего источника питания. В качестве примера мы используем 4 батарейки AA, но вы можете использовать любой другой подходящий источник питания. В данной конфигурации вы можете использовать источник питания в диапазоне от 6В до 12В.
На схеме переключатель между держателем батареек и драйвером двигателя является опциональным, но он удобен для включения и выключения питания. Таким образом, вам не нужно постоянно подключать и отключать провода для экономии энергии. Существуют также держатели батареек, которые уже оснащены кнопкой.
Мы рекомендуем припаять керамический конденсатор 0.1 мкФ к положительной и отрицательной клеммам двигателя постоянного тока, как показано на схеме, чтобы сгладить любые скачки напряжения. (Примечание: двигатели также работают без конденсатора.)
Код: ESP8266 с двигателем постоянного тока – управление скоростью и направлением
Следующий код управляет скоростью и направлением двигателя постоянного тока. Этот код может не иметь практического применения в реальном мире, но является отличным примером для понимания того, как управлять скоростью и направлением двигателя постоянного тока с помощью ESP8266.
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-dc-motor-l298n-motor-driver-control-speed-direction/
*********/
// Motor A
int motor1Pin1 = 12;
int motor1Pin2 = 14;
int enable1Pin = 13;
// Setting minimum duty cycle
int dutyCycle = 60;
void setup() {
// sets the pins as outputs:
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
Serial.begin(115200);
// testing
Serial.print("Testing DC Motor...");
}
void loop() {
//Apply power to spin at maximum speed
digitalWrite(enable1Pin, HIGH);
// 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){
analogWrite(enable1Pin, dutyCycle);
Serial.print("Forward with duty cycle: ");
Serial.println(dutyCycle);
dutyCycle = dutyCycle + 5;
delay(500);
}
dutyCycle = 60;
}
Загрузите код на ваш ESP8266. Убедитесь, что выбрана правильная плата и COM-порт.
Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.
Объявление контактов двигателя
Сначала вы определяете GPIO, подключённые к драйверу двигателя. В данном случае вход 1 для двигателя A подключён к GPIO 12, вход 2 к GPIO 14, а контакт Enable к GPIO 13.
int motor1Pin1 = 12;
int motor1Pin2 = 14;
int enable1Pin = 13;
Установка минимальной скважности
Мы будем управлять скоростью двигателя, изменяя скважность ШИМ-сигнала. Мы установим минимальную скважность равной 60, потому что при меньших значениях двигатель не будет двигаться и будет издавать странный жужжащий звук.
int dutyCycle = 60;
setup()
В setup() вы начинаете с настройки контактов двигателя как выходов.
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
Мы инициализируем Serial Monitor для целей отладки:
Serial.begin(115200);
Движение двигателя постоянного тока вперёд
В loop() происходит движение двигателя. Код хорошо прокомментирован относительно того, что делает каждая часть кода.
Чтобы подать питание на двигатели и заставить их вращаться на максимальной скорости, нам нужно установить контакт enable в HIGH.
digitalWrite(enable1Pin, HIGH);
Чтобы двигатель вращался вперёд, вы устанавливаете контакт 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, либо установить оба контакта input 1 и input 2 в LOW. В этом примере мы устанавливаем оба входных контакта в LOW.
// Stop the DC motor
Serial.println("Motor stopped");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
delay(1000);
Управление скоростью двигателя постоянного тока
Чтобы управлять скоростью двигателя постоянного тока, нам нужно изменить скважность ШИМ-сигнала. Для этого используется функция analogWrite(), которая принимает в качестве аргументов GPIO-контакт и скважность, следующим образом.
analogWrite(enable1Pin, dutyCycle);
Рекомендуемое чтение: ESP8266 NodeMCU ШИМ с Arduino IDE (аналоговый выход)
В нашем примере у нас есть цикл while, который увеличивает скважность на 5 на каждой итерации.
// Move DC motor forward with increasing speed
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
while (dutyCycle <= 255){
analogWrite(enable1Pin, dutyCycle);
Serial.print("Forward with duty cycle: ");
Serial.println(dutyCycle);
dutyCycle = dutyCycle + 5;
delay(500);
}
Когда условие while больше не выполняется, мы снова устанавливаем скважность равной 60.
dutyCycle = 60;
Демонстрация
После загрузки кода на ESP8266 подайте питание на драйвер двигателя.
Двигатель начнёт вращаться в разных направлениях и с разными скоростями.
Заключение
В этом руководстве мы показали вам, как управлять направлением и скоростью двигателя постоянного тока с помощью ESP8266 и драйвера L298N. Подведём итог:
Для управления направлением вращения двигателя постоянного тока используются контакты input 1 и input 2;
Подайте LOW на input 1 и HIGH на input 2, чтобы двигатель вращался вперёд. Подайте питание в обратном порядке, чтобы двигатель вращался назад;
Для управления скоростью двигателя постоянного тока вы отправляете ШИМ-сигнал на контакт enable. Скорость двигателя постоянного тока пропорциональна скважности.
Надеемся, что это руководство оказалось для вас полезным.
Узнайте больше о ESP8266 с помощью наших ресурсов:
Спасибо за чтение.