ubuntu wifi固定ip_自制wifi遥控小车!ESP8266实践指南(二)

上次带大家利用ESP8266自制了wifi控制的LED点阵屏幕,大家觉得怎么样呢? 手把手教你用wifi控制显示屏!ESP8266实践指南(一)

今天我们来做点更有意思的~ wifi遥控小车!

78e230bf30bf30816dd40bcdc12378ac.png

一、所需材料

  • ESP8266 NodeMCU开发板:这次我们使用CP2102芯片的那款NodeMCU,优点是体积更小一点,更适合小车这种体积受限的场景。
  • L9110电机控制模块
  • 面包板:方便接线
  • 两轮小车底盘套装,包含:塑料底盘,电机x2, 轮子x2,万向轮,5号电池盒
  • 公对公杜邦线若干
  • 5号电池4节
  • 手机移动电源一个
27eae84873ea7329ccf567b061541bef.png
d2bb818d28f219be445a5c1c47decb1c.png

二、组装小车

先按照说明书把小车底盘套装组装起来:

21a811f832b217cbaf875034367bc9f6.png

然后将ESP8266,L9110固定在面包板上,并按照线路图连接:

28162ace203949086ddb27f3981c0bcf.png

实际接线效果大致如图:

6c16027a3fabb4b3823935911a778202.png
88a65edc8e962e3de87bd45f090f1ce5.png
0bfef06166458e6636bf6a50f8c47e54.png

固定电池盒和充电宝:

4节串联的5号电池用于给L9110供电,而充电宝用于通过usb接口给NodeMCU开发板供电。

一开始,我尝试了直接使用充电宝给NodeMCU开发板供电,然后L9110的VCC接NodeMCU的VIN,GND接NodeMCU的GND来供电。这样的话,简单便捷,不需要两套供电。但是不幸的是,动力电路走开发板的VIN确实会有问题:在电机运转一会儿后,开发板会重启。

于是后来我还是用上了电池盒,用电池盒给L9110供电,正负极分别接VCC, GND就可以了。

c0aed5614835ccb3f94357d27c6f1a01.png
c413307749b2c377d861e1e73a4b5c89.png
f959012b9a0143f0dfaf18aca207e255.png

在连接好开发板,电机,电源之后,摆放好各个部件,用双面胶固定到位即可。有条件的话,电机的正负电源线建议使用电烙铁和焊锡固定好,防止震动导致松动。

三、上传代码

有关ESP8266的开发环境配置在这里不在赘述,之前没有设置的朋友看这里~ 很简单哦~

十块钱入门物联网!ESP8266新手指南

将以下代码复制到Arduino IDE:

