Мир микроэлектроники и DIY проекты предоставляют бесконечные возможности для творчества и экспериментов. В данной статье мы рассмотрим, как подключить шаговый двигатель и два коллекторных мотора постоянного тока к популярному микроконтроллеру NodeMCU-32S с использованием драйвера H-моста L9110. Это отличный способ добавить движение в ваши проекты и создать интерактивные устройства с управлением через веб-интерфейс.
NodeMCU-32S – это микроконтроллер, основанный на ESP32, который сочетает в себе мощность и гибкость, позволяя создавать Wi-Fi-совместимые устройства с легкостью. Он поддерживает множество интерфейсов, включая Wi-Fi и Bluetooth, что делает его отличным выбором для IoT-проектов.
L9110 – это двухканальный H-мост драйвера, предназначенный для управления двумя маломощными двигателями постоянного тока. Этот компактный и удобный драйвер позволяет управлять направлением и скоростью двигателей, делая его идеальным выбором для робототехники и других проектов, где необходимо управление моторами.
Подключение Шагового двигателя
Подключение шагового двигателя к устройству NodeMCU-32S и H-мосту драйвера L9110 является важным шагом в создании автоматизированных систем и робототехники. Шаговые двигатели позволяют точно контролировать положение механизмов, что делает их неотъемлемой частью проектов, требующих точности и стабильности движения.
Таблица подключения двигателя к драйверу:
Контакт драйвера | Контакт двигателя |
---|---|
MotorA+ | A1 |
MotorA- | A2 |
MotorB+ | B1 |
MotorB- | B2 |
Таблица подключения NodeMCU к драйверу:
Контакт драйвера | NodeMCU-32S |
---|---|
B-IA | 14 |
B-IB | 27 |
GND | Земля |
VCC | Напряжение питания |
A-IA | 32 |
A-IB | 33 |
Убедитесь, что ваш шаговый двигатель и H-мост L9110 совместимы по электрическим параметрам.
Пример кода для управления шаговым двигателем
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
#include <WiFi.h> #include <WebServer.h> #include <Stepper.h> const char *ssid = "YourWiFiSSID"; // Имя вашей Wi-Fi сети const char *password = "YourWiFiPassword"; // Пароль Wi-Fi WebServer server(80); // Создание веб-сервера, который слушает порт 80 // Определяем количество шагов на один оборот вашего шагового двигателя const int stepsPerRevolution = 200; // Создаем объект шагового двигателя Stepper myStepper(stepsPerRevolution, 14, 27, 32, 33); // Пины подключения шагового двигателя bool motorRunning = false; // Флаг, указывающий, работает ли двигатель bool motorReversed = false; // Флаг, указывающий, включен ли реверс int motorSpeed = 0; // Текущая скорость двигателя void setup() { Serial.begin(115200); // Настройка последовательной связи для отладочных сообщений WiFi.begin(ssid, password); // Подключение к Wi-Fi while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); // Ожидание подключения к Wi-Fi } Serial.println("Connected to WiFi"); Serial.print("IP: "); Serial.println(WiFi.localIP()); server.on("/", HTTP_GET, handleRoot); // Обработка корневого пути server.on("/startstop", HTTP_POST, handleStartStop); // Обработка запроса на старт/стоп server.on("/reverse", HTTP_POST, handleReverse); // Обработка запроса на реверс server.on("/speed", HTTP_POST, handleSpeed); // Обработка запроса на изменение скорости server.begin(); Serial.println("HTTP server started"); } void loop() { server.handleClient(); // Обработка клиентских запросов } // Обработчик корневой страницы void handleRoot() { String html = "<html><head><title>Управление мотором</title>"; html += "<style>"; html += "body { font-family: Arial, sans-serif; text-align: center; background-color: #f0f0f0; }"; html += "h1 { color: #333; }"; html += "form { margin: 20px; }"; html += "button { padding: 10px 20px; font-size: 18px; background-color: #0074d9; color: #fff; border: none; cursor: pointer; margin: 5px; }"; html += "input[type='range'] { width: 80%; }"; html += "</style>"; html += "</head><body>"; html += "<h1>Управление мотором</h1>"; html += "<form method='post' action='/startstop'><button>Старт/Стоп</button></form>"; html += "<form method='post' action='/reverse'><button>Реверс</button></form>"; html += "<form method='post' action='/speed'>"; html += "<label for='speed'>Скорость:</label>"; html += "<input type='range' min='0' max='255' value='" + String(motorSpeed) + "' name='speed' id='speed'>"; html += "<input type='submit' value='Установить скорость'></form>"; html += "</body></html>"; server.send(200, "text/html", html); // Отправка HTML-страницы на клиентскую сторону } // Обработчик запроса на старт/стоп void handleStartStop() { motorRunning = !motorRunning; // Инвертировать флаг работы двигателя if (motorRunning) myStepper.setSpeed(motorSpeed); // Установка скорости двигателя else myStepper.setSpeed(0); // Остановка двигателя server.send(200, "text/plain", "OK"); } // Обработчик запроса на реверс void handleReverse() { motorReversed = !motorReversed; // Инвертировать флаг реверса if (motorReversed) myStepper.step(-motorSpeed); // Движение в обратном направлении else myStepper.step(motorSpeed); // Движение в прямом направлении server.send(200, "text/plain", "OK"); } // Обработчик запроса на изменение скорости void handleSpeed() { if (server.hasArg("speed")) { motorSpeed = server.arg("speed").toInt(); // Получение новой скорости из запроса } myStepper.setSpeed(motorSpeed); // Установка новой скорости двигателя server.send(200, "text/plain", "OK"); } |
После загрузки скетча на плату, откройте монитор порта и скопируйте IP адрес NodeMCU. Откройте браузер и вставьте IP адрес в адресную строку. Вы попадете на страницу управления мотором.
Подключение двух коллекторных моторов
Подключение двух коллекторных моторов к устройству NodeMCU-32S с использованием H-моста драйвера L9110 является ключевым моментом при создании роботов и других мобильных устройств. Этот раздел предоставит вам необходимые указания для успешного подключения моторов и управления ими с помощью вашего NodeMCU-32S.
Перед подключением убедитесь, что выбранные коллекторные моторы соответствуют токовым характеристикам H-моста L9110 и напряжению питания вашей системы.
Таблица подключения моторов к драйверу:
Контакт драйвера | Контакт моторов |
---|---|
MotorA+ | Motor1+ |
MotorA- | Motor1- |
MotorB+ | Motor2+ |
MotorB- | Motor2- |
Таблица подключения NodeMCU к драйверу:
Контакт драйвера | NodeMCU-32S |
---|---|
B-IA | 14 |
B-IB | 27 |
GND | Земля |
VCC | Напряжение питания |
A-IA | 32 |
A-IB | 33 |
Пример кода для управления двумя коллекторными моторами
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
#include <WiFi.h> #include <WebServer.h> const char *ssid = "YourWiFiSSID"; // Имя вашей Wi-Fi сети const char *password = "YourWiFiPassword"; // Пароль Wi-Fi WebServer server(80); // Создание веб-сервера, который слушает порт 80 const int motorAPin1 = 14; // Пин 1 мотора A const int motorAPin2 = 27; // Пин 2 мотора A const int motorBPin1 = 32; // Пин 1 мотора B const int motorBPin2 = 33; // Пин 2 мотора B bool motorsRunning = false; // Флаг, указывающий, работают ли моторы bool motorsReversed = false; // Флаг, указывающий, включен ли реверс int motorsSpeed = 255; // Текущая скорость моторов void setup() { Serial.begin(115200); // Настройка последовательной связи для отладочных сообщений WiFi.begin(ssid, password); // Подключение к Wi-Fi while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); // Ожидание подключения к Wi-Fi } Serial.println("Connected to WiFi"); Serial.print("IP: "); Serial.println(WiFi.localIP()); pinMode(motorAPin1, OUTPUT); pinMode(motorAPin2, OUTPUT); pinMode(motorBPin1, OUTPUT); pinMode(motorBPin2, OUTPUT); server.on("/", HTTP_GET, handleRoot); // Обработка корневой страницы server.on("/startstop", HTTP_POST, handleStartStop); // Обработка запроса на старт/стоп server.on("/reverse", HTTP_POST, handleReverse); // Обработка запроса на реверс server.on("/speed", HTTP_POST, handleSpeed); // Обработка запроса на изменение скорости server.begin(); Serial.println("HTTP server started"); } void loop() { server.handleClient(); // Обработка клиентских запросов } // Обработчик корневой страницы void handleRoot() { String html = "<html><head><title>Управление моторами</title>"; html += "<style>"; html += "body { font-family: Arial, sans-serif; text-align: center; background-color: #f0f0f0; }"; html += "h1 { color: #333; }"; html += "form { margin: 20px; }"; html += "button { padding: 10px 20px; font-size: 18px; background-color: #0074d9; color: #fff; border: none; cursor: pointer; margin: 5px; }"; html += "input[type='range'] { width: 80%; }"; html += "</style>"; html += "</head><body>"; html += "<h1>Управление моторами</h1>"; html += "<form method='post' action='/startstop'><button>Старт/Стоп</button></form>"; html += "<form method='post' action='/reverse'><button>Реверс</button></form>"; html += "<form method='post' action='/speed'>"; html += "<label for='speed'>Скорость:</label>"; html += "<input type='range' min='0' max='255' value='" + String(motorsSpeed) + "' name='speed' id='speed'>"; html += "<input type='submit' value='Установить скорость'></form>"; html += "</body></html>"; server.send(200, "text/html", html); // Отправка HTML-страницы на клиентскую сторону } // Обработчик запроса на старт/стоп void handleStartStop() { motorsRunning = !motorsRunning; // Инвертировать флаг работы моторов if (motorsRunning) { analogWrite(motorAPin1, motorsSpeed); analogWrite(motorBPin1, motorsSpeed); } else { analogWrite(motorAPin1, 0); analogWrite(motorBPin1, 0); } server.send(200, "text/plain", "OK"); } // Обработчик запроса на реверс void handleReverse() { motorsReversed = !motorsReversed; // Инвертировать флаг реверса if (motorsReversed) { digitalWrite(motorAPin2, LOW); digitalWrite(motorBPin2, LOW); } else { digitalWrite(motorAPin2, HIGH); digitalWrite(motorBPin2, HIGH); } server.send(200, "text/plain", "OK"); } // Обработчик запроса на изменение скорости void handleSpeed() { if (server.hasArg("speed")) { motorsSpeed = server.arg("speed").toInt(); // Получение новой скорости из запроса } if (motorsRunning) { analogWrite(motorAPin1, motorsSpeed); analogWrite(motorBPin1, motorsSpeed); } server.send(200, "text/plain", "OK"); } |
Подключение шагового двигателя через драйвер L9110 к NodeMCU-32S позволяет создавать устройства управлением движением через web-интерфейс. Применение этой конфигурации может быть полезным во многих проектах, таких как автоматизация, робототехника и другие сферы.