请教大神一些可以用51单片机让小车实现自主导航的的问题。跪求大神。

1.1 相关的博客和代码

此为后续版夲,实现了手机端的蓝牙程序控制小车运动以及接收小车状态并展示

最初的想法是做一个红外遥控的装置,只需要前进和停止,二路遙控想使用模拟电路搭建,但最后也没能完成这个想法依然在,现在只能留带以后是否有想法再做了

第二个想法是想做一个小车,尛车的功能如下: 前进后退,转弯遥控控制,自主智能运转 上某宝买了一个小车的底座(4驱动的,带电机) 买了两个L298N驱动模块用来驱動小车,买了蓝牙模块(HC05)用来充当遥控

首先根据51单片机的最小系统的电路图,焊接了一个最小系统板使用的STC89c52的单片机(晶振6Mhz,带复位电路复位指示灯显示),为了便于测试又焊接了一个发光二极管连接一个I/O口,用于测试最小系统

开始测试最小系统,不过我很多年没有用過keil和下载器了就上网寻找了一下关于这方面的帖子,并作了总结要测试最小系统,首先需要编译代码的工具(我用的keil)下载代码到单片機的工具(stc-isp),usb转ttl硬件设备(某宝上2块多钱买的)串口调试助手(使用的是单片机多功能调试助手PortHelper.exe),于是从网上下载了keil4破解版本stc-isp下载软件,单片機多功能调试助手三个软件

手机发送命令到手机蓝牙

单片机处理程序接收到串口命令

可以看出,上述的路径无需USB转TTL的参与我们之所以偠使用USB转TTL是出于测试蓝牙的需要。考虑一种情况:蓝牙和单片机的串口连接之后若单片机的控制程序无法驱动蓝牙正常工作,我们将无法判断是单片机方面的问题(例如代码或者连线等)还是蓝牙本身的问题。 因此为了尽可能隔离错误域,我们可使用这个神奇的USB转TTL设備使其直连蓝牙模块,并使用电脑的串口调试助手驱动USB转TTL,进而驱动蓝牙模块从而可确定蓝牙模块的好坏。其测试流程:

不过要使鼡以上的方案我们首先要测试USB转TTL模块是不是好的,好绕口

2.2.1 USB转TTL设备连接电脑端是否可识别

将usb转ttl的四个引脚接入到单片机的对应引脚即可(其实就是VCC接VCC,GND接GNDTX接RX,RX接TX)没有采用外部供电,直接利用usb转ttl进行的5v供电

2.2.3 在keil中写代码对单片机的某一个I/O进行翻转电平的操作

使用keil创建相应嘚51工程,加入上述代码以及头文件并对程序进行编译,生成相应的hex文件

打开stc-isp下载工具,选择单片机型号hex程序位置,点击下载即可洳果识别了单片机的话,会出现给MCU重新上电的字样这个时候只需要关闭再打开MCU的电源开关即可,就会出现烧写程序的过程

查看电压是否1秒一次变化即可

2.3 最小系统测试篇遇到的问题,回忆篇

51单片机的电源供电问题忘了接单片机的VCC引脚了(如果是这方面的问题,就检查几個关键地方vcc和地接好了吗,tx和rx接好了吗晶振接好了吗,复位电路先不用管我是使用的万用表一个个的量的)

从某宝上花了17大洋买了┅个HC05蓝牙主从模块,有6个引脚(VCC,GND,TX,RX,AT,STATUS)前4个引脚与usb转ttl的接法相同(注意RX,TX交叉接线接入到单片机)AT和STatus引脚是我自己命的名字。 AT引脚高电平有效用於蓝牙模块进入AT状态(所谓AT状态,即是其他程序可以通过它的引脚向蓝牙模块发送AT控制命令例如设置波特率,查看版本号设置主从模式),AT引脚悬空默认为低电平Status引脚用于显示配对的状态(配对成功输出高电平,未配对输出低电平)

3.1 蓝牙模块测试篇

第一步:蓝牙模块既然包含串口那么它应该可以跟usb转ttl直接连接,使用电脑向蓝牙模块发送命令于是连接蓝牙模块与usb转ttl的对应引脚。

3.2 蓝牙模块与单片机集成调试篇

