ESP8266从点灯到遥控小车(三)——组装小车,0代码开发APP控制小车

ESP8266从点灯到APP遥控小车(三)——组装小车,0代码开发APP控制小车

所需组件

  • ESP8266开发板
  • 已配置好的Arduino IDE环境(配置传送门)
  • 数据线
  • L298N电机驱动模块
  • 12V电池组(电源)
  • 充电宝
  • 小车车身及零件(传送门

一、小车所需组件

1.ESP8266-NodeMCU 开发板

ESP8266 是一款适用于物联网和家庭自动化项目的 Wi-Fi 模块。

ESP8266-NodeMCU是一个开源硬件开发板,由于它允许您像使用 Arduino 一样控制输入和输出,且附带ESP8266 Wi-Fi 模块,支持WIFI功能,所以在物联网(IOT)领域,Arduino开发板最大的对手之一就是ESP8266-NodeMCU开发板。

在这里插入图片描述

2.L298N电机驱动模块

为什么要使用电机驱动模块?

单片机的IO口只能提供几毫安到十几毫安的电流,而绝大部分设备工作需要电流都较大,远远大于这个值,比如电机工作所需的电流,因此用单片机来控制这些设备就需要将电流放大,所以要用驱动电路甚至驱动设备。


本次使用的L298N电机驱动模块

  • 采用L298N双桥直流电机驱动芯片
  • 工作电压范围5V-35V,如果需要从模块内取电,则供电范围为7V-35V
  • 峰值输出电流2A
  • 每个通道有一个使能输入端
  • 可以驱动两个直流电机或者一个四线步进电机

在这里插入图片描述

这里我们需要用的是12V供电,供电GND,逻辑输入,输出A和输出B(使能暂时不用,这部分是用来进行PWM输出的,可以进行调速)

在这里插入图片描述

逻辑输入:IN1和IN2为一组,对应OutA(输出A);IN3和IN4为一组,对应OutB(输出B)。

(IN1,IN2,IN3,IN4接ESP8266单片机的对应引脚,输出A和输出B接两个电机,即可实现单片机控制电机,IN1和IN2控制A,IN3和IN4控制B)

3.12V电池组(电源)

在这里插入图片描述

(这边建议顺便把充电线也买了)

4.小车车身及零件

由于是简单入门实践,所以先整了个最便宜的练练手——>车身及零件传送门

在这里插入图片描述

二、小车组装及接线(直接上手)

1.车身组装

略,直接观看商家的教程即可

2.组件接线(电源正负千万不能接反,红正黑负)

不用充电宝,也可以考虑用2 节 AA 纽扣电池给 ESP8266 供电。
ESP8266的工作电压为3V~3.6V,建议的电压为3.3V

在这里插入图片描述

L298NESP8266开发板
IN1D5
IN2D6
IN3D7
IN4D8
GNDGND

对应的IO口:

D5->14 ,D6->12 ,D7->13 ,D8->15

3.组装完毕效果图

我这边比较剑走偏锋了,锂电池组手动焊接组装的,为了安全,大家还是按规矩来

在这里插入图片描述

三、控制源码

1.思路分析

①在上一章节《搭建http网络服务器,实现网页点灯》中,我们已经学会使用ESP8266开发板搭建http网络服务器,实现了网页点灯,以及课后作业中实现了多个按钮来回点灯


②以上是通过搭建http网络服务器,当有http的get或post请求去访问相应的服务器路径时,服务器就会监听到并调用相应的函数执行对应的功能,实现点灯或者返回资源


③因此,我们只需要设置不同的服务器路径(如,/up,/down,/left,/right)并监听和调用函数实现相应功能(前进,后退,左转,右转)即可


2.源码展示

/**********************************************************************
项目名称/Project      : ESP8266APP遥控小车
程序名称/Program name : ESP8266car
程序目的/Purpose      : 使用ESP8266搭建http网络服务器,开发APP进行控制
项目作者/Author       : ArsenLupin
***********************************************************************/
#include <ESP8266WiFi.h>        // 本程序使用 ESP8266WiFi库
#include <ESP8266WebServer.h>   //  ESP8266WebServer库

// WiFi
const char *ssid = "A"; // 连接的wifi名称
const char *password = "123456789";  // WiFi密码

//创建一个变量led来存放需要控制的引脚号
int led = 2;        

//创建WiFi对象
WiFiClient espClient; 
//创建网络服务器对象,该对象用于响应HTTP请求,监听端口(80)    
ESP8266WebServer webserver(80);  

//处理相应请求的回调函数
void handleRoot();
void handleLEDPost();
void handleLEDGet();
void handleNotFound();

//控制小车的请求回调函数
void handleLEDGetUp();
void handleLEDGetDown();
void handleLEDGetLeft();
void handleLEDGetRight();
void handleLEDGetStop();

void setup(void){
  Serial.begin(115200);   // 设置窗口波特率,启动串口通讯
  pinMode(led, OUTPUT);   //引脚2为输出模式
  //控制小车的引脚
  pinMode(14, OUTPUT);   
  pinMode(12, OUTPUT); 
  pinMode(13, OUTPUT); 
  pinMode(15, OUTPUT);

  WiFi.begin(ssid, password);       //连接WiFi
  Serial.println("Connecting ...");
                                 
  // WiFi.status()表示的是当前WiFi连接状况,while会让WiFi一直连接成功才跳出
  while (WiFi.status() != WL_CONNECTED) {    
    delay(500);
    Serial.print(".");   
  }                                          

   //当WiFi连接成功,打印连上的WiFi名称和esp8266的ip地址
    Serial.print("\nConnected to ");
    Serial.println(WiFi.SSID());              
    Serial.print("ESP8266-ip:");
    Serial.println(WiFi.localIP());                   

    //创建web服务
    webserver.on("/",handleRoot);  //监听根目录,调用回调函数

    //监听ip地址下的/hello目录,匿名函数回调请求内容,状态码200表示请求成功,返回text类型下的plain类型内容
	webserver.on("/hello",[](){webserver.send(200,"text/plain","hello");});
   
    //监听/LED,监听post请求
    webserver.on("/LED",HTTP_POST,handleLEDPost);
    //监听/led,监听get请求
    webserver.on("/led",HTTP_GET,handleLEDGet);
    
    //监听小车的访问目录,监听get请求,调用相应函数
    webserver.on("/up",HTTP_GET,handleLEDGetUp);
    webserver.on("/down",HTTP_GET,handleLEDGetDown);
    webserver.on("/right",HTTP_GET,handleLEDGetRight);
    webserver.on("/left",HTTP_GET,handleLEDGetLeft);
    webserver.on("/stop",HTTP_GET,handleLEDGetStop);

    //当找不到目录时,匿名函数返回提示
    webserver.onNotFound(handleNotFound);

    //启动web服务
    webserver.begin();
    //告知用户网络服务功能已经启动
    Serial.println("HTTP esp8266-Webserver started");   
}
 
void loop(void){
  //检查http访问,处理客户端连接
  webserver.handleClient();  
}

//处理根目录访问的回调函数
void handleRoot() {  
    String HTML="<!DOCYPYE html>\
      <html>\
	<head><meta charset='utf-8'></head>\
	<body>你好!ESP8266的web服务器欢迎您!\
  <form action=\"/led\"><input type=\"submit\" value=\"Get led\"></form>\
<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Post LED\"></form>\
  </body>\
      </html>";     
  webserver.send(200, "text/html", HTML);
}
 
//处理Get访问/LED目录的回调函数
void handleLEDGet() {                          
  digitalWrite(led,!digitalRead(led));// 改变LED的点亮或者熄灭状态
  webserver.send(200,"text/html","Led is Change.");
}
//处理Get访问/up目录的小车前进函数
void handleLEDGetUp() {  
  digitalWrite(14,LOW);
  digitalWrite(12,HIGH);
  digitalWrite(13,LOW);
  digitalWrite(15,HIGH);                        
  webserver.send(200,"text/html","Car is up.");
}
//处理Get访问/down目录的小车后退函数
void handleLEDGetDown() {                          
  digitalWrite(14,HIGH);
  digitalWrite(12,LOW);
  digitalWrite(13,HIGH);
  digitalWrite(15,LOW);
  webserver.send(200,"text/html","Car is Down.");
}
//处理Get访问/left目录的小车左转函数
void handleLEDGetLeft() {                          
  digitalWrite(14,HIGH);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);
  digitalWrite(15,HIGH);  
  webserver.send(200,"text/html","Car is Left.");
}
//处理Get访问/right目录的小车右转函数
void handleLEDGetRight() {                          
  digitalWrite(14,LOW);
  digitalWrite(12,HIGH);
  digitalWrite(13,HIGH);
  digitalWrite(15,LOW);  
  webserver.send(200,"text/html","Car is Right.");
}
//处理Get访问/stop目录的小车停止函数
void handleLEDGetStop() {                          
  digitalWrite(14,LOW);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);
  digitalWrite(15,LOW);
  webserver.send(200,"text/html","Car is stop.");
}

