当前位置:   article > 正文

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

webserver esp8266

ESP8266和ESP32物联网智能小车开发系列文章目录

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



前言

    daodanjishui物联网核心原创技术之最简单DIY基于ESP8266的物联网智能小车①(webserver服务器网页简单遥控版)。
    市面上有各种开源ESP8266智能小车出售,但是有复杂的有简单的,如果想快速入门用专业的物联网技术制作的小成本高性价比的ESP8266智能小车,这个方案会给你一个快捷高效的方案。


一、最简单DIY基于ESP8266的物联网智能小车①(webserver服务器网页简单遥控版)是什么?

先看设计演示视频:https://v.youku.com/v_show/id_XNTE1NzU4ODc0NA==.html

最简单DIY基于ESP8266的物联网智能小车①

    距离我上次发布STC98C52RC的蓝牙遥控智能小车和STM32F103C8T6蓝牙遥控智能小车大概有一个月多了,今年的夏天额外炎热,笔记本电脑不断听歌编码火力全开,死机好几次,终于换来一个CSDN好的开头:上榜了!
在这里插入图片描述
    记得当时我还是用手机蓝牙调试助手来进行遥控小车,想想都有点搞笑。这次打算做一个ESP8266和ESP32智能小车的系列专题,跟大家一起玩玩智能小车,涉及远程控制,高速图传,嵌入式图像处理,云计算图像处理,集群控制,更新大家对智能小车的认知。大部分编码我已经完成了,就差整理开源代码和掏几万块编写教材了,小车的主题是围绕钢铁侠展开的,daodanjishui也是钢铁侠电影系列的影迷,也梦想某天能成为钢铁侠那样有科学技术又有money的土豪,但是现实总是很残酷啊,连代码都没有推广出去,就算是出书了也没人买,所以免费开源啦!
    这次的智能小车项目中,换了一个智能小车方案,采用国产芯片ESP8266核心板ESP-12F实现智能小车,ESP8266开发板介绍:mini D1 wifi ESP-12F N ESP8266开启你的物联网小车之旅吧!主控芯片采用国产ESP8266,支持国产从我做起,反对霸权主义,反对技术封锁,反对芯片垄断。现在很多物联网小玩具或者智能电子控制小设备都使用了这个芯片,当我第一次接触这个芯片的时候,我就迷上了这个芯片不可自拔,所以所以一直围绕这个芯片编码都没有停过。
功能描述:最简单DIY基于ESP8266的智能彩灯专栏也使用了ESP8266系列的核心板ESP-12F(后期也可以在车上结合智能彩灯)这次开源的智能小车主控使用搭载ESP-12F的开发板WeMos D1 R1,用的是的全部是某宝能买到的模块用杜邦线来连线而成的,不需要3D打印机,不需要绘制电路板,另外我选择ESP-12F做开发是有原因的:核心板体积小、舵机库不需要安装、功耗低、下载程序不需要按boot键。遥控器采用TestHttpPost.exe请求发送软件或者是手机app或者是网页浏览器。功能的大概就是http请求指令来控制小车四个方向运动和开灯关灯和舵机滑轮升降。小车的原型参照的是钢铁侠打loki用的战甲,两个大轮胎作为翅膀动力的源泉,舵机升降臂绑定轴承作为第三条腿伸展和收缩控制滑行,属于第一版MINI型原型机。下面是Arduino写的原创开源代码截图:
在这里插入图片描述
硬件全家福如下:
在这里插入图片描述
智能小车变身伸出第三条腿的智能小车如下:
在这里插入图片描述
小车模仿的原型是:
在这里插入图片描述
小车模仿效果:
在这里插入图片描述
智能小车肢解图:
在这里插入图片描述
智能小车虚拟控制界面如下:
在这里插入图片描述


二、制作步骤

1.准备硬件

(1)ESP8266开发板:mini D1 wifi ESP-12F N 在这里插入图片描述
原理图如下:
在这里插入图片描述

芯片包装如下:
在这里插入图片描述

(2)电机驱动模块在这里插入图片描述
(3)迷你升压模块:1.5V 1.8V 2.5V 3V 3.3V 3.7V 4.2V转5V DC-DC升压转换电源模块

在这里插入图片描述