// Simple WiFi-controlled car on NodeMCU and L9110 motor drive board// OrangeZero 零度橙子@头条// source code modified from Alan Wang@hackster.io#include #include // WiFi settings#define WIFI_MODE           1                     // 1: AP模式,NodeMCU自身起一个wifi信号;2:SA模式,NodeMCU连上一个已有wifi。推荐使用AP模式#define SSID_AP             "NodeMCU_WiFi_Car"    // for AP mode#define PASSWORD_AP         "12345678"            // for AP mode#define SSID_STA            "your_wifi_ssid"      // for STA mode#define PASSWORD_STA        "your_wifi_password"  // for STA mode// motor settings#define RIGHT_MOTOR_PIN1    4                     // pin 1 of right motor (D2)#define RIGHT_MOTOR_PIN2    5                     // pin 2 of right motor (D1)#define LEFT_MOTOR_PIN1     12                    // pin 1 of left motor (D6)#define LEFT_MOTOR_PIN2     14                    // pin 2 of left motor (D5)#define MOTOR_SPEED   1200                        // speed for motorIPAddress local_ip(192, 168, 1, 1); //IP for AP modeIPAddress gateway(192, 168, 1, 1); //IP for AP modeIPAddress subnet(255, 255, 255, 0); //IP for AP modeESP8266WebServer server(80);int car_mode = 0; // set car drive mode (0 = stop)// initializevoid setup() {  Serial.begin(9600);  Serial.println("NodeMCU Wifi Car");  pinMode(RIGHT_MOTOR_PIN1, OUTPUT);  pinMode(RIGHT_MOTOR_PIN2, OUTPUT);  pinMode(LEFT_MOTOR_PIN1, OUTPUT);  pinMode(LEFT_MOTOR_PIN2, OUTPUT);  car_control(); // stop the car  if (WIFI_MODE == 1) { // AP mode    WiFi.softAP(SSID_AP, PASSWORD_AP);    WiFi.softAPConfig(local_ip, gateway, subnet);  } else { // STA mode    WiFi.begin(SSID_STA, PASSWORD_STA);    Serial.print("Connecting to WiFi...");    while (WiFi.status() != WL_CONNECTED) {      delay(100);      Serial.print(".");    }    Serial.println("");    Serial.print("Connected! IP: ");    Serial.println(WiFi.localIP()); //the IP is needed for connection in STA mode  }  // setup web server to handle specific HTTP requests  server.on("/", HTTP_GET, handle_OnConnect);  server.on("/forward", HTTP_GET, handle_forward);  server.on("/backward", HTTP_GET, handle_backward);  server.on("/left", HTTP_GET, handle_left);  server.on("/right", HTTP_GET, handle_right);  server.on("/stop", HTTP_GET, handle_stop);  server.onNotFound(handle_NotFound);  //start server  server.begin();  Serial.println("NodeMCU web server started.");}// handle HTTP requests and control carvoid loop() {   server.handleClient();  car_control();}// HTTP request: on connectvoid handle_OnConnect() {  car_mode = 0;  Serial.println("Client connected");  server.send(200, "text/html", SendHTML());}// HTTP request: stop carvoid handle_stop() {  car_mode = 0;  Serial.println("Stopped");  server.send(200, "text/html", SendHTML());}// HTTP request: go forwardvoid handle_forward() {  car_mode = 1;  Serial.println("Go forward...");  server.send(200, "text/html", SendHTML());}// HTTP request: go backwardvoid handle_backward() {  car_mode = 2;  Serial.println("Go backward...");  server.send(200, "text/html", SendHTML());}// HTTP request: turn leftvoid handle_left() {  car_mode = 3;  Serial.println("Turn left...");  server.send(200, "text/html", SendHTML());}// HTTP request: turn rightvoid handle_right() {  car_mode = 4;  Serial.println("Turn right...");  server.send(200, "text/html", SendHTML());}// HTTP request: othervoid handle_NotFound() {  car_mode = 0;  Serial.println("Page error");  server.send(404, "text/plain", "Not found");}// control car movementvoid car_control() {  switch (car_mode) {    case 0: // stop car      digitalWrite(RIGHT_MOTOR_PIN1, LOW);      digitalWrite(RIGHT_MOTOR_PIN2, LOW);      digitalWrite(LEFT_MOTOR_PIN1, LOW);      digitalWrite(LEFT_MOTOR_PIN2, LOW);      break;    case 1: // go forward      analogWrite(RIGHT_MOTOR_PIN1, MOTOR_SPEED);      digitalWrite(RIGHT_MOTOR_PIN2, LOW);      analogWrite(LEFT_MOTOR_PIN1, MOTOR_SPEED);      digitalWrite(LEFT_MOTOR_PIN2, LOW);      break;    case 2: // go backward      digitalWrite(RIGHT_MOTOR_PIN1, LOW);      analogWrite(RIGHT_MOTOR_PIN2, MOTOR_SPEED);      digitalWrite(LEFT_MOTOR_PIN1, LOW);      analogWrite(LEFT_MOTOR_PIN2, MOTOR_SPEED);      break;    case 3: // turn left      analogWrite(RIGHT_MOTOR_PIN1, MOTOR_SPEED);      digitalWrite(RIGHT_MOTOR_PIN2, LOW);      digitalWrite(LEFT_MOTOR_PIN1, LOW);      analogWrite(LEFT_MOTOR_PIN2, MOTOR_SPEED);      break;    case 4: // turn right      digitalWrite(RIGHT_MOTOR_PIN1, LOW);      analogWrite(RIGHT_MOTOR_PIN2, MOTOR_SPEED);      analogWrite(LEFT_MOTOR_PIN1, MOTOR_SPEED);      digitalWrite(LEFT_MOTOR_PIN2, LOW);  }}// output HTML web page for userString SendHTML() {  String html = ""  ""  ""  "NodeMCU Wifi Car by OrangeZero"  ""  ""  ""  "
" "

NodeMCU Wifi Car by OrangeZero

