** 前些天博主课程设计做了一个基于stm32的循迹避障小车,用的是在某宝上买的智能小车的套件,后来闲来无事想改造成一个语音控制的小车,于是又淘了一个LD3320的语音模块,通过语音命令能够控制小车前进、后退、转弯和停止。 这里附上LD3320的完整资料:http://www.waveshare.net/wiki/LD3320_Board 资料里面有stm32的例程,是用语音控制开发板的LED灯,看了资料后发现例程中使用的开发板芯片和我使用的正好相同,都是使用的stm32f103zet6芯片,所以语音模块的串口没有改动,只简单改动了一下LED灯的串口就能用了。
下面是LD3320的引脚图: 如果你的开发板上有对应的串口,可以直接按下图的引脚连接: 博主把代码烧录到板子后才发现自己的板子没有LED灯,是的,没有LED灯,博主都要哭了,于是一生气就把核心板撬掉了,换了一个指南者的板子,花费了两个小时把指南者板子上的引脚连到扩展板对应的引脚上,再烧录程序后发现程序可以正常运行。 下一步把板子装到小车上,下面是连接实物图: 接下来就是程序的问题了,把语音代码和红外避障的代码整合起来,虽然听起来简单,但实际遇到很多问题,比如中断冲突等,博主呕心沥血花了一周时间查阅数据手册和开发手册,终于解决了问题。 于是赶紧把小车放到地上调试,结果遇到了一个更麻烦的问题,LD3320自带的咪头引脚很短,而语音识别的距离很近,所以小车放在地上根本无法识别语音指令,于是博主不得不接着查阅数据手册,发现35寄存器可以修改语音识别的距离,历程中默认值是0x43,值越大识别距离越远,但同时识别的准确率会严重降低,官方推荐的值为40H—55H,重新调试程序后发现语音识别的距离还不是很理想(其实并没有多大改变),不得已,只能想其他的办法。 某天博主正在吃午饭的时候,突发奇想,能不能把咪头拆下来,再引两根线出来不就解决了吗(窃喜),幸亏博主在付诸实践之前先逛了逛论坛,里面有大牛说线太长会导致信号衰减,语音无法识别,于是博主放弃了这个念头,没敢用于实践。但这个问题怎么解决呢?博主盯着手中的筷子,突然有了一个大胆的想法,用筷子把语音模块架高, 最后,博主含泪牺牲了自己的筷子解决了这个问题。 做到这里语音控制小车基本上就完成了,但博主可不是就这样轻易满足的,博主开始想的是小车转弯的角度是90度然后停下,但实际小车会一直不停的旋转,原因是输入语音命令后,代码会把语音命令写到芯片中,然后main()函数会一直循环扫描等待新的语音命令输入,在这个规程中,代码会一直执行上次输入的语音命令,于是修改了部分代码,使每次循环把语音命令清零,解决了这个问题。
#include "LD3320.h"#include "motor.h"#include "redvoid.h"#include "stm32f10x_spi.h"#include "interface.h"uint8 nAsrStatus = 0;uint8 nLD_Mode = LD_MODE_IDLE;uint8 ucRegVal;int f=1;int key=1;int key1=1;extern uint8 nAsrRes=0;//