基于51单片机WiFi智能小车制作一、基本原理51单片机WiFi智能小车是利用PC或手机作为控制端,通过手机连接wifi模块(路由器)以获得wifi信号,同时车载也连接wifi模块以获得和手机相同的IP地址,实现手机和小车的连接,然后利用PC或手机上的控制软件以wifi网络信号为载体发送相关信号,wifi模块接收PC或手机端发送来的相关信号并分析转换成TTL电平信号,然后发送给单片机,单片机接收到的电平信号处理、分析、计算,转化成控制指令并发送给电机驱动模块以实现小车的前进、后退、左拐、右拐等功能。二、购买所需材料了解51单片机WiFi智能小车基本原理后,需要购买所需材料进行制作。下面列出所需制作材料:序号材料备注图例151单片机最小系统一般采用11.0592M晶振251单片机3703n路由器DB120或WiFi模块4L298n电机驱动模块有动手能力的可以自己做5减速电机及轮子一套6小车底盘7摄像头根据固件支持摄像头购买8电源根据自己需要购买种类9杜邦线及小配件制作所需工具:序号工具名称备注图例1电烙铁一套包括松香焊锡2螺丝刀平口、十字等3微型电钻可以自制4手工刀5剪刀6万用表7热熔胶枪或快干胶8USB下载器三、开始制作1、制作流程开始制作前,我们首先需要看购买路由器的型号,笔者采用的是703n路由器,所以需要引出ttl线。总体步骤为:路由器引TTL线→路由器刷OpenWrt固件→制作51单片机最小系统→下载下位机程序到51单片机→安装上位机程序至PC或手机→测试上、下位机通信→组装→调试完成。2、路由器引ttl线首先打开703n路由器,按照下图标示位置焊接ttl线。注意:1、焊接的时候要小心焊接,焊好后微拉下查看松紧2、焊接最好采用软线焊接,防止意外整块拉掉焊点3、焊好后一定用胶固定,最好采用热熔胶下图为引好ttl线样子3刷OpenWrt固件何为OpenWrt固件,OpenWrt可以被描述为一个嵌入式的Linux发行版,(主流路由器固件有dd-wrt,tomato,openwrt三类)而不是试图建立一个单一的,静态的系统。OpenWrt的包管理提供了一个完全可写的文件系统,从应用程序供应商提供的选择和配置,并允许您自定义的设备,以适应任何应用程序。对于开发人员,OpenWrt是使用框架来构建应用程序,而无需建立一个完整的固件来支持;对于用户来说,这意味着其拥有完全定制的能力,可以用前所未有的方式使用该设备。百度百科:=18s7ZQFh6grF8LDGfd4LtrUdBXv5GWlDKLrNh8CeK1W0ixQpA9f2FGZuf9ZOtKTlDZOhM1m7YsqlHXe_RNzzp_---------------------------------------------------------------------------------------------------------------第一步:把电脑IP改为192.168.1.xxx第二步:把路由网络接口和电脑网卡直接用网线相连第三步:打开路由的控制界面,地址默认一般是192.168.1.1(FAST和TP的一样),用户名密码均为admin,自己修改过的用自己修改后的地址第四步:进入路由的控制界面,点“系统工具”“软件升级”“浏览”,选择下载的固件文件第五步:点击升级,耐心等待。升级成功后只能用无线和路由器连接。到此,路由器刷固件完成。451单片机最小系统制作该步骤就不多说了,一般在网上买单片机最小系统,买回来直接安装单片机上去就可以了。不过有兴趣的朋友可以买些散件自己焊接。5下载下位机到单片机把编写好的下位机程序下载到单片机,下图为usb-ttl与单片机链接示意图。6安装上位机程序至PC或手机下载上位机程序到电脑端或者手机上,进行安装。7测试上、下位机通信测试上、下位机通信首先需要把路由器、单片机最小系统、电机驱动模块、减速电机连接起来,上电测试。具体接法见下图:注意:该图从网上下载,最终接法按照各位买的模块说明书进行接线,不过接线方法都是大同小异。控制单元连接需要根据下位机程序连接in1~4.路由器与单片机连接按照下图标示的接口,GND连GND、TX连RX、RX连TX。连接好各自的线路后(有摄像头的可以插上摄像头),最后给单片机、电机驱动板、路由器上电,等待路由器启动完成。在电脑无线网络里寻找WifRobot的昵称连接上。打开上位机软件,按如下设置:确定后重启上位机程序,查看摄像头图像是否正常,分别按下wasd看是否能驱动电机转动。7组装WiFi小车到这一步基本没什么问题了,接下来就按照自己的嗜好组装自己心爱的小车了。8调试车子安装好了以后就可以试车了,前后左右功能是否正常?摄像头功能是否正常?前进与后退有没有偏向?上位机程序privatevoidReadFromArm(){byte[]buffertocheck=newbyte[1];intbytesize=0;do{byte[]bufferofread=newbyte[1024];try{bytesize=stream.Read(bufferofread,0,bufferofread.Length);}catch(Exceptionex){connection=Indicator.Unconnected;MessageBox.Show(连接中断,程序将退出。);Application.Exit();read.Abort();}//MessageBox.Show(BitConverter.ToString(bufferofread));byte[]buffertochecktemp=buffertocheck;buffertocheck=newbyte[buffertochecktemp.Length+bytesize];Array.Copy(buffertochecktemp,0,buffertocheck,0,buffertochecktemp.Length);Array.Copy(bufferofread,0,buffertocheck,buffertochecktemp.Length,bytesize);intindex_1,index_2;while(Check7E(buffertocheck,outindex_1,outindex_2)){byte[]buffertodecode=newbyte[index_2+1-index_1];Array.Copy(buffertocheck,index_1,buffertodecode,0,index_2+1-index_1);byte[]bufferofdecode=PPP.Decode(buffertodecode);//MessageBox.Show(BitConverter.ToString(bufferofdecode));if(bufferofdecode[0]==bufferofdecode.Length&&CheckSum(bufferofdecode))//保证从ARM来的帧是正确的{byte[]Zuohao=newbyte[2];intsubindex=1,index=bufferofdecode[1]*256+bufferofdecode[2]-1;stringstatus=null;switch(bufferofdecode[3])//分别处理从ARM来的帧{casePOWER_ON://从ARM来的上电状态status=上电;subindex=1;break;casePOWER_OFF://从ARM来的断电状态status=断电;subindex=1;break;caseABNORMAL://从ARM来的异常状态status=异常;subindex=1;break;caseWARNING://从ARM来的警告信号status=有;subindex=2;break;caseNEED_HELP://从ARM来的求救信号status=有;subindex=3;break;}if(0=index&&index=49){listView1.Items[index].SubItems[subindex].Text=status;if(status==异常||status==有)listView1.Items[index].SubItems[subindex].ForeColor=Color.Red;elselistView1.Items[index].SubItems[subindex].ForeColor=Color.Black;}}intnewlength=buffertocheck.Length-1-index_2;if(newlength==0){buffertocheck=newbyte[1];}else{buffertochecktemp=buffertocheck;buffertocheck=newbyte[newlength];Array.Copy(buffertochecktemp,index_2+1,buffertocheck,0,newlength);}}}while(connection==Indicator.Connected);}///summary///向ARM发送////summary///paramname=Zuohao座号2字节/param///paramname=mingling命令字1字节/parampublicvoidWriteToArm(byte[]Zuohao,bytemingling){if(connection==Indicator.Connected)//在与ARM保持连接的情况下可写{byte[]frame=newbyte[5];frame[0]=0x05;Array.Copy(Zuohao,0,frame,1,2);frame[3]=mingling;bytetemp=0;foreach(byteiteminframe)temp+=item;frame[4]=(byte)(0-temp);byte[]frametosend=PPP.Encode(frame);Console.WriteLine(BitConverter.ToString(frametosend));try{stream.Write(frametosend,0,frametosend.Length);}catch(Exceptionex){}}}///summary///向ARM发送////summary///paramname=Zuohao座号2字节/param///paramname=mingling命令字加ASC码n字节/parampublicvoidWriteToArm(byte[]Zuohao,byte[]minglingandASC){if(connection==Indicator.Connected)//在与ARM保持连接的情况下可写{byte[]frame=newbyte[4+minglingandASC.Length];frame[0]=(byte)frame.Length;Array.Copy(Zuohao,0,frame,1,2);Array.Copy(minglingandASC,0,frame,3,minglingandASC.Length);bytetemp=0;foreach(byteiteminframe)temp+=item;frame[frame.Length-1]=(byte)(0-temp);byte[]frametosend=PPP.Encode(frame);Console.WriteLine(BitConverter.ToString(frametosend));try{stream.Write(frametosend,0,fra