//处理Post访问/LED目录的回调函数
void handleLEDPost() {                          
  digitalWrite(led,!digitalRead(led));      // 改变LED的点亮或者熄灭状态
  webserver.sendHeader("Location","/");     // 跳转回页面根目录
  webserver.send(303);                      // 发送Http相应代码303 跳转  
}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){
  webserver.send(404, "text/plain", "404: Not found"); // 发送 HTTP 状态 404 (未找到页面) 并向浏览器发送文字 "404: Not found"
}

3.代码扩展部分

相比于之前的网页点灯,以下是具体增加的代码部分

设置控制小车的引脚

  //控制小车的引脚
  pinMode(14, OUTPUT);   
  pinMode(12, OUTPUT); 
  pinMode(13, OUTPUT); 
  pinMode(15, OUTPUT);

设置小车的访问目录以及触发的相应回调函数(这里全采用了get请求,这样APP控制比较方便)

//监听小车的访问目录,监听get请求,调用相应函数
webserver.on("/up",HTTP_GET,handleLEDGetUp);
webserver.on("/down",HTTP_GET,handleLEDGetDown);
webserver.on("/right",HTTP_GET,handleLEDGetRight);
webserver.on("/left",HTTP_GET,handleLEDGetLeft);
webserver.on("/stop",HTTP_GET,handleLEDGetStop);

