×

通过WiFi网络控制Arduino汽车

消耗积分:0 | 格式:zip | 大小:0.46 MB | 2023-02-03

王帅

分享资料个

描述

该项目展示了如何连接到 WiFi 网络、打开 Web 浏览器、连接到服务器并从一个简单的界面控制您的汽车。

UNO R3 + WIFI ESP8266 + CH340G Arduino和WIFI单板

该项目的核心是 Arduino ESP8266 WiFi 开发板。该板在单一平台上结合了 ATMega328 微控制器和 ESP8266 WiFi 芯片,两者之间具有串行通信。

有关如何配置和编程该板的详细说明,请参阅我之前的一篇帖子。

控制流程框图

下面是一个高级框图:

blockflowdiagram_bzUtPAh7mM.png?auto=compress%2Cformat&w=740&h=555&fit=max

流程图

ESP8266 能够配置为软接入点并启动自己的无线网络。用户设备连接到该网络,然后可以使用 ESP8266 提供的网页通过 ESP8266 和 ATMega328 向汽车发送命令。

这篇文章的其余部分将详细介绍这些步骤。

第一——汽车

该项目使用两轮汽车。这些汽车的套件可从多个来源获得。这是高级物料清单:

两轮驱动套件,包括电机、底盘、各种螺丝和螺母、车轮和车轮编码器。

UNO R3 + WIFI ESP8266 + CH340G Arduino和WIFI单板

L298N电机驱动桥板

2 x HC-020K 编码器模块

4 x ICR16340 锂离子电池和电池座

切换开/关开关

无线天线

连接线

本文不包括如何制造汽车的描述;互联网上有很多资源可以解释所需的步骤。

成品车如下:

img_3641_4IliUhwScq.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1号车

img_3643_8OTJsTlsBu.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

车2

整车电路图如下:

schematicdiagram_Gy4WnIxRhh.png?auto=compress%2Cformat&w=740&h=555&fit=max

原理图

配置上只需要注意几点:

该车采用并联/串联配置的四节 ICR16340 700 mAh 锂离子电池。这些串联的两个电池在充满电时提供大约 8 V 的电压,这足以驱动电机和并联的 wifi/控制器电池可能会出现问题(您可以获得循环电流),作为替代方案,ICR16340 电池的容量为 2800 mAh版本——其中两个串联应该足以为汽车提供动力。

电机控制由 L298N 桥驱动器模块执行。同样,有大量资源可以解释它们的运行方式以及如何连接电机和控件。

该电路使用数字引脚 5 和 6 将 PWM 输出到 L298N 板以控制电机速度。它们连接到 L298N 板的 ENa 和 ENb。引脚 4、7、8 和 9 用于打开和关闭电机。

该电路包括两个 HC-020K 编码器模块。这些未在代码中专门使用,但可用于提供速度或距离反馈。

根据您的具体接线方式,可能需要调换电机引线以获得一致的方向。此外,HC-020K 编码器模块必须与软件中的正确电机配对(如果使用)。这可以通过交换中断 2 和 3 或调整软件来实现。

ESP8266 作为接入点和 Web 服务器

ESP8266 可配置为无线接入点和网络服务器。此外,它还可以设置为DNS 服务器。这允许客户端使用本地 URL 访问 Web 服务器。

在对 ESP8266 进行编程之前,您必须确保您使用的 Arduino IDE 已配置为执行此类编程。Internet 上有许多文章解释了如何执行此操作。搜索“来自 Arduino IDE 的程序 ESP8266”将提供许多结果。

基本步骤如下:

在 File → Preferences 中,将 url 添加到 Additional Boards Manager:http ://arduino.esp8266.com/stable/package_esp8266com_index.json

在 Tools → Boards → Boards Manager 下,搜索 ESP8266 并安装最新版本的“ESP8266 by ESP8266 Community”

完成此操作后,您应该在 Tools→Board 下为 ESP8266 Boards 提供一个选项。选择通用 ESP8266 模块。

用于设置 Wifi、Web 服务器和 DNS 的相关 Arduino 库是:

ESP8266WiFi.h

ESP8266WebServer.h

ESP8266mDNS.h

这些是作为设置 IDE 以对上述 ESP8266 进行编程的一部分安装的。

以下是将 ESP8266 配置为软接入点的相关代码片段。

 

#include 
const char *ssid = "ESP8266Network"; // The name of the Wi-Fi network that will be created
const char *password = "1234567890";   // Password for WiFi network. Must be more than 8 characters

