Цель этого урока - объяснить, как управлять двигателем постоянного тока и изменять скорость вращения, с помощью ESP8266 и драйвера MX1508. Подробное описание драйвера можно посчитать в моем уроке по подключению MX1508 к Arduino.
Поскольку цифровые выводы микроконтроллера могут подавать только ограниченный ток (в случае ESP8266, максимум 12 мА), мы не можем напрямую использовать их для управления двигателем постоянного тока. Поэтому будем использовать драйвер MX1508, чтобы обеспечить ток, необходимый для вращения двигателя.
Схема подключения для данного примера очень проста и ее можно увидеть на рисунке ниже. Мы просто используем цифровой вывод ESP8266 для управления MX1508 и, следовательно,двигателем.
Наверное, понятно, что MX1508 будет действовать как переключатель, включающий или выключающий соединение двигателя с GND, когда соответствующий вывод находится в состоянии HIGH или LOW. Естественно, это ВЫСОКОЕ или НИЗКОЕ напряжение контролируется ESP8266.
Таким образом, ток необходимый для работы двигателя, обеспечивается источником питания 5 В и управление двигателем производит драйвер MX1508, что помогает не вывести ESP8266 из строя. Поскольку MX1508 может управляться сигналами 3,3 В, он будет нормально работать с ESP8266.
Чтобы управлять двигателем постоянного тока, нам нужно будет использовать только цифровой вывод микроконтроллера, следовательно, не нужно подключать библиотеку. Итак, мы инициализируем вывод, как выход.
int motorPin = D3; //Pin, который будет управлять двигателем void setup() { pinMode(motorPin, OUTPUT); //Инициализируйте pin как выходной }
Код для управления двигателем постоянного тока очень прост, как мы увидим ниже.
Чтобы контролировать, включен или выключен двигатель, нам просто нужно изменить значения цифрового вывода с HIGH на LOW. Таким образом, он будет либо работать на полной скорости, либо останавливаться.
digitalWrite(motorPin, HIGH); //Включите двигатель на полную скорость delay(5000); digitalWrite(motorPin, LOW); //Выключить двигатель delay(5000);
Теперь, если хотим контролировать скорость двигателя, мы можем использовать ШИМ, вызвав функцию analogWrite. Эта функция принимает в качестве входных данных вывод, на котором генерируется сигнал ШИМ, и значение скважности. Нам просто нужно помнить из предыдущего урока, что диапазон значений рабочего цикла по умолчанию для реализации ESP8266 составляет от 0 до 1023.
При значении 0 на выводе ESP8266, который управляет MX1508, всегда будет 0 В (GND), и поэтому на двигатель не будет подаваться напряжение. Для значения 1023, напряжение на выводе ESP8266 всегда будет 3,3 В, таким образом, MX1508 будет выдавать 5 В.
Для любого промежуточного значения между 0 и 1023 скважность прямоугольной волны, создаваемой ESP8266, будет воспроизведен MX1508, таким образом, двигатель будет иметь смоделированное аналоговое напряжение между 0 и 5 В, что будет соответственно изменять его скорость.
Итак, мы должны вызвать функцию analogWrite, как показано ниже, для промежуточного значения.
analogWrite(motorPin, 950);
Нужно иметь в виду, что существует минимальное значение напряжения, при котором двигатель начинает вращаться. Таким образом, это нормально, что при низких значениях ШИМ он не вращается, и только после порогового значения (который будет зависеть от используемого двигателя) он начнет вращаться.
Окончательный код можно увидеть ниже. В этом случае мы сначала выключаем двигатель на полной скорости, а затем выключаем его с помощью функции digitalWrite. Затем начинаем с 0 В и постепенно увеличиваем подаваемое напряжение до 5 В с помощью функции analogWrite.
digitalWrite(motorPin, HIGH); //Включите двигатель на полную скорость delay(5000); digitalWrite(motorPin, LOW); //Выключить двигатель delay(5000); int i; for ( i = 0; i < 1023; i = i + 5) { analogWrite(motorPin, i); //Постепенно увеличивайте скорость delay(100); } for (; i > 0; i = i - 5) { analogWrite(motorPin, i); //Постепенно уменьшайте скорость delay(100); } analogWrite(motorPin, 0); //Отключить ШИМ
После достижения 5 В начинаем постепенно уменьшать напряжение до 0 В. Кроме того, в конце цикла выполняется вызов функции analogWrite со значением 0.
Результат показан на видео ниже. Как указывалось ранее, сразу после определенного рабочего цикла, смоделированное аналоговое напряжение становится достаточно высоким, чтобы двигатель начал движение. А шум, который слышен перед запуском двигателя, является результатом приложения напряжения к его клеммам, которого недостаточно для его движения.
Вращать одним двигателем в одном направлении хорошо. Но чаще всего требуется управлять вращением двигателя в разных направлениях (реверс). А при разработке радиоуправляемых моделей, чаще всего приходится управлять двумя или четырьмя двигателями. Сейчас рассмотрим пример, как можно вращать два двигателя с реверсом. Также посмотрим, как можно задать скорость вращения двигателей с помощью ШИМ.
Пример возьмём из урока для Arduino. И подправим для использования с ESP8266.
const int PinA1 = D4; // (ШИМ) вывод 5 соединен с выводом А1 const int PinA2 = D3; // (ШИМ) вывод 6 соединен с выводом А2 const int PinB1 = D5; // (ШИМ) вывод 10 соединен с выводом (pin) B1 const int PinB2 = D6; //(ШИМ) вывод 11 соединен с выводом (pin)B2 int speed = 1023; // измените это значение (0-1023), //чтобы управлять скоростью вращения двигателей void setup() { pinMode(PinA1, OUTPUT); // установите контакты на выход pinMode(PinA2, OUTPUT); pinMode(PinB1, OUTPUT); pinMode(PinB2, OUTPUT); Serial.begin(9600); } void loop() { Serial.println("Avanti"); forward(); delay(2000); STOP(); Serial.println("Indietro"); backward(); delay(2000); STOP(); Serial.println("Sinistra"); left(); delay(2000); STOP(); Serial.println("Destra"); right(); delay(2000); STOP(); } void backward() // Вперед. { analogWrite(PinA1, 0); analogWrite(PinA2, speed); analogWrite(PinB1, 0); analogWrite(PinB2, speed); } void forward() //Назад... { analogWrite(PinA1, speed); analogWrite(PinA2, 0); analogWrite(PinB1, speed); analogWrite(PinB2, 0); } void left() // В левую сторону { analogWrite(PinA1, speed); analogWrite(PinA2, 0); analogWrite(PinB1, 0); analogWrite(PinB2, speed); } void right() //В правую сторону { analogWrite(PinA1, 0); analogWrite(PinA2, speed); analogWrite(PinB1, speed); analogWrite(PinB2, 0); } void STOP() //Стоп { analogWrite(PinA1, 0); analogWrite(PinA2, 0); analogWrite(PinB1, 0); analogWrite(PinB2, 0); delay (2000); }
Основное отличие данного примера это изменение скорости вращения. Как мы уже знаем из предыдущего урока ШИМ на ESP8266 можно менять от 0 до 1023, а для Arduino всего от 0 до 255.
int speed = 1023; // измените это значение (0-1023), ... analogWrite(PinA2, speed);
Как видим, двигателя вращаются по загнанному алгоритму и с указанной скоростью вращения. На данном примере можно реализовать Wi-Fi машинку или другое умное устройство.
Смотрите примеры проектов с использованием двигателей постоянного тока:
Понравился Урок ESP8266. Управление двигателем постоянного тока. NodeMCU + MX1508? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!
Фотографии к статье
Файлы для скачивания
![]() |
Пример кода управления двигателем постоянного тока и NodeMCU + MX1508.ino | 1 Kb | 967 | Скачать |
![]() |
Пример вращения двумя двигателями постоянного тока с помощью NodeMCU + MX1508.ino | 2 Kb | 947 | Скачать |
Спасибо за полезный урок. Последнее время интересуюсь ЕСП.
Уроки ESP8266 (заметки)
22 сентября , 2021
Комментариев:1
Файлов для скачивания:2
Фото:8
Понравилась статья? Нажми
Виджеты для Easy HMI
Читайте также
Мы в соц сетях
Комментарии