基于51单片机WiFi智能小车制作.docx

上传人:b****6 文档编号:8891486 上传时间:2023-05-15 格式:DOCX 页数:20 大小:4.07MB
下载 相关 举报
基于51单片机WiFi智能小车制作.docx_第1页
第1页 / 共20页
基于51单片机WiFi智能小车制作.docx_第2页
第2页 / 共20页
基于51单片机WiFi智能小车制作.docx_第3页
第3页 / 共20页
基于51单片机WiFi智能小车制作.docx_第4页
第4页 / 共20页
基于51单片机WiFi智能小车制作.docx_第5页
第5页 / 共20页
基于51单片机WiFi智能小车制作.docx_第6页
第6页 / 共20页
基于51单片机WiFi智能小车制作.docx_第7页
第7页 / 共20页
基于51单片机WiFi智能小车制作.docx_第8页
第8页 / 共20页
基于51单片机WiFi智能小车制作.docx_第9页
第9页 / 共20页
基于51单片机WiFi智能小车制作.docx_第10页
第10页 / 共20页
基于51单片机WiFi智能小车制作.docx_第11页
第11页 / 共20页
基于51单片机WiFi智能小车制作.docx_第12页
第12页 / 共20页
基于51单片机WiFi智能小车制作.docx_第13页
第13页 / 共20页
基于51单片机WiFi智能小车制作.docx_第14页
第14页 / 共20页
基于51单片机WiFi智能小车制作.docx_第15页
第15页 / 共20页
基于51单片机WiFi智能小车制作.docx_第16页
第16页 / 共20页
基于51单片机WiFi智能小车制作.docx_第17页
第17页 / 共20页
基于51单片机WiFi智能小车制作.docx_第18页
第18页 / 共20页
基于51单片机WiFi智能小车制作.docx_第19页
第19页 / 共20页
基于51单片机WiFi智能小车制作.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机WiFi智能小车制作.docx

《基于51单片机WiFi智能小车制作.docx》由会员分享,可在线阅读,更多相关《基于51单片机WiFi智能小车制作.docx(20页珍藏版)》请在冰点文库上搜索。

基于51单片机WiFi智能小车制作.docx

基于51单片机WiFi智能小车制作

基于51单片机WiFi智能小车制作

一、基本原理

51单片机WiFi智能小车是利用PC或手机作为控制端,通过手机连接wifi模块(路由器)以获得wifi信号,同时车载也连接wifi模块以获得和手机相同的IP地址,实现手机和小车的连接,然后利用PC或手机上的控制软件以wifi网络信号为载体发送相关信号,wifi模块接收PC或手机端发送来的相关信号并分析转换成TTL电平信号,然后发送给单片机,单片机接收到的电平信号处理、分析、计算,转化成控制指令并发送给电机驱动模块以实现小车的前进、后退、左拐、右拐等功能。

二、购买所需材料

了解51单片机WiFi智能小车基本原理后,需要购买所需材料进行制作。

下面列出所需制作材料:

序号

材料

备注

图例

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、制作流程

开始制作前,我们首先需要看购买路由器的型号,笔者采用的是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是使用框架来构建应用程序,而无需建立一个完整的固件来支持;对于用户来说,这意味着其拥有完全定制的能力,可以用前所未有的方式使用该设备。

XX百科:

baike.baidu./link?

url=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;

                           else

                               listView1.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);

       }

       ///

       ///向ARM发送

       ///

       ///座号2字节

       ///命令字1字节

       publicvoidWriteToArm(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){}

           }

       }

       ///

       ///向ARM发送

       ///

       ///座号2字节

       ///命令字加ASC码n字节

       publicvoidWriteToArm(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,frametosend.Length);}

               catch(Exceptionex){}

           }

       }

另外数据收发还需要协议,和嵌入式网关通信的指令和协议定制如下:

因此数据量较少,协议也就比较简单,此协议在发送接收时用PPP封装。

显示部分使用C#编写的运行于Windows.NetFramework上的窗体应用程序,根据实际需求,对每个实验台状态的显示使用ListView控件实现,当出现异常情况,或实验台出现警告、求助信号时,ListView的相应字段文字会通过改变颜色来提醒监视人员,监视人员还可以通过一个文字发送窗体来向LED屏发送要显示的文字。

总之界面清晰直观,简便易用。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2