最近博主接触到了一些硬件方面的知识,由此使用单片机制作了一个遥控坦克
实现原理概述
- ESP8266 配置为服务器:ESP8266 可以配置为一个简单的 Web 服务器,监听特定端口上的传入连接。
- HTTP 请求处理:当手机 App 发出 HTTP 请求(如 GET 或 POST),ESP8266 接收并解析这些请求,根据请求内容执行相应的操作(比如前进、后退等)。
- 电机控制:ESP8266 根据接收到的指令,通过 GPIO 引脚发送信号给电机驱动模块(如L298N),进而控制汽车的动作。
关键步骤
1. ESP8266 设置为服务器
首先,在 ESP8266 上设置一个简单的 Web 服务器。这里博主使用的是 Arduino IDE :
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
// 定义 D1~D4 引脚编号(NodeMCU 对应 GPIO)
#define D1 5
#define D2 4
#define D3 0
#define D4 2
// WiFi 设置
const char* ssid = "";
const char* password = "";
// 静态IP配置
IPAddress staticIP(192, 168, 0, 100); // 固定IP
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
// 电机引脚定义
const int motorA1 = D1;
const int motorA2 = D2;
const int motorB1 = D3;
const int motorB2 = D4;
ESP8266WebServer server(80);
// 电机控制函数(放在 Flash 中以节省 IRAM)
ICACHE_FLASH_ATTR void setMotor(int a1, int a2, int b1, int b2) {
digitalWrite(motorA1, a1);
digitalWrite(motorA2, a2);
digitalWrite(motorB1, b1);
digitalWrite(motorB2, b2);
}
// 路由处理函数(也放在 Flash 中)
ICACHE_FLASH_ATTR void handleForward() {
setMotor(HIGH, LOW, HIGH, LOW);
server.send(200, "text/plain", "Forward");
}
ICACHE_FLASH_ATTR void handleBackward() {
setMotor(LOW, HIGH, LOW, HIGH);
server.send(200, "text/plain", "Backward");
}
ICACHE_FLASH_ATTR void handleLeft() {
setMotor(LOW, HIGH, HIGH, LOW);
server.send(200, "text/plain", "Left");
}
ICACHE_FLASH_ATTR void handleRight() {
setMotor(HIGH, LOW, LOW, HIGH);
server.send(200, "text/plain", "Right");
}
ICACHE_FLASH_ATTR void handleStop() {
setMotor(LOW, LOW, LOW, LOW);
server.send(200, "text/plain", "Stop");
}
// 连接 WiFi 函数(Flash 存储)
ICACHE_FLASH_ATTR void connectWiFi() {
WiFi.config(staticIP, gateway, subnet);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
// 初始化电机引脚
pinMode(motorA1, OUTPUT);
pinMode(motorA2, OUTPUT);
pinMode(motorB1, OUTPUT);
pinMode(motorB2, OUTPUT);
// 连接 WiFi
connectWiFi();
// 注册处理函数
server.on("/forward", handleForward);
server.on("/backward", handleBackward);
server.on("/left", handleLeft);
server.on("/right", handleRight);
server.on("/stop", handleStop);
server.begin();
}
void loop() {
server.handleClient();
// 可选:添加 WiFi 断线重连逻辑
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected. Reconnecting...");
connectWiFi();
}
}
其主要实现了以下功能:
- 连接到 Wi-Fi 网络。
- 设置了一个监听
/forward
/left
/right
/fbackward
/stop
的 GET 请求处理器,当收到这样的请求时,调用对应的方法。 - 如在
handleForward()
中添加了控制电机前进的逻辑。
2. 手机 App 发送 HTTP 请求
随后,我们需要使用安卓写一个遥控器,其功能很简单,前后左右以及启动停止按钮,发送对应的http请求即可。通过向 ESP8266 发送请求,从而实现控制功能。
public void sendRequest() {
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL("http://192.168.1.164/forward"); // 替换为你的ESP8266 IP地址
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) { // 成功响应
InputStream in = new BufferedInputStream(conn.getInputStream());
// 读取响应数据
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
3. 控制电机
这里需要说一下,ESP8266通过控制L298N的高低电平来控制马达,如在 handleForward()
函数中控制电机向前:
#define MOTOR_A_PIN1 D1
#define MOTOR_A_PIN2 D2
void handleForward() {
Serial.println("Moving Forward");
digitalWrite(MOTOR_A_PIN1, HIGH);
digitalWrite(MOTOR_A_PIN2, LOW);
server.send(200, "text/plain", "Moving Forward");
}