(4)车轮2个,D字轴橡胶轮胎 机器人配件 43MM 循迹小车模型车轮 配N20减速电机
在这里插入图片描述
电机和固定夹子
在这里插入图片描述
在这里插入图片描述

(5)SG90舵机在这里插入图片描述
(6)18650电池

和电池夹
在这里插入图片描述
(7)牙线棒PVC包装盒 注意了,牙齿健康很重要,好的牙齿才能让你尝遍天下美食。
(8)法兰杯士轴承3X8X4 一个在这里插入图片描述
(9)螺丝若干,杜邦线若干,LED灯一盏,绝缘塑料膜若干,502胶水
在文章后面会附录教程的下载地址。制作很esay!

2.搭建Arduino开发环境和链接硬件和下载代码

(1)第一步下载Arduino IDE安装,双击下一步,下一步,直到完成,建议不要中文路径。

(2)下载ESP8266安装包插件,这是最方便的,如果在Arduino里面搜索安装,你会发现很慢,特别是在这个紧张的芯片之争的关键时期下,按照这个网址去下载:https://www.arduino.cn/thread-76029-1-1.html

(3)双击(2)下载的三个包中的一个,我双击安装的是第二个包,重启Arduino就可以安装好了。

安装好之后你会发现开发板选项多了ESP8266这类的开发板。实在不行就找其他教程再试试了,没有必要一步一步教这个开发环境搭建。
(4)根据下面的原理图来连接硬件:
在这里插入图片描述
(5)新建工程,复制粘贴独立原创代码
在这里插入图片描述

//国内ESP8266物联网智能小车开源项目1
//作者:daodanjishui
//时间:2021.5.18
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <Servo.h>
const byte DNS_PORT = 53;
IPAddress apIP(192, 168, 4, 1);
DNSServer dnsServer;
ESP8266WebServer webServer(80); 
Servo myservo;  // create servo object to control a servo
//GPIO2  -----D4 这个端口 就是舵机控制的端口

//首页示例网址,http://192.168.4.1
//控制网址的格式:http://192.168.4.1/HandleVal?ssid=daodanjishui&password=on
String  index_html(String WiFiAddr){
return  String("")+"<html> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /"+
"<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"+
"</head>"+
"<body>"+
"<h1>daodanjishui 经典物联网智能小车开源项目1</h1>"+
"<p></p> <form action=\"HandleVal\" method=\"\" name=\"\" >第一个参数是daodanjihsui,第二个参数是on或off或front或back或left或right或open或close,点击send发送控制指令给智能小车<br>"+
"<input type=\"text\" value=\"daodanjishui\" name=\"ssid\" id=\"cmd\" size=\"10\" maxlength=\"20\">"+
"<input type=\"text\" value=\"on\" name=\"password\" id=\"cmd1\" size=\"10\" maxlength=\"20\">"+
"<input type=\"submit\" value=\"send\" ><br>"+
"<h2>daodanjishui 原创经典值得期待!</h2>"+
" </form>"+
"</body>"+
"</html>";
}

#define LAMP_PIN 16
void handleRoot();
void handleRoot() {//对客户端请求返回值处理
  webServer.send(200, "text/html", index_html("192.168.4.1")); //!!!注意返回网页需要用"text/html" !!!
  Serial.println("用户访问了daodanjishuiESP8266智能小车主页");
}
void controlLamp(bool lampVal) {//点灯函数,GPIO16  -----D0
  pinMode(LAMP_PIN, OUTPUT);//设置为输出模式
  digitalWrite(LAMP_PIN, lampVal);//控制IO端口
  Serial.printf("Turn lamp %s\n", lampVal ? "On" : "Off");
}
void controlServo(bool ServoVal) {//舵机控制函数,GPIO2  -----D4
  int pos;
  if(ServoVal){//打开变形
       for (pos = 90; pos >= 0; pos -= 1) { // goes from 90 degrees to 0 degrees
         myservo.write(pos);              // tell servo to go to position in variable 'pos'
         delay(15);                       // waits 15ms for the servo to reach the position
      }
  }else{//关闭变形
    for (pos = 0; pos <=90; pos += 1) { // goes from 0 degrees to 90 degrees
      // in steps of 1 degree
      myservo.write(pos);              // tell servo to go to position in variable 'pos'
      delay(15);                       // waits 15ms for the servo to reach the position
    }
  }
  Serial.printf("Servo is %s\n", ServoVal ? "Open" : "Close");
}

