《基于51单片机WiFi智能小车制作.docx》由会员分享,可在线阅读,更多相关《基于51单片机WiFi智能小车制作.docx(12页珍藏版)》请在三一办公上搜索。
1、基于51单片机WiFi智能小车制作基于51单片机WiFi智能小车制作 一、基本原理 51单片机WiFi智能小车是利用PC或手机作为控制端,通过手机连接wifi模块以获得wifi信号,同时车载也连接wifi模块以获得和手机相同的IP地址,实现手机和小车的连接,然后利用PC或手机上的控制软件以wifi网络信号为载体发送相关信号,wifi模块接收PC或手机端发送来的相关信号并分析转换成TTL电平信号,然后发送给单片机,单片机接收到的电平信号处理、分析、计算,转化成控制指令并发送给电机驱动模块以实现小车的前进、后退、左拐、右拐等功能。 二、购买所需材料 了解51单片机WiFi智能小车基本原理后,需要购
2、买所需材料进行制作。下面列出所需制作材料: 序材料 号 1 51单片机最小系统 备注 一般采用11.0592M晶振 图例 2 51单片机 3 703n路由器 DB120或WiFi模块 4 L298n电机驱动模块 有动手能力的可以自己做 5 减速电机及轮子一套 6 小车底盘 7 摄像头 根据固件支持摄像头购买 8 电源 根据自己需要购买种类 9 杜邦线及小配件 制作所需工具: 序工号 具名称 备注 图例 1 电烙铁一套 包括松香焊锡 2 螺丝刀 平口、十字等 3 微型电钻 可以自制 4 手工刀 5 剪刀 6 万用表 7 热熔胶枪或快干胶 8 USB下载器 三、开始制作 1、制作流程 开始制作前,
3、我们首先需要看购买路由器的型号,笔者采用的是703n路由器,所以需要引出ttl线。 总体步骤为:路由器引TTL线路由器刷OpenWrt固件制作51单片机最小系统下载下位机程序到51单片机安装上位机程序至PC或手机测试上、下位机通信组装调试完成。 2、路由器引ttl线 首先打开703n路由器,按照下图标示位置焊接ttl线。 注意:1、焊接的时候要小心焊接,焊好后微拉下查看松紧 2、焊接最好采用软线焊接,防止意外整块拉掉焊点 3、焊好后一定用胶固定,最好采用热熔胶 下图为引好ttl线样子 3 刷OpenWrt固件 何为OpenWrt固件,OpenWrt可以被描述为一个嵌入式的 Linux 发行版,
4、而不是试图建立一个单一的,静态的系统。OpenWrt的包管理提供了一个完全可写的文件系统,从应用程序供应商提供的选择和配置,并允许您自定义的设备,以适应任何应用程序。 对于开发人员,OpenWrt 是使用框架来构建应用程序,而无需建立一个完整的固件来支持;对于用户来说,这意味着其拥有完全定制的能力,可以用前所未有的方式使用该设备。 百度百科: - 第一步:把电脑IP改为192.168.1.xxx 第二步:把路由网络接口和电脑网卡直接用网线相连 第三步:打开路由的控制界面,地址默认一般是192.168.1.1,用户名密码均为admin,自己修改过的用自己修改后的地址 第四步:进入路由的控制界面,
5、点“系统工具”“软件升级”“浏览”,选择下载的固件文件 第五步:点击升级,耐心等待。升级成功后只能用无线和路由器连接。 到此,路由器刷固件完成。 4 51单片机最小系统制作 该步骤就不多说了,一般在网上买单片机最小系统,买回来直接安装单片机上去就可以了。不过有兴趣的朋友可以买些散件自己焊接。 5 下载下位机到单片机 把编写好的下位机程序下载到单片机,下图为usb-ttl与单片机链接示意图。 6安装上位机程序至PC或手机 下载上位机程序到电脑端或者手机上,进行安装。 7 测试上、下位机通信 测试上、下位机通信首先需要把路由器、单片机最小系统、电机驱动模块、减速电机连接起来,上电测试。 具体接法见
6、下图: 注意:该图从网上下载,最终接法按照各位买的模块说明书进行接线,不过接线方法都是大同小异。控制单元连接需要根据下位机程序连接in14. 路由器与单片机连接按照下图标示的接口,GND连GND、TX连RX、RX连TX。 连接好各自的线路后,最后给单片机、电机驱动板、路由器上电,等待路由器启动完成。在电脑无线网络里寻找WifRobot的昵称连接上。 打开上位机软件,按如下设置: 确定后重启上位机程序,查看摄像头图像是否正常,分别按下wasd看是否能驱动电机转动。 7 组装WiFi小车 到这一步基本没什么问题了,接下来就按照自己的嗜好组装自己心爱的小车了。 8 调试 车子安装好了以后就可以试车了
7、,前后左右功能是否正常?摄像头功能是否正常?前进与后退有没有偏向? 上位机程序 private void ReadFromArm byte buffertocheck = new byte1; int bytesize = 0; do byte bufferofread = new byte1024; try bytesize = stream.Read(bufferofread, 0, bufferofread.Length); catch (Exception ex) connection = Indicator.Unconnected; MessageBox.Show(连接中断,程序将退
8、出。); Application.Exit; read.Abort; /MessageBox.Show(BitConverter.ToString(bufferofread); byte buffertochecktemp = buffertocheck; buffertocheck = new bytebuffertochecktemp.Length + bytesize; Array.Copy(buffertochecktemp, 0, buffertocheck, 0, buffertochecktemp.Length); Array.Copy(bufferofread, 0, buff
9、ertocheck, buffertochecktemp.Length, bytesize); int index_1, index_2; while (Check7E(buffertocheck, out index_1, out index_2) byte buffertodecode = new byteindex_2 + 1 - index_1; Array.Copy(buffertocheck, index_1, buffertodecode, 0, index_2 + 1 - index_1); byte bufferofdecode = PPP.Decode(buffertode
10、code); /MessageBox.Show(BitConverter.ToString(bufferofdecode); if (bufferofdecode0 = bufferofdecode.Length & CheckSum(bufferofdecode)/保证从ARM来的帧是正确的 byte Zuohao = new byte2; int subindex = 1, index = bufferofdecode1*256+bufferofdecode2-1; string status=null; switch (bufferofdecode3)/分别处理从ARM来的帧 case
11、POWER_ON:/从ARM来的上电状态 status = 上电; subindex = 1; break; case POWER_OFF:/从ARM来的断电状态 status = 断电; subindex = 1; break; case ABNORMAL:/从ARM来的异常状态 status = 异常; subindex = 1; break; case WARNING:/从ARM来的警告信号 status = 有; subindex = 2; break; case NEED_HELP:/从ARM来的求救信号 status = 有; subindex = 3; break; if (0
12、= index & index = 49) listView1.Itemsindex.SubItemssubindex.Text = status; if (status = 异常 | status = 有) listView1.Itemsindex.SubItemssubindex.ForeColor = Color.Red; else listView1.Itemsindex.SubItemssubindex.ForeColor = Color.Black; int newlength = buffertocheck.Length - 1 - index_2; if (newlength
13、= 0) buffertocheck = new byte1; else buffertochecktemp = buffertocheck; buffertocheck = new bytenewlength; Array.Copy(buffertochecktemp, index_2 + 1, buffertocheck, 0, newlength); while (connection = Indicator.Connected); / / 向ARM发送 / / 座号 2字节 / 命令字 1字节 public void WriteToArm(byte Zuohao, byte mingl
14、ing) if (connection = Indicator.Connected)/在与ARM保持连接的情况下可写 byte frame = new byte5; frame0 = 0x05; Array.Copy(Zuohao, 0, frame, 1, 2); frame3 = mingling; byte temp = 0; foreach (byte item in frame) temp += item; frame4 = (byte)(0 - temp); byte frametosend = PPP.Encode(frame); Console.WriteLine(BitCon
15、verter.ToString(frametosend); try stream.Write(frametosend, 0, frametosend.Length); catch (Exception ex) / / 向ARM发送 / / 座号 2字节 / 命令字加ASC码 n字节 public void WriteToArm(byte Zuohao, byte minglingandASC) if (connection = Indicator.Connected)/在与ARM保持连接的情况下可写 byte frame = new byte4+minglingandASC.Length; f
16、rame0 = (byte)frame.Length; Array.Copy(Zuohao, 0, frame, 1, 2); Array.Copy(minglingandASC,0,frame,3,minglingandASC.Length); byte temp = 0; foreach (byte item in frame) temp += item; frameframe.Length-1 = (byte)(0 - temp); byte frametosend = PPP.Encode(frame); Console.WriteLine(BitConverter.ToString(
17、frametosend); try stream.Write(frametosend, 0, frametosend.Length); catch (Exception ex) 另外数据收发还需要协议,和嵌入式网关通信的指令和协议定制如下: 因此数据量较少,协议也就比较简单,此协议在发送接收时用PPP封装。显示部分使用C#编写的运行于Windows .Net Framework 上的窗体应用程序,根据实际需求,对每个实验台状态的显示使用ListView控件实现,当出现异常情况,或实验台出现警告、求助信号时,ListView的相应字段文字会通过改变颜色来提醒监视人员,监视人员还可以通过一个文字发送窗体来向LED屏发送要显示的文字。总之界面清晰直观,简便易用。