仩面的测试已经证明了蓝牙模块是可以发送接收手机端消息的现在开始将蓝牙模块与单片机的TX,RX接口连接起来通过程序控制蓝牙模块與手机蓝牙进行沟通,从而达到利用手机蓝牙进行遥控的目的

main函数如下,主要设置串口波特率以及开启串口中断

//PCON:SMOD位默认为0,串行口波特率加倍位 

利用手机给蓝牙HC05发送消息如果不是switch中的几个case的话,那么LED灯会明暗变化但是刚开始的测试却始终不如意。而后仔细查看了代碼并没有发现什么错误,后来怀疑是波特率的问题因为我的晶振是6Mhz的,蓝牙模块的波特率是

它与 9600的波特率相差 1400多这个似乎差距太大叻。我又尝试了其他几个参数像 38400都相差挺大的,估计就是这个原因于是继续尝试,发现 然后使用 13 13 13代入进去,其波特率结果为 3.8 2400的波特率相差很小估计是可以用的,但是看蓝牙模块的文档发现它说不支持 2400的,我不甘心就使用usb转ttl模块(有没有发现此模块是不是很有用?)设置了一下 2400没想到AT命令还真的返回OK了,单片机程序也可以正常工作了

将两个L298N模块与单片机的P2口直接相连(小车4轮驱动,每个电机需要两个输入引脚以及一个使能引脚,那就是12个引脚我刚开始并不想支持调速的功能,因此使能引脚直接高电平了就连接了8个I/O口)。注意L298N的GND引脚一定要和单片机的GND共地

关于L298N: 它的EN引脚用于使能,EN为高电平才使能。另外两个输入引脚IN1,IN2根据电平的组合变化会有4种情况(00,10,01,11)电机相应的在00和11停止(这个停止是带电的,类似于锁死的感觉)在10正转,01反转可以直接使用单片机的VCC和GND连接L298N的IN1和IN2,同时将EN端接VCC看电机轉不转就可以测试L298N模块了。

编写程序控制轮子的正转,翻转停止等。基本上就是以下的这种代码

问题1: 刚开始L298N直接连接P0口死活不转,而直接引出高低电平到某一个电机的IN1IN2口,电机正常运转于是猜测是I/O有问题,使用万用表测量发现P0的I/O在输出高电平的时候,根本不昰高电平而后发了帖子,询问了一下才知道P0口在高电平是呈现高阻态的需要外部焊接电路加上拉电阻才可工作。我不想焊接过多的电蕗就将其I/O换到P2口,可以正常工作。

问题2: 我使用的是路由器的9v直流电源使用其带动两个L298N,同时将L298N的输出的一个5V高电平接到单片机上給单片机供电启动4轮驱动,电机只会翁的一声然后啥也没有,二轮驱动也不转 上网查看了不少资料,基本上都是电源功率过低需偠将单片机与L298N分别供电才可以。 于是使用笔记本的usb口给单片机供电使用9v直流电源给电机供电,比刚才好了一些两轮可以转,但是4个轮孓还是转不了没办法,想到自己有一个小的卡片相机有镍氢电池8节,然后上网买了一个电池盒装上去,电机转的吼吼叫同时L298N给单爿机供电也没问题。

问题3:关于L298N同时给单片机供电的问题大家可以在启动轮子转动的时候量一量单片机的电源电压,会发现在电机启动嘚一刹那单片机的电压有一个瞬时的拉低,这样单片机就会复位了

5. 蓝牙遥控小车汇总篇

第一步:部署小车,L298N镍氢电池盒,蓝牙模块組装到一起

小车前进后退,停止左转,右转 小车单个轮子的转动(用于测试) 小车当前状态的获取(用于后期给小车增加其他模块的时候唎如温度模块,就可以读取温度了) 
首先完成单个轮子的控制 再加入串口接收中断收到不同命令,设置方向变量 main程序读取方向变量控制不哃的方向 

一些比较有特点的思路:

思路2: 既然有了手机蓝牙那么小车再想展示一些状态信息,就没必要使用像之类的东东了直接定时發给手机蓝牙模块就OK了。我现在并没有实现定时发送不过支持了命令获取的功能。 当用户发送命令h到单片机单片机会返回一个帮助界媔,告知如何控制小车例如"f"控制小车前进,"b"控制小车后退当用户发送命令i到单片机,单片机会返回小车的一些状态信息我当前只返囙了一些简单的变量状态(后面想加入距离,温度光敏都是可行的)。

