基于ESP8266的遥控小车

本文详细介绍了如何使用WiFi和服务器通过ESP8266芯片控制小车,包括WiFi连接、创建服务器、网页指令控制、硬件与软件结合及直流减速电机驱动模块的使用。提供了完整的代码实现,覆盖了从基础代码搭建到硬件实践的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#如何操控小车
这个问题问的好,相信许多学习过单片机的小伙伴们都知道我们控制一个硬件的方法有很多种,例如红外遥控,蓝牙遥控等等,但是我们今天介绍的是用wifi和服务器进行遥控,那么wifi怎么控制我们的小车呢?
其实原理与蓝牙相似,只不过esp8266这款芯片可以连接wifi,如果连接上了阿里云我们,只要芯片有网,我们就可以实现无限距离的传输。当然如果我们也可以使用局域网来控制小车。本项目用Arduino IDLE来实现代码。
下面展示如何连接wifi。


/ /wifi连接
Serial.begin(9600);         // 启动串口通讯
  
  WiFi.begin(ssid, password);                  // 启动网络连接
  Serial.print("Connecting to ");              // 串口监视器输出网络连接信息
  Serial.print(ssid); Serial.println(" ...");  // 告知用户NodeMCU正在尝试WiFi连接
  
  int i = 0;                                   // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
    delay(1000);                               // 如果WiFi连接成功则返回值为WL_CONNECTED                       
    Serial.print(i++); Serial.print(' ');      // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
  }                                            // 同时NodeMCU将通过串口监视器输出连接时长读秒。
                                               // 这个读秒是通过变量i每隔一秒自加1来实现的。
                                               
  Serial.println("");                          // WiFi连接成功后
  Serial.println("Connection established!");   // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP address:    ");             // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());              // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。

#在连接WiFi后我们该如何给芯片发送指令来控制小车呢?
我们可以通过esp8266来创建一个服务器通过网页里面的指令来控制小车

// 以下是创建服务器的部分代码
 esp8266_server.begin();                  
 esp8266_server.on("/", handleRoot);      
 esp8266_server.onNotFound(handleNotFound);  

以下是创建网页的基本代码(用html5编写)

// 网页编写部分代码
  webPage += "<div align=\"center\"><h1>contral direction</h1>";
  webPage += "<a href=\"FL\"><button style=\"height:200px;width:200px\"><font size=\"20\">FL</font></button></a>";
  webPage += "<a href=\"F2\"><button style=\"height:200px;width:200px\"><font size=\"20\">FW</font></button></a>";
  webPage += "<a href=\"FR\"><button style=\"height:200px;width:200px\"><font size=\"20\">FR</font></button></a><br>";
  webPage += "<a href=\"L2\"><button style=\"height:200px;width:200px\"><font size=\"20\">LT</font></button></a>";
  webPage += "<a href=\"S2\"><button style=\"height:200px;width:200px\"><font size=\"20\">ST</font></button></a>";
  webPage += "<a href=\"R2\"><button style=\"height:200px;width:200px\"><font size=\"20\">RT</font></button></a><br>";
  webPage += "<a href=\"BL\"><button style=\"height:200px;width:200px\"><font size=\"20\">BL</font></button></a>";
  webPage += "<a href=\"B2\"><button style=\"height:200px;width:200px\"><font size=\"20\">BC</font></button></a>";
  webPage += "<a href=\"BR\"><button style=\"height:200px;width:200px\"><font size=\"20\">BR</font></button></a></div>";
  webPage += "<div align=\"center\"><h1>speed contral</h1>";
  webPage += "<a href=\"SE1\"><button style=\"height:200px;width:200px\"><font size=\"20\">1</font></button></a>";
  webPage += "<a href=\"SE2\"><button style=\"height:200px;width:200px\"><font size=\"20\">2</font></button></a>";
  webPage += "<a href=\"SE3\"><button style=\"height:200px;width:200px\"><font size=\"20\">3</font></button></a><br>";
  webPage += "<a href=\"SE4\"><button style=\"height:200px;width:200px\"><font size=\"20\">4</font></button></a>";
  webPage += "<a href=\"SE5\"><button style=\"height:200px;width:200px\"><font size=\"20\">5</font></button></a>";
  webPage += "<a href=\"SE6\"><button style=\"height:200px;width:200px\"><font size=\"20\">6</font></button></a><br>";
  webPage += "<a href=\"SE7\"><button style=\"height:200px;width:200px\"><font size=\"20\">7</font></button></a>";
  webPage += "<a href=\"SE8\"><button style=\"height:200px;width:200px\"><font size=\"20\">8</font></button></a>";
  webPage += "<a href=\"SE9\"><button style=\"height:200px;width:200px\"><font size=\"20\">9</font></button></a>";
 