完善控制小车的具体函数功能(有时,因为电机的接线不一样,函数功能还是要根据实际情况来编写)

//处理Get访问/up目录的小车前进函数
void handleLEDGetUp() {  
  digitalWrite(14,LOW);
  digitalWrite(12,HIGH);
  digitalWrite(13,LOW);
  digitalWrite(15,HIGH);                        
  webserver.send(200,"text/html","Car is up.");
}
//处理Get访问/down目录的小车后退函数
void handleLEDGetDown() {                          
  digitalWrite(14,HIGH);
  digitalWrite(12,LOW);
  digitalWrite(13,HIGH);
  digitalWrite(15,LOW);
  webserver.send(200,"text/html","Car is Down.");
}
//处理Get访问/left目录的小车左转函数
void handleLEDGetLeft() {                          
  digitalWrite(14,HIGH);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);
  digitalWrite(15,HIGH);  
  webserver.send(200,"text/html","Car is Left.");
}
//处理Get访问/right目录的小车右转函数
void handleLEDGetRight() {                          
  digitalWrite(14,LOW);
  digitalWrite(12,HIGH);
  digitalWrite(13,HIGH);
  digitalWrite(15,LOW);  
  webserver.send(200,"text/html","Car is Right.");
}
//处理Get访问/stop目录的小车停止函数
void handleLEDGetStop() {                          
  digitalWrite(14,LOW);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);
  digitalWrite(15,LOW);
  webserver.send(200,"text/html","Car is stop.");
}

四、0代码开发APP控制小车

这部分我们采用长按和松开的方式来控制小车

实现原理:

长按时,发送相应的get请求,调用相应的函数即可;松开时,同理发送停止命令的get请求,调用停止函数

1.登录MIT App Inventor

MIT App Inventor网页版传送门

打开后,来到登录界面,选择QQ登录即可

在这里插入图片描述

2.创建项目

点击项目,选择新建项目

在这里插入图片描述

当前的新项目

在这里插入图片描述

3.添加Web客户端组件

在左侧 “组件面板” 点击 “通讯连接” ,长按选择 “Web客户端” ,拖拽到手机的空白页即可

在这里插入图片描述

4.添加标签文本框,展示主题和创作人

在这里插入图片描述

此时,在右侧 “组件列表” 中选择我们的标签文本,在 “组件属性” 中,根据自己想法修改相应的参数

我的修改及效果如下:

在这里插入图片描述

在这里插入图片描述

添加创作人同上

在这里插入图片描述

5.添加文本输入框(用来获取ESP8266的web服务器访问地址)

在这里插入图片描述

根据自己的想法,调节右侧中文本输入框的相应参数

在这里插入图片描述

我的参数及效果图:

在这里插入图片描述

在这里插入图片描述

6.添加表格,实现两行三列存放按钮

在这里插入图片描述

调节属性参数

在这里插入图片描述

拖入4个按钮

在这里插入图片描述

对第一个按钮进行重命名和参数修改

