伊娃老师 发表于 2023-10-20 14:14:11

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]
查看完整版本: Firebeetle 2 ESP32-S3 新手笔记3-带你学会用网页服务器控制电机