大家在连接上wifi之后可以根据Arduino IDLE上的串口来查看esp8266的IP地址。如果是手机开热点的话可以在手机热点里查看ip(例如192.168.4.1),
注意你的手机要和开发板连接同一个WiFi,然后在浏览器输入IP地址就可以进入你创建的网页了

这个页面上分别设置了9个按键来控制方向和9个按键来控制速度。包括前后左右,左前方,右前方等等。速度我设置了9个档为分别为0~9(用pwm来调速)
#做好这些基础的代码之后就是硬件和软件的相结合了,我们控制直流减速电机用到了l298n电机驱动模块。

在这里插入图片描述
在这里插入图片描述

该模块5-12v都可以驱动,我个人建议最好是12v驱动。将电源的正负极分别接在l298n的12v和GND上,5v和GND接出来接到nodemcu的vin与GND接口,然后分别将outA和outB接到直流减速电机上(这里注意千万不要将12v接到nodemcu上,会将芯片烧坏)
我的代码是将开发板的D1接到ENA,D3接到ENB,D5~D7分别接在IN1到IN4上,开发板上的pwm输出是接在了使能端上来调速的。
以下为完整代码(这里的WiFi是我自己的,大家可以改成自己的WiFi名称,注意的是esp8266只能接收2.4Ghz的WiFi)

// An highlighted block
#define ENA    5          // Enable/speed motors Right          GPIO 5(D1)
//#define ENA_2  4          // Enable/speed motors Right_2        GPIO 4(D2)
#define ENB    0          // Enable/speed motors Left           GPIO 0(D3)
//#define ENB_2  2          // Enable/speed motors Left_2         GPIO 2(D4)
#define IN_1  14          // L298N in1 motors Right             GPIO14(D5)
#define IN_2  12          // L298N in2 motors Right             GPIO12(D6)
#define IN_3  13          // L298N in3 motors Left              GPIO13(D7)
#define IN_4  15          // L298N in4 motors Left              GPIO15(D8)
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266WiFiMulti.h>
 /* Wifi ssid and pwd */
const char *ssid = "LHD1";
const char *password = "1234567890";


 
/* your car speed */
int speedCar = 125;         // 0 - 255.
int speedInterval = 20;     //速度间隔
int speedTrun = 1.5;        //转弯系数
 
ESP8266WebServer server(80);

String webPage = "";
 
/* 192.168.4.1 */
void handleRoot() {
  server.send(200, "text/html", "<h1>You are connected</h1>");
}
 
