地图“会唱歌”
2017-05-12
在学习地理和音乐的知识时,我的脑海里突然冒出一个想法:能不能制作这样一块地图板,在说出其区域名称后,该区域的LED灯立即闪烁,并播放该区域的代表民歌?在家人的支持下,我开始了有关语音交互和民歌播放地图板的制作实践。
一、构思设计
语音芯片使用LD3320 Board,开发平台使用入门级的双核开源平台Fireduino IDE,存储器用Micro SD Card(TF-Card)模块,再加上一个音频输出模块和小喇叭。结构如图1所示。
软件流程的构思如下:对着语音模块说出一个省级地区的名称,然后播放该地区的代表民歌,与此同时,地图板上对应的省份区域内的LED灯开始闪烁。当使用者说出“暂停”后,停止播放当前歌曲并等待下次语音播放。
二、硬件设计
硬件设计中的主控板选择了Fireduino 控制板。这块控制板拥有双核Cortex-M3处理器,集成高质量音频Codec和Wi-Fi模组,具备良好的IOT扩展性能,能完美兼容Arduino IDE和Arduino标准接口,并支持FireBlock图形化编程软件。
一块Fireduino控制板=2×Arduino UNO+Wi-Fi模块+音频模块+RTC模块+Flash模块。
主芯片采用Rockchip双核Cortex-M3主控芯片RKNanoD,它拥有超高的运行频率,并且板载8M字节的大容量SPI Flash。
硬件设计中的语音识别部分采用LD3320 Board模块。该模块采用SPI通信方式,其芯片具有非特定人语音识别技术,不需要用户进行录音训练,只需把识别的关键词以字符串的形式传送进芯片,即可在下次識别中生效。
比如,用户在51等MCU的编程中简单地通过设置芯片的寄存器,把诸如“你好”的识别关键词的内容动态地传入芯片,芯片就可以识别设定的关键词语了。同时,可在用户自由编辑的50条关键词语中进行识别,终端用户可根据场景需要,随时编辑和更新这50条关键词语的内容。
以上两大模块只需使用9根杜邦线连接,再将SPI控制线的3根线一一对应接上,SS芯片选择线接9号引脚,IRQ外部中断引脚接2号引脚,WR串并口选择线接地选择SPI方式控制即可。
三、软件程序
以江苏省为例。对着语音模块说出“江苏”,此时开始播放歌曲《茉莉花》,播放过程中说出“暂停”,暂停当前歌曲,再说出“继续”,继续播放歌曲,说出“停止”,终止播放当前歌曲。终止播放歌曲后,说出其他省份才开始播放当地代表歌曲。
1.伪指令
需要初始化的内容包括:串口、TF卡功能、Audio功能、LD3320模块。
添加识别语句:如“江苏”等各省份的名字。
死循环处理:如果说出“程序开始”,那么跳出死循环,否则继续等待。
2.主程序
判断选择(识别语句)→判断省份→播放民歌并驱动闪烁显示→若暂停,停止解码→若继续,恢复解码→播放结束退出循环。
Fireduino关于Audio的例程中有针对查询解码的例程,且暂停、恢复、停止的解码都有相关的函数,只需按照伪程序的思路编写就可以完成。
四、调试过程
Fireduino控制板与电脑的USB连接,根据官方维基百科的提示来安装驱动,上位机Arduino IDE选择端口后下载Blink例程,可以看到板上的LED灯开始闪烁,说明程序下载正确。再插上TF卡和小喇叭,根据官方的播放音乐驱动进行循环播放。
1.调试TF卡和小喇叭
先在TF卡中下载一个名为test.mp3的音频文件,然后模仿官网例程操作。
以上程序的说明为:
(1)初始化串口,以便后续打印调试信息。
(2)初始化TF卡,后续需从TF卡读取音乐文件用于解码。
(3)初始化Audio,并且采用AUDIO_SD 方式。
(4)如果初始化Audio 成功,播放MP3文件。
短暂调试过后,如果听到声音,说明TF卡和小喇叭已调试成功,然后开始调试LD3320芯片模块。
2.使用Arduino UNO板对LD3320进行开发
接好线后,下载语音模块的官方例程,再接一个LED灯在8号脚上,编译程序并下载好后,对着模块说出“开灯”,LED灯点亮,说明例程没有问题。说出“关灯”,LED灯熄灭。
在Arduino UNO调试成功后,再将LD3320与Fireduino连接并调试。
3.再次调试
在详细检查官方的驱动文件后,发现官方的Arduino驱动采用模拟SPI的方式进行,且函数名字也相同,与Fireduino的SPI函数有冲突。为解决这个问题,将LD3320.h和LD3320.cpp的驱动文件中关于SPI部分的文件采用硬件SPI的方式后,才将程序烧录进去。之后多次调试还是没有成功。
经过反复实验后发现,Fireduino是ARM内核,且运算频率高达200MHz,delay()函数过于短暂,LD3320对不上Fireduino的SPI握手协议。为解决这个问题,需增加驱动中需要延时的地方的时长,并反复调试直至成功。
至此,Fireduino的TF、Audio与LD3320全部调试成功。