地图“会唱歌”
——基于Arduino 开发板的语音交互和民歌播放的地图板

2017-05-12 02:11文江苏省锡东高级中学高一班诸裴语涵
发明与创新 2017年18期
关键词:控制板解码民歌

文江苏省锡东高级中学高一(3)班诸裴语涵

地图“会唱歌”
——基于Arduino 开发板的语音交互和民歌播放的地图板

文江苏省锡东高级中学高一(3)班诸裴语涵

在学习地理和音乐的知识时,我的脑海里突然冒出一个想法:能不能制作这样一块地图板,在说出其区域名称后,该区域的LED灯立即闪烁,并播放该区域的代表民歌?在家人的支持下,我开始了有关语音交互和民歌播放地图板的制作实践。

一、构思设计

语音芯片使用LD3320 Board,开发平台使用入门级的双核开源平台Fireduino IDE,存储器用Micro SD Card(TF-Card)模块,再加上一个音频输出模块和小喇叭。结构如图1所示。

图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的音频文件,然后模仿官网例程操作。

void setup(){

Serial.begin(115200);

Serial.print(" arduino setup... ");

if(!SD.begin()){

Serial.println("sd init err ");

while(1);}

Audio.begin(AUDIO_SD);

if(Audio){

Audio.playFile("\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全部调试成功。

猜你喜欢
控制板解码民歌
《解码万吨站》
一种橡胶减震装置
解码eUCP2.0
轨道交通AFC导向标识控制板设计
NAD C368解码/放大器一体机
Quad(国都)Vena解码/放大器一体机
民歌一样的小溪(外二章)
藤县水上民歌
中吕 十二月带尧民歌 十九大胜利闭幕
一种机载SAR中心控制板的设计