void setup() {
   Serial.begin(9600);         // 启动串口通讯
  
  WiFi.begin(ssid, password);                  // 启动网络连接
  Serial.print("Connecting to ");              // 串口监视器输出网络连接信息
  Serial.print(ssid); Serial.println(" ...");  // 告知用户NodeMCU正在尝试WiFi连接
  
  int i = 0;                                   // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
    delay(1000);                               // 如果WiFi连接成功则返回值为WL_CONNECTED                       
    Serial.print(i++); Serial.print(' ');      // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
  }                                            // 同时NodeMCU将通过串口监视器输出连接时长读秒。
                                               // 这个读秒是通过变量i每隔一秒自加1来实现的。
                                               
  Serial.println("");                          // WiFi连接成功后
  Serial.println("Connection established!");   // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP address:    ");             // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());              // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
  webPage += "<div align=\"center\"><h1>ESP8266 CAR</h1>";
  webPage += "<a href=\"FL\"><button style=\"height:200px;width:200px\"><font size=\"20\">FL</font></button></a>";
  webPage += "<a href=\"F2\"><button style=\"height:200px;width:200px\"><font size=\"20\">FW</font></button></a>";
  webPage += "<a href=\"FR\"><button style=\"height:200px;width:200px\"><font size=\"20\">FR</font></button></a><br>";
  webPage += "<a href=\"L2\"><button style=\"height:200px;width:200px\"><font size=\"20\">LT</font></button></a>";
  webPage += "<a href=\"S2\"><button style=\"height:200px;width:200px\"><font size=\"20\">ST</font></button></a>";
  webPage += "<a href=\"R2\"><button style=\"height:200px;width:200px\"><font size=\"20\">RT</font></button></a><br>";
  webPage += "<a href=\"BL\"><button style=\"height:200px;width:200px\"><font size=\"20\">BL</font></button></a>";
  webPage += "<a href=\"B2\"><button style=\"height:200px;width:200px\"><font size=\"20\">BC</font></button></a>";
  webPage += "<a href=\"BR\"><button style=\"height:200px;width:200px\"><font size=\"20\">BR</font></button></a></div>";
  webPage += "<div align=\"center\"><h1>SPEED CHANGE</h1>";
  webPage += "<a href=\"SE1\"><button style=\"height:200px;width:200px\"><font size=\"20\">1</font></button></a>";
  webPage += "<a href=\"SE2\"><button style=\"height:200px;width:200px\"><font size=\"20\">2</font></button></a>";
  webPage += "<a href=\"SE3\"><button style=\"height:200px;width:200px\"><font size=\"20\">3</font></button></a><br>";
  webPage += "<a href=\"SE4\"><button style=\"height:200px;width:200px\"><font size=\"20\">4</font></button></a>";
  webPage += "<a href=\"SE5\"><button style=\"height:200px;width:200px\"><font size=\"20\">5</font></button></a>";
  webPage += "<a href=\"SE6\"><button style=\"height:200px;width:200px\"><font size=\"20\">6</font></button></a><br>";
  webPage += "<a href=\"SE7\"><button style=\"height:200px;width:200px\"><font size=\"20\">7</font></button></a>";
  webPage += "<a href=\"SE8\"><button style=\"height:200px;width:200px\"><font size=\"20\">8</font></button></a>";
  webPage += "<a href=\"SE9\"><button style=\"height:200px;width:200px\"><font size=\"20\">9</font></button></a>";
 
  // preparing GPIOs
  pinMode(ENA, OUTPUT);
  //digitalWrite(ENA, 0);
  pinMode(ENB, OUTPUT);
  //digitalWrite(ENB, 0);
  pinMode(IN_1, OUTPUT);
  // digitalWrite(IN_1, 0);
  pinMode(IN_2, OUTPUT);
  // digitalWrite(IN_2, 0);
  pinMode(IN_3, OUTPUT);
  // digitalWrite(IN_3, 0);
  pinMode(IN_4, OUTPUT);
  // digitalWrite(IN_4, 0);
 
 
  server.on("/", []() {
    server.send(200, "text/html", webPage);
  });
  server.on("/FL", []() {
    server.send(200, "text/html", webPage);
    FL();
  });
  server.on("/F2", []() {
    server.send(200, "text/html", webPage);
    F2();
  });
  server.on("/FR", []() {
    server.send(200, "text/html", webPage);
    FR();
  });
  server.on("/L2", []() {
    server.send(200, "text/html", webPage);
    L2();
  });
  server.on("/S2", []() {
    server.send(200, "text/html", webPage);
    S2();
  });
  server.on("/R2", []() {
    server.send(200, "text/html", webPage);
    R2();
  });
  server.on("/BL", []() {
    server.send(200, "text/html", webPage);
    BL();
  });
  server.on("/B2", []() {
    server.send(200, "text/html", webPage);
    B2();
  });
  server.on("/BR", []() {
    server.send(200, "text/html", webPage);
    BR();
  });
 
  server.on("/SE1", []() {
    server.send(200, "text/html", webPage);
    CS(1);
  });
  server.on("/SE2", []() {
    server.send(200, "text/html", webPage);
    CS(2);
  });
  server.on("/SE3", []() {
    server.send(200, "text/html", webPage);
    CS(3);
  });
  server.on("/SE4", []() {
    server.send(200, "text/html", webPage);
    CS(4);
  });
  server.on("/SE5", []() {
    server.send(200, "text/html", webPage);
    CS(5);
  });
  server.on("/SE6", []() {
    server.send(200, "text/html", webPage);
    CS(6);
  });
  server.on("/SE7", []() {
    server.send(200, "text/html", webPage);
    CS(7);
  });
  server.on("/SE8", []() {
    server.send(200, "text/html", webPage);
    CS(8);
  });
  server.on("/SE9", []() {
    server.send(200, "text/html", webPage);
    CS (9);
  });
 
  server.begin();
  Serial.println("HTTP server started");
}
 
/*******************************************/
void FL() {
  analogWrite(ENA, speedCar);
  analogWrite(ENB, speedCar / speedTrun);
  digitalWrite(IN_1, 0);
  digitalWrite(IN_2, 1);
 
  digitalWrite(IN_3, 0);
  digitalWrite(IN_4, 1);
}
 
void F2() {
  digitalWrite(ENA, 1);
  digitalWrite(ENB, 1);
  digitalWrite(IN_1, 0);
  digitalWrite(IN_2, 1);
 
  digitalWrite(IN_3, 0);
  digitalWrite(IN_4, 1);
 
}
 
