因为之前已经制作过一个臂带式体感交互控制器,里面的很多内容都是可以借鉴的,比如无线模块就不需要在进行配置了。而且这次使用的器件都是可以直接插接的模块,所以制作起来就相当的简单了。
首先把中文语音识别模块插接在UNO控制板上,然后再将IO扩展板插接在中文语音识别模块上,完成后如下图所示。
图3 将3个模块插接起来
其实现在我们已经完成了绝大部分的硬件工作,我说的是真的,剩下的就是连接电池盒、放入电池、插上无线模块,至于那个LED发光模块是起到指示作用的,连接到IO传感器扩展板上的LED发光模块点亮时表示
Arduino正在处理语音数据,看起来就像宾馆房间门口的请勿打扰。我们在程序中使用引脚7来控制这个LED,所有我们将LED模块连接到引脚7,如下图所示。
图4 接上LED发光模块
接下来是程序部分,写程序之前我们需要先确定一下动作表,要将机器人的动作、触发的指令以及语音指令一一对应起来,完成后如表2所示。
之后就开始编写程序了,大家会发现我们在语音指令一列中除了汉字,还有一段拼音。这是因为这个语音模块识别的是“语音”。对于非特定人语音识别来说,在描述关键词语时,是用音标标注出要识别的关键词语。对于Voice Recognition模块支持的中文识别来说,就是用拼音来描述出关键词语。也就是说,只要是拼音可以拼出的发音,都是可以进行识别的。
在程序中我们用了一个数组来保存这几段语音值。
- char sRecog[SUM][80] = {"qian jin", "hou tui", //前进,后退
- "zuo zhuan","you zhuan", "dun xia", //左转,右转,蹲下
- "zuo quan","you quan", //左拳,右拳
- "pa qi lai","zhan qi lai"}; //爬起来,站起来
复制代码
而将语音转换成控制机器人的触发指令我们放在了函数finally()中,函数中使用了一个switch来对应不同的指令。
详细代码如下:
- #include <Voice.h>
-
- #define SUM 9 //SUM表示语音指令的数量,我们这里只设置了9条
- uint8 nAsrStatus=0;
-
- char sRecog[SUM][80] = {"qian jin", "hou tui",
- "zuo zhuan","you zhuan", "dun xia",
- "zuo quan","you quan",
- "pa qi lai","zhan qi lai"};
- //前进,后退
- //左转,右转,蹲下
- //左拳,右拳
- //爬起来,站起来
-
- int state=7; //控制器状态指示灯
-
- void finally (unsigned char n)
- {
- switch(n) //判断语音分析结果
- {
- case 0:
- //前进
-
- Serial.write(1);//向机器人发送1,机器人将做出前进的动作
- break;
-
- case 1:
- //后退
- Serial.write(2); //向机器人发送2,机器人将做出后退的动作
- break;
-
- case 2:
- //左转
- Serial.write(15); //向机器人发送15,机器人将做出左转的动作
- break;
- case 3:
- //右转
- Serial.write(14); //向机器人发送14,机器人将做出右转的动作
- break;
- case 4:
- //蹲下
- Serial.write(12); //向机器人发送12,机器人将做出蹲下的动作
- break;
- case 5:
- //左拳
- Serial.write(6); //向机器人发送6,机器人将做出左拳的动作
- break;
- case 1:
- //右拳
- Serial.write(5); //向机器人发送5,机器人将做出右拳的动作
- break;
- case 1:
- //爬起来
- Serial.write(9); //向机器人发送9,机器人将从前爬起
- break;
- case 1:
- //站起来
- Serial.write(16); //向机器人发送16,机器人将从后爬起
- break;
-
- default:
- break;
- }
- }
-
- void ExtInt0Handler ()
- {
- Voice.ProcessInt0();
- }
-
- void setup()
- {
- Serial.begin(57600);
-
- Voice.Initialise(MIC,VoiceRecognitionV1);
- //Initialise mode MIC or MONO,default is MIC
- //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield
- //VoiceRecognitionV2 is VoiceRecognitionV2.1 module
-
- attachInterrupt(0,ExtInt0Handler,LOW);
- pinMode(state,OUTPUT);
- digitalWrite(state,HIGH); //设置状态灯熄灭,模块是高电平时熄灭
- }
-
- void loop()
- {
- uint8 nAsrRes;
- nAsrStatus = LD_ASR_NONE;
-
- while(1)
- {
- switch(nAsrStatus)
- {
- case LD_ASR_RUNING:
- case LD_ASR_ERROR:
- break;
- case LD_ASR_NONE:
- {
- nAsrStatus=LD_ASR_RUNING;
- if (Voice.RunASR(SUM,80,sRecog)==0)
- {
- nAsrStatus= LD_ASR_ERROR;
- }
- digitalWrite(state,LOW);
- break;
- }
- case LD_ASR_FOUNDOK:
- {
- digitalWrite(state,HIGH);
- nAsrRes =Voice. LD_GetResult();
- finally(nAsrRes);
- nAsrStatus = LD_ASR_NONE;
- break;
- }
- case LD_ASR_FOUNDZERO:
- default:
- {
- nAsrStatus = LD_ASR_NONE;
- break;
- }
- }// switch
- delay(200);
- }// while
- }
复制代码
以上的代码是在中文语音识别模块的示例代码上修改而来的,主要就是修改了finally()函数,模块的示例代码大家可以到DFRobot的网站上下载。
程序下载完成后,我们再接上电源和无线模块。这样,一个简单的语音控制器就做好了,外观如下图所示。
图5 完成后的语音控制器
另外要说明一点,我们使用的中文语音识别模块可以连接一个单声道语音输入设备,连接接口如下图所示。
图6单声道输入接口
通常我们使用的是板载的MIC来输入语音,但如果你觉得这样不够酷,想像电影里的男主人公一样,利用头戴的语音输入设备来输入,就可以利用这个单声道输入接口。
图7 《铁甲钢拳》剧照
把麦克戴在头上,然后把我们之前的那一堆硬件板和电池都放在包里就可以了。不过使用单声道输入设备时还要更改一下程序,在setup()中的Voice.Initialise()函数中的第一个参数要改成MONO,如下所示。
- Voice.Initialise(MONO,VoiceRecognitionV1);
复制代码
To be continued...
相关链接:语音识别扩展板,IO 传感器扩展板,LED发光模块,无线程序下载模块,UNO,电池盒,电池