基于51单片机WiFi智能小车制作.docx
- 文档编号:9829522
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:12
- 大小:181.64KB
基于51单片机WiFi智能小车制作.docx
《基于51单片机WiFi智能小车制作.docx》由会员分享,可在线阅读,更多相关《基于51单片机WiFi智能小车制作.docx(12页珍藏版)》请在冰点文库上搜索。
基于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百科:
---------------------------------------------------------------------------------------------------------------
第一步:
把电脑IP改为xxx
第二步:
把路由网络接口和电脑网卡直接用网线相连
第三步:
打开路由的控制界面,地址默认一般是(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来的帧
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
{
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
status="上电";
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
subindex=1;
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
break;
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
status="断电";
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
subindex=1;
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
break;
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
status="异常";
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
subindex=1;
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
break;
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
status="有";
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
subindex=2;
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
break;
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
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发送
?
?
?
?
?
?
?
///
?
?
?
?
?
?
?
///
?
?
?
?
?
?
?
///
?
?
?
?
?
?
?
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发送
?
?
?
?
?
?
?
///
?
?
?
?
?
?
?
///
?
?
?
?
?
?
?
///
?
?
?
?
?
?
?
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屏发送要显示的文字。
总之界面清晰直观,简便易用。
?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 WiFi 智能 小车 制作