当前位置:文档之家› 基于51单片机WiFi智能小车制作

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

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

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

下面列出所需制作材料:采WiFi手的自固持头自口、三、开始制作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 是使用框架来构建应用程序,而无需建立一个完整的固件来支持;对于用户来说,这意味着其拥有完全定制的能力,可以用前所未有的方式使用该设备。

百度百科:/link?url=18s7ZQFh6grF8LDGfd4LtrUdBXv5GWlDKLrNh8CeK1W0ixQpA9f2 FGZuf9ZOtKTlDZOhM1m7YsqlHXe_RNzzp_---------------------------------------------------------------------------------------------------------------第一步:把电脑IP改为192.168.1.xxx第二步:把路由网络接口和电脑网卡直接用网线相连第三步:打开路由的控制界面,地址默认一般是192.168.1.1(FAST和TP的一样),用户名密码均为admin,自己修改过的用自己修改后的地址第四步:进入路由的控制界面,点“系统工具”>>“软件升级”>>“浏览”,选择下载的固件文件第五步:点击升级,耐心等待。

升级成功后只能用无线和路由器连接。

到此,路由器刷固件完成。

4 51单片机最小系统制作该步骤就不多说了,一般在网上买单片机最小系统,买回来直接安装单片机上去就可以了。

不过有兴趣的朋友可以买些散件自己焊接。

5 下载下位机到单片机把编写好的下位机程序下载到单片机,下图为usb-ttl与单片机链接示意图。

6安装上位机程序至PC或手机下载上位机程序到电脑端或者手机上,进行安装。

7 测试上、下位机通信测试上、下位机通信首先需要把路由器、单片机最小系统、电机驱动模块、减速电机连接起来,上电测试。

具体接法见下图:注意:该图从网上下载,最终接法按照各位买的模块说明书进行接线,不过接线方法都是大同小异。

控制单元连接需要根据下位机程序连接in1~4.路由器与单片机连接按照下图标示的接口,GND连GND、TX连RX、RX 连TX。

连接好各自的线路后(有摄像头的可以插上摄像头),最后给单片机、电机驱动板、路由器上电,等待路由器启动完成。

在电脑无线网络里寻找WifRobot的昵称连接上。

打开上位机软件,按如下设置:确定后重启上位机程序,查看摄像头图像是否正常,分别按下wasd看是否能驱动电机转动。

7 组装WiFi小车到这一步基本没什么问题了,接下来就按照自己的嗜好组装自己心爱的小车了。

8 调试车子安装好了以后就可以试车了,前后左右功能是否正常?摄像头功能是否正常?前进与后退有没有偏向?上位机程序private void ReadFromArm(){byte[] buffertocheck = new byte[1];int bytesize = 0;do{byte[] bufferofread = new byte[1024];try { bytesize = stream.Read(bufferofread, 0,bufferofread.Length); }catch (Exception ex) { connection = Indicator.Unconnected; MessageBox.Show("连接中断,程序将退出。

"); Application.Exit(); read.Abort(); } //MessageBox.Show(BitConverter.ToString(bufferofread));byte[] buffertochecktemp = buffertocheck;buffertocheck = new byte[buffertochecktemp.Length + bytesize]; Array.Copy(buffertochecktemp, 0, buffertocheck, 0, buffertochecktemp.Length);Array.Copy(bufferofread, 0, buffertocheck,buffertochecktemp.Length, bytesize);int index_1, index_2;while (Check7E(buffertocheck, out index_1, out index_2)){byte[] buffertodecode = new byte[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 = new byte[2];int subindex = 1, index =bufferofdecode[1]*256+bufferofdecode[2]-1;string status=null;switch (bufferofdecode[3])//分别处理从ARM来的帧{case 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 <= index && index <= 49){listView1.Items[index].SubItems[subindex].Text = status;if (status == "异常" || status == "有")listView1.Items[index].SubItems[subindex].ForeC olor = Color.Red;elselistView1.Items[index].SubItems[subindex].ForeC olor = Color.Black;}}int newlength = buffertocheck.Length - 1 - index_2;if (newlength == 0){buffertocheck = new byte[1];}else{buffertochecktemp = buffertocheck;buffertocheck = new byte[newlength];Array.Copy(buffertochecktemp, index_2 + 1, buffertocheck, 0, newlength);}}} while (connection == Indicator.Connected);}/// <summary>/// 向ARM发送/// </summary>/// <param name="Zuohao">座号 2字节</param>/// <param name="mingling">命令字 1字节</param>public void WriteToArm(byte[] Zuohao, byte mingling){if (connection == Indicator.Connected)//在与ARM保持连接的情况下可写 {byte[] frame = new byte[5];frame[0] = 0x05;Array.Copy(Zuohao, 0, frame, 1, 2);frame[3] = mingling;byte temp = 0;foreach (byte item in frame)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 (Exception ex) { }}}/// <summary>/// 向ARM发送/// </summary>/// <param name="Zuohao">座号 2字节</param>/// <param name="mingling">命令字加ASC码 n字节</param>public void WriteToArm(byte[] Zuohao, byte[] minglingandASC){if (connection == Indicator.Connected)//在与ARM保持连接的情况下可写 {byte[] frame = new byte[4+minglingandASC.Length];frame[0] = (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;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 (Exception ex) { }}}另外数据收发还需要协议,和嵌入式网关通信的指令和协议定制如下:因此数据量较少,协议也就比较简单,此协议在发送接收时用PPP封装。

相关主题