“重命名”第一个按钮

在这里插入图片描述

修改第一个按钮的参数

在这里插入图片描述

效果图如下:

在这里插入图片描述

其他的按钮参照第一个来修改即可,以此类推

为了协调一点,我的 “左转” 和 “右转” ,宽度比例设置为32

在这里插入图片描述

为了让它显得更协调一点,我在方向键上面插入了一个空表格来占位

在这里插入图片描述

7.逻辑设计——按钮触发功能

在右侧,选择逻辑设计

在这里插入图片描述

进入逻辑设计界面后,以第一个按钮up(前进)为例

先选出当按钮up被按压时的拼图

在这里插入图片描述

在这里插入图片描述

被按压时,获取Web客户端网址

在这里插入图片描述

拖动合并拼图

在这里插入图片描述

进行网址拼接,获取完整的访问路径

在这里插入图片描述

拼接ESP8266的服务器ip

在这里插入图片描述

拼接相应的访问路径/up

在这里插入图片描述

拼接好后,进行Get请求

在这里插入图片描述

在ESP8266的http网络服务器中已经设置好了,当通过Get请求访问相应的路径时,会调用相应的函数,实现对应的功能

当up按钮松开时

在这里插入图片描述
其他按钮的逻辑设计,如上同理可得:

在这里插入图片描述

8.打包apk,导出项目

这里有两种下载APP的方式,我选择的是第一种:下载到手机

在这里插入图片描述

等待进度条

在这里插入图片描述

扫描下载即可

在这里插入图片描述

9.完整APP界面展示

可在文本输入框中修改192.168.x.x变成想要访问的Web服务器ip地址,如192.168.201.22

在这里插入图片描述

10.APP遥控小车测试

手机开启一个2.4GHz的热点(也可以电脑开一个热点,手机和开发板都连上同一个就行),WiFi的名称和密码根据自己的代码进行设置,

我这里使用手机热点,WiFi名称:A,密码:123456789

// WiFi
const char *ssid = "A"; // 连接的wifi名称
const char *password = "123456789";  // WiFi密码

在电脑上获取ip地址后,在APP的输入框中输入,此时可换插到充电宝,开始测试
在这里插入图片描述

测试视频:


总结

这辆小车实属简陋之作,重心偏移了,所以运动时会有一定的偏差,但整体上反应速度还行,局域网内可玩(哭笑)

  • 9
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论
ESP8266 ps2遥控小车是一种使用ESP8266模块和PS2遥控控制小车。你可以按照以下步骤来搭建和使用它: 1. 准备工作: 1.1 打开./sep8266/main.py文件,设置WiFi连接:找到`do_connect('SSID', 'Passwd')`,将其中的SSID和密码替换为你的WiFi网络的名称和密码。 1.2 设置遥控器地址:找到`addressList=['192.168.10.24','192.168.10.112']`,将其中的地址修改为你作为遥控端的电脑的IP地址。 1.3 刷入MicroPython固件,并将sep8266文件夹中的文件烧录到ESP8266模块中。推荐使用uPyCraft工具来下载固件和进行烧录操作。 1.4 安装名为pygame的库,该库可以读取手柄数据并开发小游戏的图形界面。使用命令`pip install pygame`来安装。 2. 开始使用: 2.1 运行serverWithControler.py文件。如果手柄已连接,电脑将作为服务器等待ESP8266的响应。 2.2 按下ESP8266上的RST按钮,LED会开始闪烁(如果LED没有闪烁,则可能需要根据你的板子修改./sep8266/main.py文件中的Pin值)。 2.3 如果连接成功,你会看到持续输出的信息,此时摇动手柄的摇杆,电机应该会开始转动(如果电调需要解锁,你需要手动推动油门来设定中位值等)。 3. 油门微调: 3.1 双向电调油门中位调整: - 电机1:按住手柄的十字左方向键,再按下X或B键。 - 电机2:按住手柄的十字右方向键,再按下X或B键。 3.2 油门上下限调整: - 电机1:按住手柄的十字上方向键,再按下Y、A或X、B键。 - 电机2:按住手柄的十字下方向键,再按下Y、A或X、B键。 请注意,不同的电调可能有不同的设置要求。如果需要改变旋转方向,可以手动修改config.txt文件,只需交换mi(最小脉冲宽度)和ma(最大脉冲宽度)的值即可。 关于ESP8266 ps2遥控小车的搭建和使用,还有以下几个问题可以进一步探讨:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

索子也敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值