//car GPIO Setting
extern int gpLb =  5; // Left 1  INT1---D1--GPIO5
extern int gpLf =  4; // Left 2  INT2---D2--GPIO4
extern int gpRb = 12; // Right 1 INT3---D6--GPIO12
extern int gpRf = 13; // Right 2 INT4---D7--GPIO13

void WheelAct(int nLf, int nLb, int nRf, int nRb)
{
 digitalWrite(gpLf, nLf);
 digitalWrite(gpLb, nLb);
 digitalWrite(gpRf, nRf);
 digitalWrite(gpRb, nRb);
}

/*****************************************************
 * 函数名称:HandleVal()
 * 函数说明:对客户端请求返回值处理
 * 参数说明:无
******************************************************/
void HandleVal()//控制网址的格式:http://192.168.4.1/HandleVal?ssid=daodanjishui&password=on
{
    String wifis = webServer.arg("ssid"); //从JavaScript发送的数据中找ssid的值
    String wifip = webServer.arg("password"); //从JavaScript发送的数据中找password的值
    Serial.println(wifis);
    Serial.println(wifip);  //在这里处理接收到的数据
    if(wifip.equals("on")&&wifis.equals("daodanjishui")){
         Serial.println("开灯");
         controlLamp(true);
      }else if(wifip.equals("off")&&wifis.equals("daodanjishui")){
         Serial.println("关灯");
          controlLamp(false);
      }else if(wifip.equals("front")&&wifis.equals("daodanjishui")){//前进
         Serial.println("front");
         WheelAct(HIGH, LOW, HIGH, LOW);
         delay(1000);//延时1秒
         WheelAct(LOW, LOW, LOW, LOW);
      }else if(wifip.equals("back")&&wifis.equals("daodanjishui")){//后退
         Serial.println("back");
         WheelAct(LOW, HIGH, LOW, HIGH);
         delay(1000);//延时1秒
         WheelAct(LOW, LOW, LOW, LOW);
      }else if(wifip.equals("left")&&wifis.equals("daodanjishui")){//左转
         Serial.println("left");
         WheelAct(HIGH, LOW, LOW, HIGH);
         delay(300);//延时0.3秒
         WheelAct(LOW, LOW, LOW, LOW);
      }else if(wifip.equals("right")&&wifis.equals("daodanjishui")){//右转
         Serial.println("right");
         WheelAct(LOW, HIGH, HIGH, LOW);
         delay(300);//延时0.3秒
         WheelAct(LOW, LOW, LOW, LOW);
      }else if(wifip.equals("stop")&&wifis.equals("daodanjishui")){//停止
         Serial.println("stop");
         WheelAct(LOW, LOW, LOW, LOW);
      }else if(wifip.equals("open")&&wifis.equals("daodanjishui")){//变形
         controlServo(true);//打开变形
      }else if(wifip.equals("close")&&wifis.equals("daodanjishui")){//关闭变形
         controlServo(false);//关闭变形
      }
    String  cmd="ssid="+wifis+" password="+wifip+" is OK";  
    webServer.send(200, "text/plain", cmd);//在这里返回数据给客户端
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP("DNSServer example");

  pinMode(gpLb, OUTPUT); //Left Backward
  pinMode(gpLf, OUTPUT); //Left Forward
  pinMode(gpRb, OUTPUT); //Right Forward
  pinMode(gpRf, OUTPUT); //Right Backward
  //initialize
  digitalWrite(gpLb, LOW);
  digitalWrite(gpLf, LOW);
  digitalWrite(gpRb, LOW);
  digitalWrite(gpRf, LOW);
  
  myservo.attach(2);  // attaches the servo on GIO2 to the servo object
  myservo.write(90);//舵机归零
 
  // modify TTL associated  with the domain name (in seconds)
  // default is 60 seconds
  dnsServer.setTTL(300);
  // set which return code will be used for all other domains (e.g. sending
  // ServerFailure instead of NonExistentDomain will reduce number of queries
  // sent by clients)
  // default is DNSReplyCode::NonExistentDomain
  dnsServer.setErrorReplyCode(DNSReplyCode::ServerFailure);

  // start DNS server for a specific domain name
  dnsServer.start(DNS_PORT, "www.daodanjishui.com", apIP);

  // simple HTTP server to see that DNS server is working
  webServer.on("/", HTTP_GET,handleRoot);//显示主页
  webServer.on("/HandleVal", HTTP_GET, HandleVal);//接收提交的参数
  webServer.onNotFound([]() {
    String message = "Hello World!\n\n";
    message += "URI: ";
    message += webServer.uri();

    webServer.send(200, "text/plain", message);
  });
  webServer.begin();
   Serial.println("webServer is ok");   
}