void setup() {
  WiFi.softAP(ssid, password); // Start the access point
{

 

上面的代码会将 ESP8266 设置为接入点,客户端可以连接到它,但不会发生其他任何事情。首先,让我们配置 mDNS 服务器以允许更轻松的 URL 访问。

下面的代码片段:

 

#include 

MDNS.begin("esp8266");

void loop() {
  MDNS.update();
}

 

一旦客户端连接到 ESP8266 接入点,Web 浏览器就可以使用 URL http://esp8266.local/ 来访问 ESP8266。更改 begin() 指令中的参数“esp8266”将更改 URL。

设置网络服务器的相关代码片段如下:

 

#include 

ESP8266WebServer server(80);

void setup() {
  server.onNotFound(handlerRoutine);
  server.on(“URL”, handlerRoutine);
  server.begin();
}

void loop() {
  server.handleClient();
}

 

其中 handlerRoutine 是一个子例程,当从客户端收到请求时执行各种操作。

ESP8266 板载文件系统

ESP8266 的另一个特点是它有一个板载文件系统,串行外设接口闪存文件系统 (SPIFFS),可用于存储文件。在我们的例子中,我们可以使用它来存储提供给连接的客户端的 html 文件。此功能的相关库是:

FS.h

要在 Arduino IDE 中启用此功能,需要一个插件:Filesystem uploader。

首先,确保安装了最新的 Arduino IDE,并且如前所述,您有用于 Arduino IDE 的 ESP8266 插件。

然后按照以下任一链接中的说明进行操作:

https://randomnerdtutorials.com/install-esp8266-filesystem-uploader-arduino-ide/

https://github.com/esp8266/arduino-esp8266fs-plugin

这两个链接都显示了安装插件后如何使用文件系统上传器。

现在——HTML 代码

一旦将 ESP8266 设置为 Web 服务器,相关的 html 页面必须在连接后提供给客户端。按照惯例,此文件标记为 index.html。要理解此文件,需要了解 html 代码。

一些解释:

该文件定义了一个页面,由四个按钮(FWD、RIGHT、LEFT、BACK)和一个速度滑块组成。

按下按钮会导致它改变颜色并向 ESP8266 网络服务器发送 GET 请求

Web 服务器将处理 GET 请求并使用它与 ATMega328 通信以控制汽车

更改速度滑块将启动 POST 请求,该请求将用于设置速度值。

完整文件(带注释)可以在本文的代码部分找到。最终页面如下:

htmlpage_qyEt6qTHNG.png?auto=compress%2Cformat&w=740&h=555&fit=max

ESP8266与ATMega328通信

如前所示,ESP8266 和 ATMega328 之间的通信是通过串口进行的。要启用此通信,板载 DIP 开关必须设置如下:

将 dip 开关设置为模式 4(SW1 和 SW2 打开,所有其他关闭)

ESP8266 将 1 到 8 之间的单个字符发送到 ATMega328 以指定电机动作。完整代码如下:

 

// FWD Activate
    case '1':
    forwardOn();    
    break;
// FWD Stop
    case '2':
    motorsOff();
    break;
// LEFT Activate
    case '3':
    leftOn();
    break;
// LEFT Stop
    case '4':
    motorsOff();
    break;
// RIGHT Activate
    case '5':
    rightOn();
    break;
//RIGHT Stop
    case '6':
    motorsOff();
    break;
// BACK Activate
    case '7':
    backOn();
    break;
// BACK Stop
    case '8':
    motorsOff();

 

速度值作为第一个字符为“s”的字符串发送。然后代码从字符串中去除 s 并进行字符串到整数的转换以设置电机速度。

把它们放在一起

以下是构建完整项目的简要说明:

造车

使用 Arduino IDE 中的 Boards Manager 选择 Generic ESP8266 模块

将 index.html 文件上传到 ESP8266(DIP 开关 5、6、7 上所有其他关闭),然后重置处理器

上传ESP8266程序

断开电源并将 DIP 开关设置为 ATMega328(所有其他的 DIP 开关 3、4 关闭)

上传Arduino程序(在Boards manager中选择Arduino UNO后)

断开电源并将 DIP 开关设置为内部通信(DIP 开关 1、2 在所有其他关闭)

启动汽车

将平板电脑、智能手机或笔记本电脑无线连接到“ESP8266Network”

从连接的平板电脑、智能手机或笔记本电脑,打开 URL http://esp8266.local/

使用界面驾驶汽车

最后的话

这个项目汇集了一些不同的技能。希望它具有挑战性。

可以使用像 Node MCU 这样的单个 ESP8266 板来实现所有这些功能,但这将是一个单独的项目。

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'通过WiFi网络控制Arduino汽车',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);