基于ESP8266的遥控小车

2023-10-27

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

代码参考太极创客网站

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于ESP8266的遥控小车 的相关文章

  • Casual inference 综述框架

    A survey on causal inference 因果推理综述 A Survey on Causal Inference 一文的总结和梳理 因果推断理论解读 Rubin因果模型的三个假设 基础理论 理论框架 名词解释 individ
  • 如何使用IDEA正确的创建一个Web项目

    我是学习java的新人休元 第一次使用CSDN写博客请大家多多关照 写的第一篇博客就是如何使用IDEA正确的创建一个Web项目 刚刚使用IDEA不到两个星期 有很多地方不熟练 如果有错误请大家指出来 操作系统 win10 编译环境 IDEA
  • 2023年第1季社区Task挑战赛开启,等你来战!

    社区Task挑战赛是面向社区开发者开展的代码或教程征集活动 该挑战赛为社区中热爱FISCO BCOS及周边组件的开发者提供了探索区块链技术 挑战技术难题的舞台 该挑战赛去年在社区成功举办了3季 共吸引了数百名开发者报名 前3季都有哪些有趣的

随机推荐

  • 从源码看 AlertDialog.getButton(DialogInterface.BUTTON_POSITIVE) 为什么是 null

    我们在使用 AlertDialog 的时候 如果想改变 POSITIVE BUTTON 或者 NEGATIVE BUTTON 的字体颜色 大小时 可能会注意到 AlertDialog getButton DialogInterface BU
  • 长城网络靶场第三题

    关卡描述 1 oa服务器的内网ip是多少 先进行ip统计 开始逐渐查看前面几个ip 基本上都是b s 所以大概率是http 过滤一下ip 第一个ip好像和oa没啥关系 第二个ip一点开就是 oa 应该就是他了 关卡描述 2 黑客的攻击ip是
  • w7系统如何关闭高级文字服务器,Win7系统怎么取消切换大小写时出现提示?

    Win7系统用户在工作中使用键盘切换大小写输入时 总会弹跳出系统的提示窗口 很多用户觉得非常烦 那么Win7系统应该怎么取消切换大小写时出现的提示呢 接下来下面请看Win7系统切换大小写时出现的提示的具体解决方法 解决方法 1 首先 在桌面
  • 在Vue中获取DOM元素的实际宽高

    最近使用 D3 js 开发可视化图表 因为移动端做了 rem 适配 所以需要动态计算获取图表容器的宽高 其中涉及到一些原生DOM API的使用 避免遗忘这里总结一下 一 获取元素 在 Vue 中可以使用 ref 来获取一个真实的 DOM 元
  • 电商峰值系统架构设计--转载

    1 1 系统架构设计目录 摘要 双11来临之际 程序员 以 电商峰值系统架构设计 为主题 力邀京东 当当 小米 1号店 海尔商城 唯品会 蘑菇街 麦包包等电商企业 及商派 基调网络等服务公司 分享电商峰值系统架构设计的最佳技术实践 自200
  • SSH_Unable to negotiate with ... port ..: nomatching host host key type found. Their offer:ssh-rsa

    终端远程登录ssh时 提示如下错误 Unable to negotiate with 192 168 1 228 port 22 nomatching host host key type found Their offer ssh rsa
  • 常见的损失函数(loss function)总结

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 导读 本文总结了常见的八种损失函数的优缺点 包括 0 1损失函数 绝对值损失函数 log对数损失函数 平方损失函数 指数损失函数 Hinge 损失函数 感知损失函数 交叉
  • 解答:pytorch 通过索引赋值后 梯度还能正常反向传播吗

    先上测试代码 if name main scene graph token tensor1 torch rand 4 4 tensor1 requires grad True tensor2 torch rand 4 tensor2 req
  • labelme标注不同物体显示不同颜色以及批量转换

    最近在使用labelme标注数据时遇到一些问题 如上图中 蓝色分别为crack person dog三类 正常应该是3种不同颜色 解决方案 1 labelme版本 2 下载labelme后进行文件修改 由于博主想要的是rgb三通道的彩色图
  • pytorch量化库使用(1)

    量化简介 量化是指以低于浮点精度的位宽执行计算和存储张量的技术 量化模型以降低的精度而不是全精度 浮点 值对张量执行部分或全部运算 这允许更紧凑的模型表示以及在许多硬件平台上使用高性能矢量化操作 与典型的 FP32 模型相比 PyTorch
  • 容器技术之Chroot&Docker

    chroot 容器技术从1979年chroot的首次问世便已崭露头角 维基百科对chroot的定义如下 是在 Unix 和 Linux 系统的一个操作 针对正在运行的软件进程和它的子进程 改变它外显的根目录 一个运行在这个环境下 经由 ch
  • 清华梦的破碎--写给清华大学的退学申请

    注记 每个不是根据自己的爱好而是根据行业前景而选择互联网产业的学子都会遇到很多的困惑和迷茫 作为天才式的博士生王垠也曾遇到过很多类似的困境 读完这篇文章 感觉遇到不少的相同情况 或许这篇文章能够指引你不少的道路 故向你推荐这篇文章 清华梦的
  • 基于unapp的自定义picker组件

    基于unapp的自定义picker组件
  • 区块链在版权保护上有什么作用?

    我国在版权保护方面的制度和法律越来越完善 版权行业的规模也是不断扩大 虽然版权行业的确权的发展有一定的时间 但其还存在着一些问题 那目前比较前沿的区块链版权保护应用又能有效解决这些问题呢 根据腾讯研究员的数据 中国网络核心版权产业行业规模从
  • 【Java预科】CH02 常用快捷键和基本DOS命令

    上一课 MarkDown语法 常用快捷键 Tab键切换菜单键或空四个格子 shift键是功能键 ctrl键是控制键 alt键 具体使用 Ctrl C复制 Ctrl V粘贴 Ctrl A全选 Ctrl X剪切 Ctrl Z撤销 Ctrl A保
  • 无框架的底层代码实现普通RNN、LSTM的正反向传播过程及应用

    1 准备 首先导入所需要的包rnn utils py import numpy as np def softmax x e x np exp x np max x return e x e x sum axis 0 def sigmoid
  • 4小时入门深度学习+实操MMDetection 第二课

    视频 4小时入门深度学习 实操MMDetection 第二课 目标检测工具包 一完成目标检测 二完成实例分割 很方便可以进行模块替换 pytorch 4万多star 几行pathon API即可调用强大的检测能力 配置文件修改 可以训练自己
  • Linux命令行——touch命令详解

    1 命令功能 touch命令用于创建文件或修改文件 目录的时间戳 了解时间戳 可以查看Linux命令行 stat命令详解 2 语法格式 touch option file 3 参数选项 无选项 若文件不存在 则创建新的空文件 access
  • 【shell实战案例】批量注释nginx的重定向并进行文件对比

    业务背景 线上配置中nginx存在大量 return 301重定向的配置 根据必须注释 文件夹下有大量文件 每个文件都有很多行 由于登录服务器有点麻烦 希望通过shell脚本处理 如何注释 ls xargs I sed i 301 s 解释
  • 基于ESP8266的遥控小车

    如何操控小车 这个问题问的好 相信许多学习过单片机的小伙伴们都知道我们控制一个硬件的方法有很多种 例如红外遥控 蓝牙遥控等等 但是我们今天介绍的是用wifi和服务器进行遥控 那么wifi怎么控制我们的小车呢 其实原理与蓝牙相似 只不过esp