void FR() {
  analogWrite(ENA, speedCar / speedTrun);
  analogWrite(ENB, speedCar);
  digitalWrite(IN_1, 0);
  digitalWrite(IN_2, 1);
 
  digitalWrite(IN_3, 0);
  digitalWrite(IN_4, 1);
}
 
void L2() {
  analogWrite(ENA, speedCar);
  analogWrite(ENB, speedCar);
  digitalWrite(IN_1, 0);
  digitalWrite(IN_2, 1);
 
  digitalWrite(IN_3, 1);
  digitalWrite(IN_4, 0);
}
 
void S2() {
  digitalWrite(IN_1, 0);
  digitalWrite(IN_2, 0);
  digitalWrite(IN_3, 0);
  digitalWrite(IN_4, 0);
}
 
void R2() {
  analogWrite(ENA, speedCar);
  analogWrite(ENB, speedCar);
  digitalWrite(IN_1, 1);
  digitalWrite(IN_2, 0);
 
  digitalWrite(IN_3, 0);
  digitalWrite(IN_4, 1);
}
 
void BL() {
  analogWrite(ENA, speedCar);
  analogWrite(ENB, speedCar / speedTrun);
  digitalWrite(IN_1, 1);
  digitalWrite(IN_2, 0);
 
  digitalWrite(IN_3, 1);
  digitalWrite(IN_4, 0);
}
 
void B2() {
  analogWrite(ENA, speedCar);
  analogWrite(ENB, speedCar);
  digitalWrite(IN_1, 1);
  digitalWrite(IN_2, 0);
 
  digitalWrite(IN_3, 1);
  digitalWrite(IN_4, 0);
}
 
void BR() {
  analogWrite(ENA, speedCar / speedTrun);
  analogWrite(ENB, speedCar);
  digitalWrite(IN_1, 1);
  digitalWrite(IN_2, 0);
 
  digitalWrite(IN_3, 1);
  digitalWrite(IN_4, 0);
}
 
void CS(int NUM) {
  speedCar = 255 - (9 - NUM) * speedInterval;
  analogWrite(ENA, speedCar);
  analogWrite(ENB, speedCar);
}
 
/*******************************************/
 
void loop() {
  server.handleClient();
}

代码参考太极创客网站

ESP8266遥控小车是一种基于ESP8266微控制器的智能小车项目。ESP8266是一款低成本的Wi-Fi微控制器,广泛应用于物联网(IoT)项目中。通过将ESP8266与电机驱动模块、传感器和其他电子元件结合,可以实现远程控制小车。 ### 主要组成部分 1. **ESP8266模块**:作为主控制器,负责处理无线通信和控制逻辑。 2. **电机驱动模块**:如L298N,用于控制小车的电机。 3. **直流电机**:驱动小车移动。 4. **电源模块**:为整个系统提供电力。 5. **其他传感器**:如超声波传感器,用于避障。 ### 功能 1. **远程控制**:通过Wi-Fi连接到手机或电脑,使用相应的应用程序或网页界面控制小车的移动。 2. **自动避障**:通过超声波传感器检测前方障碍物,并自动避开。 3. **实时监控**:可以添加摄像头模块,实现小车的实时视频监控。 ### 实现步骤 1. **硬件连接**:将ESP8266模块、电机驱动模块、直流电机和其他传感器按照电路图连接。 2. **编写代码**:使用Arduino IDE或其他开发环境编写控制代码,实现小车的移动控制和传感器数据处理。 3. **配置无线网络**:将ESP8266配置为Wi-Fi客户端,连接到指定的无线网络。 4. **开发控制界面**:在手机或电脑上开发一个简单的网页界面或应用程序,通过按钮控制小车的移动。 ### 示例代码 ```cpp #include <ESP8266WiFi.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; WiFiServer server(80); void setup() { Serial.begin(115200); pinMode(16, OUTPUT); // 控制电机 pinMode(5, OUTPUT); // 控制电机 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } server.begin(); Serial.println("Connected to WiFi"); } void loop() { WiFiClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { String command = client.readStringUntil('\n'); if (command == "FORWARD") { digitalWrite(16, HIGH); digitalWrite(5, LOW); } else if (command == "BACKWARD") { digitalWrite(16, LOW); digitalWrite(5, HIGH); } else if (command == "STOP") { digitalWrite(16, LOW); digitalWrite(5, LOW); } } } client.stop(); } } ``` ### 优点 - **低成本**:ESP8266模块价格低廉,适合DIY项目。 - **灵活性**:可以通过编程实现多种功能。 - **易用性**:与Arduino IDE兼容,编程简单。 ### 缺点 - **功率限制**:ESP8266的功率输出有限,需要外部电机驱动模块。 - **复杂性**:需要一定的电子和编程知识。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值