思路3:有了蓝牙这个小车就可以被我们随心所欲的控制了。你既可以推命令到单片机控制它,你又可以把单片机内部的当前状态拉出来单片机本身又可以定期将它的状态向你的手机进行推送。这個我感觉还是很好玩的有了这个代码的基本框架,后面有可能的话像实现一个小车的扩展功能加上红外对管让它不撞墙,加上超声波讓它测距加上麦克风让它向着声音跑,加上人体感应让它做一个跟屁虫甚至于加上一个智能化点的程序,让它能够在一个屋子里随便嘚转悠然后记录屋里的情况。还想做的是加入一个wifi模块能将它的状态信息上传到路由器里面(手里有一个坏的路由器华为hg255d,正在修理中还没有摸清楚如何修),这样远在千里之外都可以访问小车上面传感器的情况了还想加的是一个摄像头模块,不过单片机的处理能力有限摄像头的解码对它是个大问题,估计很难办到(手头有优龙fs2401开发板刚修好它的电源模块,正在研究中不过前天它突然bios引导不起来了,也不知道是什么问题关于这种arm的东西,还没有接触过完全不懂刷bios,uboot等等的东西看情况是要重新刷bios了)。

硬件电路我就不说了,主要说说算法.
1. 先从一种比较简单的迷宫说起,我称之为"二叉树"迷宫,即每个节点上最多连接三条支路,换句话 说,就是当你面对岔路时,你最多只有三个选择,要麼左转,要么右转,要么回头.
假如,我们将左转编码为0,右转编码为1,则迷宫的从入口到出口的路径为一串二进制编码.对于最短路径,我们可以让机器囚多走几次迷宫,得到一系列二进制串,位数最少的即为"局部最短路径".我们还可以通过这些二进制串,得到迷宫"局部拓扑结构",一种二叉树结构.
注意,在上面的结果上我都加有"局部"两字,这是因为机器人走迷宫的次数如果不够多,或则说少于迷宫的总路径数,我们得到结果都是不完整的,只有當机器人走迷宫的次数足够大,以致于走遍了迷宫所有的路径,这时我们才能得到完整的结果,然而这对于大多数迷宫来说都是不可实现的,也就昰说,我们得到的结果都是局部的,最多是趋近于全局结果.
不知大家发现没有,上面还有一种情况我没有编码,那就是回退.这个问题处理起来比较複杂,因此不能仅仅用一位二进制码来表示,必须有专门的处理机制.
这个机制分为三个方面,
一是,每次只回退一步,即当前方无路可走时,回到上一個叉路口,选择另一条支路,程序上就是将当前二进制串减少一位,并将改变后的二进制串的最后一位取反,代表选另一条支路.
二是, 回退一步后,仍無路可走时,再回退一部,重复上述过程,直至有岔路可选.
三是,整个回退过程中,记录并保存每次回退的路径,即左右转向的二进制编码,一个回退过即既是由开始回退到开始前进的整段过程.保留这些二进制串,是因为可以通过他们反推得出迷宫的一些局部的拓扑结构

2. 熟悉上面"二叉树迷宫"後 ,对于一般迷宫通过如下方法设计


一、估计出迷宫最大的支路数,即一个叉路口最多有几条岔路这里假设为a
二 、用a为二进制码对每一个岔蕗编码,例如我们可以按顺时针编码
三、 将a为二进制编码代替“二叉树迷宫 ”的一位二进制其它步骤相仿即可。
当然我们也可以用变長二进制码表示一次路径选择,不过这时得记录保存每次选则对应的二进制码的长度
上面的算法,我说的都很笼统但总体思路是明确嘚,即:以迷宫入口为根节点每个叉路口为一个节点,每个岔路为一段树枝每个树枝用一定位数的二进制码编码,以树形结构表示迷宮的拓扑结构于是迷宫的通路可以表示为从树的根节点到某一叶节点的路径。
硬件电路上主要有两个方面的设计:一是,前进河和回退两个状态的识别与转换;二是岔

我要回帖

 

随机推荐