#如何操控小车
这个问题问的好,相信许多学习过单片机的小伙伴们都知道我们控制一个硬件的方法有很多种,例如红外遥控,蓝牙遥控等等,但是我们今天介绍的是用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 GPIOspinMode(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的遥控小车相关推荐

  1. 【毕设项目】基于单片机的遥控小车设计与实现 - 嵌入式 物联网 stm32 c51

    文章目录 1 简介 2 主要器件与实现 2.1 电机驱动模块 2.2 蓝牙模块 2.3 蓝牙调试APP 3 实现效果 5 部分参考代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍 ...

  2. 我的无线DIY设计—基于STM32WB55_NUCLEO​的遥控小车

    在本次DIY的设计当中,我的作品是基于STM32WB55_NUCLEO​的遥控小车,本次设计主要利用stm32wb55的蓝牙功能,由于stm32wb55是一个双核的MCU,同时具有低功耗的特点,因此在 ...

  3. 基于树莓派的遥控小车

    一.引言 最近在准备一个计算机类比赛,需要用树莓派做成一个智能乒乓球捡球车,做过一些人工智能项目的也知道,所谓人工智能,只有人工,没有智能(实力吐槽),只要你知道实现的原理,做很多人工智能的东西都能得 ...

  4. 基于ESP8266和51单片机的手机遥控小车

    小车效果 APP效果 设计材料 ESP8266-01s模块. 51单片机最小系统板. L293D芯片一个. Android系统手机. 面包板一块. 充电宝一个,当做电源. 杜邦线若干. 设计思路 说明 ...

  5. 基于MQTT百度天工服务器,实现微信小程序控制ESP8266,完成遥控小车的简单控制

    目录 前言 一.准备工具 二.百度天工物联网平台的搭建 三.Arduino IDE 环境的搭建和代码 四.微信小程序的搭建和代码 前言 基于MQTT协议借助百度天工物联网平台,通过Arduino ID ...

  6. 最简单DIY基于ESP8266的物联网智能小车①(webserver服务器网页简单遥控版)

    ESP8266和ESP32物联网智能小车开发系列文章目录 第一篇:最简单DIY基于ESP8266的物联网智能小车①(webserver服务器网页简单遥控版) 文章目录 ESP8266和ESP32物联网 ...

  7. 基于STM32设计的遥控小车(手机APP+GPS+温湿度+ESP8266)

    一.环境介绍 小车主控MCU: STM32F103ZET6 STM32程序开发IDE: keil5 STM32程序风格:  采用寄存器方式开发,注释齐全,执行效率高,方便移植 手机APP:  采用QT ...

  8. AIoT应用创新大赛-基于TencentOS Tiny 的遥控小车

    AIoT应用创新大赛-基于TencentOS Tiny 的遥控小车 - 云+社区 - 腾讯云https://cloud.tencent.com/developer/article/1951791 一, ...

  9. 基于Arduino和Blynk的远程遥控小车

    基于Arduino和Blynk的远程遥控小车 小车图片?ε=ε=ε=(~ ̄▽ ̄)~,其实很简单一起来看看叭 废话不多说.首先做这个智能小车所需要的东西有 硬件支持: 1.Arduino Uno 开发板 ...

最新文章

  1. java iso8583 socket 服务_JAVA客户端amp;服务器的socket通信
  2. 『互联网架构』软件架构-spring源码之spring结构概述
  3. 中国地区三级联动下拉菜单的实现
  4. 极乐技术周报(第十六期)
  5. 动态规划——数塔(hdu2084)
  6. cmd运行python脚本处理其他文件_如何在cmd命令行里运行python脚本
  7. 选项在哪_心理测试:4种高跟鞋,比较喜欢哪一种?测试出你对物的欣赏面
  8. 压箱底的Android UI开源库(一)
  9. 关于Fluent瞬态计算你必须掌握的3个技巧
  10. 2021年焊工(初级)考试内容及焊工(初级)最新解析
  11. 《算法竞赛》被评为清华大学出版社2022年度“十佳图书”
  12. 双网卡一个连接外网一个连接内网的处理方法
  13. 学习 Python 之 Pygame 开发魂斗罗(八)
  14. 布置主卧室的八大风水要点
  15. 【react】【antd】一个既可以自定义输入又可以下拉选择的输入框
  16. Java实战之管家婆记账系统(5)——主界面及功能实现
  17. 解决UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xfd in position 1527802: illegal multibyte sequ
  18. 餐饮管理系统oracle实训,餐饮管理系统开题报告
  19. 企业云存储服务器系统设计,如何设计企业云存储架构
  20. 霸王龙只出剪刀,哆啦A梦只出拳头

热门文章

  1. Ubuntu 打开摄像头
  2. linux mmc 读写,这个mmc读取linux的原因是什么
  3. 前端实现图片快速反转替换_在canvas上实现元素图片镜像翻转动画效果的方法
  4. 活动星投票奋斗青春,使命必达网络评选微信的投票方式线上免费投票
  5. 工作意向及规划个人建议
  6. 图片转pdf、长图转pdf
  7. 新GRE考试词汇备考词根:fer
  8. 云主机是什么?可以用来干嘛?
  9. python空间点赞_用Python登录好友QQ空间点赞的示例代码
  10. 关于qt/qte在Ubuntu/Debain下的安装