" "
" "" "" "
" "" "
" "" "
" "" "
" "" "" "
" "Copyright 2020 OrangeZero" "" ""; return html;}

点击上传按钮,稍等片刻,等待上传完成:

d85a9cdd2833c6a05d11956053c4b8c7.png

四、开动小车!

到这里我们的小车就制作完成了!让我们来发动小车吧~

在打开移动电源的开关,连接好电池盒的正负极之后,稍等片刻,我们就可以搜索到wifi信号:

NodeMCU WiFi Car

12623945f54b7cd69fa7872b0300ec2f.png

手机连接wifi之后,在浏览器中打开:192.168.1.1

点击相关按钮就可以操纵小车前进,后退,转向,还有停止了~

5144dadce80f0a5fde62b9a0d7085887.png

大家有没有觉得并没有那么难,而且成就感满满的呢~

大家有什么还有什么想要做的物联网或者智能家居项目呢?在下面留言告诉我吧~


我是零度橙子,装机爱好者,科技达人,谷歌认证云计算架构师,大家可以关注我,了解有用有趣的科技知识~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

micopython 18b20_[MicroPython]stm32f407控制DS18B20检测温度

1.实验目的 1. 学习在PC机系统中扩展简单I/O 接口的方法。 2. 进一步学习编制数据输出程序的设计方法。 3. 学习DS18B20的接线方法,并利用DS18B20检测当前温度。 2.所需元器件 F407Micropython开发板1块 数据线1条 DS18b20温度传感器1个 DS18B20测温模块(不含DS18B2…

float php 运算_写给 PHP 程序员的 Python 学习指南

文 | 汤青松SegmentFault编辑 | EarlGrey推荐 | 编程派公众号(ID:codingpy)一、背景人工智能这几年一直都比较火,笔者一直想去学习一番;因为一直是从事PHP开发工作,对于Python接触并不算多,总是在关键时候面临着 基础不…

类似ftp文件服务器有哪些,FTP的替代品有哪些,你知道吗?

在某些情况下,需要从服务器上传(或下载)文件。多年来,最流行的文件传输方法是文件传输协议(FTP)。FTP的一大优点是它支持断点续传。FTP收获了方便性,却在安全性上有所欠缺。FTP未加密,这意味着格式是开放的,文件可能在…

case里面两个条件_Go语言条件语句之 switch 语句

点击上方蓝色 “铁匠学编程” 关注我,让我们一起学习!switch语句会根据传入条件不同,选择不同的分支执代码进行执行,他可以代替多个 if else 子句,Go 语言的分支语句和 PHP 的类似,Go 不需要显示的通过brea…

api 二次 开发 禅道_浅谈-软件开发流程

先直接放出我对软件开发的相关人员职责和流程:图一:软件开发的相关人员职责以下是截屏的开发流程泳道图:横轴是相关开发人员的工作模块;纵轴是从上至下开发时序周期。图二:软件开发的流程图从职责图和流程图对应到我们…

光遇安卓服务器维修,《光遇》渠道服更换手机解决办法

《光遇》游戏中渠道服更换手机怎么办?很多小伙伴更换手机后登陆游戏发现自己还需要重头开始,很多小伙伴表示不知道怎么找回之前的渠道服账号和数据?当然IOS玩家不用担心,如果更换IOS可以继续使用账号,但是IOS更换安卓是…

线程中task取消_Rust Async: async-task源码分析

async-std是rust异步生态中的基础运行时库之一,核心理念是合理的性能 用户友好的api体验。经过几个月密集的开发,前些天已经发布1.0稳定版本。因此是时候来一次深入的底层源码分析。async-std的核心是一个带工作窃取的多线程Executor,而其本…

extjs 方法执行顺序_TestNG之注解变压器amp;方法拦截器

一.注解变压器TestNG允许在执行期间修改所有注解的内容。当源代码中的注解大部分是正确的,但是有一些时刻你想要重写他们的值时,这个是非常有用的。可以使用注解变压器实现。注解变压器是一个实现了接口的类:public interface IAnnotationTra…

服务器升级中暂不可修改怎么回事,抖音服务器升级中,暂不支持本地区开播抖音怎么在法国直播?...

抖音服务器升级中,暂不支持本地区开播抖音怎么在法国直播?除了餐饮,腾讯自主研发的各种跨界开发节目也无人问津。至于年初腾讯app项目和资源,还没有整体发布,不过,神似的行业信息也有公布。这其中对爆红的博…

keil 查看 stm32 io波形_你知道 KEIL 自带示波器吗?

导读:很多时候我们并不满足于查看变量的值,可能还想看这个变量的历史变化,同时以波形的方式显示出来,这就需要了解 KEIL 另一个有趣的东西:逻辑分析仪。效果图:以 STM32F103RET6,外接 8M 晶振&a…

ai怎么取消颗粒效果_AI教程3个超实用设计技巧教程

1-AI教程-矢量颗粒墨点字体教程第一步选择自己需要图形第二步画一个一样大的黑白渐变,放上最上层。第三步效果-像素化-铜板雕刻第四步选择,粒状点,其他的也可以自己尝试。第五步对象-扩散-外观第六步图像描摹同时点击 扩展第七步选择图形&…

企业门户网站服务器,企业或个人门户网站对服务器前的重要准备 - 酷番云

互联网被称为继报纸、广播、杂志和电视之后的第五大数字媒体。因为传统媒体的高成本。而且还受到时间和地域的限制,除非你付出高昂代价,否则效果不太好。互联网是展示世界的窗口,也是信息交流的双向交流工具。成本低,回报丰厚。互联网已经成为越来越多企…

机器人踩滑板_不死神草、飞行滑板…超2000种创新发明在这里展出

便捷式单人飞行滑板、空海光电搜跟设备、“踩不死”的草坪…第二十四届全国发明展览会一带一路暨金砖国家技能发展与技术创新大赛今天(11月19日)上午在佛山市潭洲国际会展中心开幕戳视频看看有啥好玩↓ ↓ ↓视频来源:醒目视频智能中医艾灸床便捷式单人飞行滑板…

区分错误类型_数仓|几种SQL隐藏的错误,你遇到过吗?

本文分享主要描述了几种书写SQL时常见的一些隐藏错误,主要包括:在运算符中使用null值、在聚合数据时使用null值、求平均值时使用判断条件、滤条件中使用and和or、查询的列字段之间缺少逗号分隔、inner join与left join。都是一些比较细节的点&#xff0c…

-9 逆序输出一个整数的各位数字_【Java编程基本功】(八)逆序输出、是否为回文数,判断星期几,升序排列...

第二十四题给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。代码:public 第二十五题一个5位数,判断它是不是回文数。代码:public 代码2:public 第二十六题请输入星期几…

动词变名词的变化规则_动词第三人称单数的变化规则及练习(含语音)

点击上面蓝字关注我“点击即可听录音”1. 大部分单词可以直接在动词后:s例:like -- likes play -- playsShe likes cola.发音规则:所加的“s”在清辅音后,发【s】,works在浊辅音及元音后,发【z】, plays在…

c语言sleep函数_做游戏,学C语言,小球碰撞游戏,菜鸡者从黑窗口到图形化编程...

CMD黑窗口小球运动这次教程,我们实现一个弹跳小球。需要学习完基础的变量、运算符、表达式,printf、scanf输入输出函数的用法,if-else、while、for语句的用法。第1步,显示静止的小球。效果为:第2步让小球斜着弹跳。主要…

语言五子棋无ai程序框图_2020输入法报告 如何选择更好的AI语音输入法?

不少人认为,现在输入法均已内置语音输入方式,只要是语音输入就没有什么差别。其实不然。近日,Mob研究院发布《2020中国第三方输入法行业洞察》报告,深入挖掘分析语音输入法行业现状及变化趋势。《报告》统计显示,讯飞输…

对应的ctrl_取消单元格合并,对空白单元格填充数据,学会Ctrl+Enter五秒搞定

Excel统计数据过程中,相信大家最不想碰到的就是合并单元格,因为合并区域会对我们的数据统计造成各种麻烦。取消单元格合并后,除第一个单元格有内容外其他的单元格都成了空值。案例说明:如上图所示,我们需要将左边合并单…

对比两个字符串相等_字符串匹配问题

0.题目在一个主串S{a, b, c, c, b, c, a, b, d}, 模式串T{a, b, d};请找出模式串在主串中第一次出现的位置提示: 不需要考虑字符串大小写问题,字符均为小写字母第一次在7的位置匹配上1.BF算法Brute-Force算法,简称为 BF算法,是一种简单朴素的…