void loop() {
  dnsServer.processNextRequest();
  webServer.handleClient(); 
  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173

(6)安装工程运行需要的库:#include <DNSServer.h>
#include <Servo.h> ,因为用到舵机和DNS,所以要安装库,否则可能会出现编译出错。安装库有两个办法,一种是直接在Arduino里面搜索在线安装,一种是在网上下载好再导入Arduino
(7)配置开发板和串口信息
在这里插入图片描述
注意选择的是什么型号的开发板型号还有你自己开发板连上电脑之后是占用的是哪个串口号

(8)编译下载程序。(这个部分不懂的读者可以去百度看看啦,最简单的过程了)

3.智能小车与智能彩灯有什么关系?

    智能小车专栏与智能彩灯专栏都采用了ESP8266来设计,都是基于Arduino IDE开发的,不是原来那种用AT固件通过另外外加单片机用过AT指令去控制ESP8266去实现网络操作(参考我:ESP8266 AT固件物联网控制 专栏),这次是用SDK的方式进行的开发,用到各种库和各种函数,最为经典的就是WebServer库了,这是一个嵌入式服务器库,单片机成为一个嵌入式网关。代码量不小的,几天时间是不可能完全掌握这个代码的构造的,但是作为制作电子设计,我们会使用其函数实现其功能即可。如果要深究C语言技术,我建议读者看我:STM32库函数开发专栏肯定能行得通的。后者期待我准备要出的物联网智能路由器二次开发专栏,确保读者有鱼又有熊掌。


三、运行与调试

1.准备硬件
2.根据下载的原理图接线
3.根据下载的源码和原理图指南下载程序到ESP8266
4.上电
5.用笔记本电脑连上ESP8266产生的WIFI热点DNSServer example,这个ESP8266开启的是AP热点模式,说白就是建立了一个名字为DNSServer example的热点,访问的IP地址是192.168.4.1,所以用手机或者笔记本电脑的浏览器访问之后就能访问小车的主页。在主页里面输入提示的指令就可以控制小车做动作。
6.在笔记本电脑的浏览器网址输入区输入192.168.4.1
在这里插入图片描述
7.在网页根据指令提示控制小车
在这里插入图片描述
8.在CSDN下载的TestHttpPost.exe软件,打开,输入地址如下
在这里插入图片描述
看到小车开灯,和返回的ok响应,其他操作按照网页的提示进行
9.其他操作请看博文介绍和视频演示。


总结

    通过上面运行与调试状态良好,程序和硬件达到博文提出的要求,到此为止。虽然这次用刷新提交表单的形式在浏览器控制智能小车和用发送http get请求的软件来控制物联网智能小车,但是不代表我就只能实现这个功能,后期我会做到用ajax技术提交异步请求做到不刷新表单的形式控制小车,还能做到用手机app无线控制小车,并且升级使用ESP32CAM实现图像处理智能小车,更多精彩请关注我相关系列的项目,下期更精彩,争取将钢铁侠电影中的设备带到现实当中,把其原创源码开源奉献出来。
    如果是安装开发环境出了问题,那么请大家仔细上网搜寻解决问题的方案;如果是怀疑我代码写错了,那么是不可能的,代码我自己写,自己硬件测试。如果有更多的需求请私下找我交流,我缺的不是技术,而是一个奇特的想法或者创意······

最后附上本博文代码下载地址
https://www.cirmall.com/circuit/24391/
直接跳转

CSDN下载通道:https://download.csdn.net/download/niruxi0401/21762647

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号