使用网页控制L298N电机
前言
本项目最终目标是实现Firebeetle 2 ESP32-S3 的实时摄像头小车制作,请参考:
所需材料
- Firebeetle2 ESP32-S3
- L298N模块
- TT马达
- 计算机(用于编程)
- Arduino IDE
准备工作
了解硬件
L298N电机驱动介绍
L298N电机驱动是一种常用的电机控制模块,用于控制直流电机的转动和方向。它提供了双H桥电路,允许您独立控制两台直流电机。
基本原理
L298N电机驱动的核心原理是通过调整电流方向和大小,控制连接到它的电机的旋转方向和速度。这是通过H桥电路实现的,其中包括四个开关(通常是晶体管或MOSFET)。
使用场景
L298N电机驱动非常适合用于小型机器人、遥控车、自动门和其他需要控制电机的项目。它允许您通过编程控制电机的运动,包括正转、反转和速度控制。
引脚配置
通常,L298N电机驱动模块有以下引脚:
-
EN (Enable):用于启用或禁用电机驱动。通常,将其连接到Arduino的数字引脚以启用或禁用电机。
-
IN1和IN2:这两个引脚用于控制第一个电机的方向。通过将它们设置为不同的状态,您可以使电机正转、反转或停止。
-
IN3和IN4:这两个引脚用于控制第二个电机的方向,工作方式与IN1和IN2相同。
-
OUT1、OUT2、OUT3和OUT4:这些引脚用于连接到电机的正极和负极,以控制电机的转向。
硬件连接
- L298N OUT3:马达红(红黑不代表正负,电机没有正负)
- L298N OUT4:马达黑
- L298N IN3:Firebeetle 2 ESP32-s3的D10/14
- L298N IN4:Firebeetle 2 ESP32-s3的D11/13
- L298N GND:Firebeetle 2 ESP32-s3的GND + 外接5V电源的负极
- L298N 12V:外接5V电源的正极
完整代码
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
const char *ssid = "eva";
const char *password = "12345678";
const int motorDirection1 = 13; // 连接到L298N模块的IN1引脚
const int motorDirection2 = 14; // 连接到L298N模块的IN2引脚
AsyncWebServer server(80);
bool motorRunning = false;
void setup() {
pinMode(motorDirection1, OUTPUT);
pinMode(motorDirection2, OUTPUT);
// 初始化串行通信
Serial.begin(115200);
// 连接到Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println(WiFi.localIP());
// 设置路由
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
String html = "<html><body>";
html += "<h1>Motor Control</h1>";
// 检查电机状态并显示相应的按钮
if (motorRunning) {
html += "<p>Motor is running. <button onmouseup='stopMotor()'>Stop</button></p>";
} else {
html += "<p><button onmousedown='startMotorForward()' ontouchstart='startMotorForward()' onmouseup='stopMotor()' ontouchend='stopMotor()'>Forward</button></p>";
html += "<p><button onmousedown='startMotorBackward()' ontouchstart='startMotorBackward()' onmouseup='stopMotor()' ontouchend='stopMotor()'>Backward</button></p>";
}
html += "<script>function startMotorForward() {";
html += " motorRunning = true;";
html += " fetch('/startForward');";
html += "}";
html += "function startMotorBackward() {";
html += " motorRunning = true;";
html += " fetch('/startBackward');";
html += "}";
html += "function stopMotor() {";
html += " motorRunning = false;";
html += " fetch('/stopMotor');";
html += "}";
html += "</script>";
html += "</body></html>";
request->send(200, "text/html", html);
});
server.on("/startForward", HTTP_GET, [](AsyncWebServerRequest *request) {
digitalWrite(motorDirection2, LOW);
digitalWrite(motorDirection1, HIGH);
request->send(200, "text/plain", "Motor Forward");
});
server.on("/startBackward", HTTP_GET, [](AsyncWebServerRequest *request) {
digitalWrite(motorDirection1, LOW);
digitalWrite(motorDirection2, HIGH);
request->send(200, "text/plain", "Motor Backward");
});
server.on("/stopMotor", HTTP_GET, [](AsyncWebServerRequest *request) {
digitalWrite(motorDirection1, LOW);
digitalWrite(motorDirection2, LOW);
request->send(200, "text/plain", "Motor Stopped");
});
// 启动服务器
server.begin();
}
void loop() {
// 在这里可以执行其他操作
}
代码说明
-
引入所需的库:
#include <WiFi.h> : 导入用于连接Wi-Fi网络的库。
#include <ESPAsyncWebServer.h> : 导入异步Web服务器库,用于处理Web请求和响应。
-
定义Wi-Fi连接信息:
const char *ssid = "eva"; : 设置Wi-Fi网络的SSID(网络名称)。
const char *password = "12345678"; : 设置Wi-Fi网络的密码。
-
定义引脚连接:
const int motorDirection1 = 13; : 指定连接到L298N电机驱动模块的IN1引脚的Arduino引脚号。
const int motorDirection2 = 14; : 指定连接到L298N电机驱动模块的IN2引脚的Arduino引脚号。
-
创建AsyncWebServer对象:
AsyncWebServer server(80); : 创建一个基于ESPAsyncWebServer库的Web服务器对象,监听端口80。
-
设置电机状态变量:
bool motorRunning = false; : 创建一个布尔变量 motorRunning ,用于跟踪电机的运行状态。
-
setup() 函数:
- 配置引脚:
pinMode(motorDirection1, OUTPUT); 和 pinMode(motorDirection2, OUTPUT); 设置 motorDirection1 和 motorDirection2 引脚为输出模式,以便控制电机的方向。
- 初始化串行通信:
Serial.begin(115200); 启动串行通信,用于在串行监视器上打印调试信息。
- 连接到Wi-Fi:
WiFi.begin(ssid, password); 启动Wi-Fi连接,使用指定的SSID和密码。
- 使用
while (WiFi.status() != WL_CONNECTED) 等待Wi-Fi连接成功,期间每隔1秒输出连接状态信息。
- 一旦连接成功,通过
Serial.println(WiFi.localIP()) 打印ESP32的局域网IP地址。
-
设置路由和Web页面:
- 使用
server.on("/", HTTP_GET, ...) 创建根路由处理程序。此路由用于处理根目录的HTTP GET请求。
- 在处理程序中,生成一个包含HTML界面的字符串,显示电机控制按钮。按钮通过JavaScript函数调用与电机的控制状态交互。
- 通过内联JavaScript函数
startMotorForward() , startMotorBackward() , 和 stopMotor() 启动或停止电机,并通过 fetch 发送HTTP请求来控制电机。
- 最后,使用
request->send(200, "text/html", html); 发送HTML响应。
-
创建三个额外的路由:
/startForward , /startBackward , 和 /stopMotor 分别用于控制电机的正转、反转和停止操作。
- 这些路由的处理程序使用
digitalWrite 控制引脚状态,并通过HTTP响应返回状态信息。
-
启动服务器:
server.begin(); 启动Web服务器,开始监听来自客户端的HTTP请求。
-
loop() 函数:
总之,这段代码创建了一个通过Wi-Fi连接的Web服务器,允许用户通过浏览器控制一个电机的运动方向。通过点击按钮,用户可以启动正转、反转和停止电机的运动。这是一个简单的示例,可以扩展和改进以适应更复杂的项目。
成果
点击对应按钮启动电机
|
|
|
|
|
|