本文源于 百度 单片机吧 wgy851808815
这学期本来是想先做旋转LED的,看到贴吧有活动,先做智能小车吧。
有了前一次做超声波避障小车的经验,做起来虽然不能说是得心应手,却可以算得上是从容不迫,但遇到的问题也不比前一次少。比起上一次的小车,本次增加了遥控、避障和变速功能,显示方式也改为1602液晶显示。
开始是用洞洞板做的,用锡作为导线布线,费了很多锡,用了一个下午加晚上的时间才基本做完。
在一个星期天,开始构思编程,我先复制了上次超声波的代码,然后逐渐往里面加其他的功能。首先写的是遥控部分代码,因为这个比较简单。加进去后点击构造目标文件,突然编译器出现停止工作提示,我当时认为是缺少了哪个头文件造成的,检查过后没有发现有错误,然后又想是不是编译器没能完全破解,因为我又重装过系统,上网查了一些资料,仍没有找到解决问题的办法。一时无解,到了晚上依然没有头绪。抱着试一试的想法,只把超声波的代码复制进去,一下构造目标成功,这肯定就不是编译器出错了。然后我一条一条的加遥控部分的代码,每加一条编译一次,就在我加入延时部分代码时,问题出现,编译器停止工作,这下问题找到了。然后找出现问题的原因,发现我写了两个延时函数,一个定义为Delay,另一个定义为delay,只有首字母大小写不一样,应该是编译器不认得了,在delay后面加上x变成delayx,再加上剩余的遥控部分,构造目标,完美通过。就是这样一个字母折腾了我一整天,弄得我心力憔悴,但也是一个非常好的收获。
第二天,开始写循迹部分的代码,这个也不算太难,用了两个多小时就写出来了,和前面的代码放在一起,更改一些能想到的BUG,编译一次通过。
玩了几天,再看焊的电路,发现走锡布的线确实不太美观,焊接时也没有充分考虑功率大小,我就想着改成PCB。经过几天的布线,最终电路图确定。找时间进行了板子制作,蚀刻出来后效果不是很理想,有一些断线。再做一块是可以,但还要用一部分时间,同样不能保证蚀刻出来的板子没有断线,权衡以后,选择用电阻的引脚剪成小节,把断线的部分连起来,接着打孔,焊接。
焊接完成后,开始烧程序调试,刚开始调试时,液晶总是不显示东西,改代码改了好几次出现了一点乱码。我认识到可能不一定代码的错误,仔细检查了一下电路,没有发有问题,为了严谨,还是用万能表测了一下通路,果然,有一条线路不通,直接凭眼睛是看不出来的,逐渐移动表笔,发现跳过一个位置的时候突然不通了,仔细观察后才看清是有一点断开的,同样用电阻引脚接上。再下载程序,同样不能正常显示,这次不应该是电路的问题了,我已经把每条线路都测试过。检查几遍代码才发现是引脚定义错了,这是一个不应该的错误啊。就这样,显示部分的调试完成。
然后调试超声波测距部分,连上超声波以后发现测距距离只有80cm左右的范围,于是延长了定时器的计数时间,这下测距距离达到4米左右,但精度不是很高,对于避障来说是足够了。随后发现液晶上显示小于100的时候高位会有零显示,不太好看,又增加了显示的选择部分代码把高位的零消掉。
搞定超声波以后,进行遥控部分的调试,虽然很简单,问题还是有的,在按下遥控器的按键时,单片机输出的供驱动电路的电平不停交换,要是用这个驱动小车肯定是不行的,还是去检查代码。因为我还是一贯采用前面的编程方式,检测按键有没有放开还是采用的while(!k1),而这个遥控模块是以高电平作为信号的,检测低电平肯定是一跳而过,把代码改成while(k1==1),问题解决。
最后是我以前没做过的循迹部分了,我记得在一个同学那儿用万能表测过光电管的导通情况,不管如何摆弄,万能表上的数字始终没有变化。在网上查阅资料后才知道,光电管导通时的电压和未导通时变化很小,不足以引被万能表检测到,所以开始设计硬件电路时使用的三极管放大信号。但后来发现还是不太好,信号变化不明显,可能不能被单片机识别。又查阅了资料,发现电压比较器的两个输入端电压相差10mV就能引起输出端从一种状态可靠地转换到另一种状态,所以使用电压比较器是一个非常好的选择。在一天中午去买了LM339电压比较器,顺便买了一些铜柱和螺丝。回来后给洞洞板钻孔,插上螺丝。因为没有合适的电钻,只能钻一个小孔,然后用小刀把孔扩大到合适的位置。洞洞板小刀上老是容易钻到其他孔洞去,然后就会卡在里面,再用力旋转小刀就会断掉,废了两把小刀才把孔全部钻完。又过了几天,把电压比较器焊在了超声波模块后方的空位上,这样比较节省空间。增加两个电位器来调节电压,作为的固定电压输入,与另一输入端作比较。然后把原来焊好的光电感应元件拆下来重新焊电路,去掉了原来的三极管。至此,硬件部分全部完成。
接下来烧写代码,实际效果测试了。
第一步测试遥控模块,遥控顺利,没有发现问题。
第二步测试的是超声波避障。把小车拿到走廊,让小车自由在行走,小车在有障碍物的时候会转弯改变方向,基本效果还是可以的,还是发现了问题,设置的反应距离太近,小车每次都要撞墙后才转弯。重新改了代码,把反应距离增加为原来的两倍,再次测试,这个问题解决。再测试的时候又发现测距数据更新太慢,前面写的是测量三次才更新数据,索性改为每次测量都更新数据。
第三步测试循迹模块,循迹要用到黑胶带,也没有现成的,去附近看了看,发现那儿只有窄的黑胶带,没有宽的,没有办法,只得先买一卷用着。买回来以后在地板上贴上黑胶带,作为轨迹,小车的循迹感光元件对着黑胶带,然后用小螺丝刀拨动电位器,调到一个合适的电压。但不管我怎么调电位器,小车的运动方式都不对,检查了一下代码,代码没发现问题,这才检查循迹模块是不是有误,把线插拔了好多次才试出来是一个循迹模块的问题。把它拆下来,用万能表测,发现元件都是好的,怎么也想不通是哪出错了,郁闷了半天。突然灵光一闪,想起那天焊模块的时候把排针中间两个脚分开了,拿来一看,果然如此,感光元件都没接负极,能不出错吗?加了一小点锡丝焊接上,再放到小车上测试,慢慢旋转电位器,循迹部分正常工作了。
至此,小车制作完成。
下面是电路图,还有成品照片: