Firebeetle 2 ESP32-S3 新手笔记3-带你学会用网页服务器控制电机
## 使用网页控制L298N电机## 前言
本项目最终目标是实现Firebeetle 2 ESP32-S3 的实时摄像头小车制作,请参考:
- [用网页服务器控制板载LED](https://mc.dfrobot.com.cn/thread-316962-1-1.html)
- [用网页服务器查看摄像头画面](https://mc.dfrobot.com.cn/thread-317137-1-1.html)
## 所需材料
- Firebeetle2 ESP32-S3
- L298N模块
- TT马达
- 计算机(用于编程)
- Arduino IDE
## 准备工作
- [环境准备,请仔细跟着5.1操作](https://wiki.dfrobot.com.cn/_SKU_DFR0975_FireBeetle_2_Board_ESP32_S3#target_4)
## 了解硬件
### 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() {
// 在这里可以执行其他操作
}
```
## 代码说明
1. **引入所需的库**:
- `#include <WiFi.h>`: 导入用于连接Wi-Fi网络的库。
- `#include <ESPAsyncWebServer.h>`: 导入异步Web服务器库,用于处理Web请求和响应。
2. **定义Wi-Fi连接信息**:
- `const char *ssid = "eva";`: 设置Wi-Fi网络的SSID(网络名称)。
- `const char *password = "12345678";`: 设置Wi-Fi网络的密码。
3. **定义引脚连接**:
- `const int motorDirection1 = 13;`: 指定连接到L298N电机驱动模块的IN1引脚的Arduino引脚号。
- `const int motorDirection2 = 14;`: 指定连接到L298N电机驱动模块的IN2引脚的Arduino引脚号。
4. **创建AsyncWebServer对象**:
- `AsyncWebServer server(80);`: 创建一个基于ESPAsyncWebServer库的Web服务器对象,监听端口80。
5. **设置电机状态变量**:
- `bool motorRunning = false;`: 创建一个布尔变量 `motorRunning`,用于跟踪电机的运行状态。
6. **`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地址。
7. **设置路由和Web页面**:
- 使用 `server.on("/", HTTP_GET, ...)` 创建根路由处理程序。此路由用于处理根目录的HTTP GET请求。
- 在处理程序中,生成一个包含HTML界面的字符串,显示电机控制按钮。按钮通过JavaScript函数调用与电机的控制状态交互。
- 通过内联JavaScript函数 `startMotorForward()`, `startMotorBackward()`, 和 `stopMotor()` 启动或停止电机,并通过 `fetch` 发送HTTP请求来控制电机。
- 最后,使用 `request->send(200, "text/html", html);` 发送HTML响应。
8. **创建三个额外的路由**:
- `/startForward`, `/startBackward`, 和 `/stopMotor` 分别用于控制电机的正转、反转和停止操作。
- 这些路由的处理程序使用 `digitalWrite` 控制引脚状态,并通过HTTP响应返回状态信息。
9. **启动服务器**:
- `server.begin();` 启动Web服务器,开始监听来自客户端的HTTP请求。
10. **`loop()` 函数**:
- 此函数通常为空,允许您在主循环中执行其他操作。
总之,这段代码创建了一个通过Wi-Fi连接的Web服务器,允许用户通过浏览器控制一个电机的运动方向。通过点击按钮,用户可以启动正转、反转和停止电机的运动。这是一个简单的示例,可以扩展和改进以适应更复杂的项目。
## 成果
点击对应按钮启动电机
页:
[1]