查看: 6947|回复: 3

[项目] 现实版铁甲钢拳 4 ——语音控制器

[复制链接]
本帖最后由 nille 于 2014-8-26 15:33 编辑

IMG_20140806_140628.jpg

  虽然之前写了几篇铁甲钢但其实还真没看过《铁甲钢拳Real Steel》这部电影。这里要感谢电影频道,让我前段时间在电视上看了这部电影,总体感觉是剧情很老套,但我们看的不是剧情,对吧!!如果你看过史泰龙主演的《洛奇》系列,就知道这是个经典的桥段,甚至感觉就是《洛奇》的续集,或者说是在向《洛奇》致敬。
1.jpg
图1 《铁甲钢拳》海报

  在看电影的时候,我发现亚当在中间的一段时间都是采用语音控制的,小男主人公给亚当添加了语音控制模块。为了表明我是看过电影的,于是决定为我的机器人也做一个语音控制器。
  首先开始理一下我们都需要什么器件,我用到的器材如下,参见图2:

biao1.jpg

QQ图片20140826145638.jpg

图2 器件清单

  因为之前已经制作过一个臂带式体感交互控制器,里面的很多内容都是可以借鉴的,比如无线模块就不需要在进行配置了。而且这次使用的器件都是可以直接插接的模块,所以制作起来就相当的简单了。
  首先把中文语音识别模块插接在UNO控制板上,然后再将IO扩展板插接在中文语音识别模块上,完成后如下图所示。
IMG_20140806_135936.jpg
图3 将3个模块插接起来

  其实现在我们已经完成了绝大部分的硬件工作,我说的是真的,剩下的就是连接电池盒、放入电池、插上无线模块,至于那个LED发光模块是起到指示作用的,连接到IO传感器扩展板上的LED发光模块点亮时表示Arduino正在处理语音数据,看起来就像宾馆房间门口的请勿打扰。我们在程序中使用引脚7来控制这个LED,所有我们将LED模块连接到引脚7,如下图所示。
IMG_20140806_140057.jpg
图4 接上LED发光模块

  接下来是程序部分,写程序之前我们需要先确定一下动作表,要将机器人的动作、触发的指令以及语音指令一一对应起来,完成后如表2所示。
QQ图片20140826145725.jpg



  之后就开始编写程序了,大家会发现我们在语音指令一列中除了汉字,还有一段拼音。这是因为这个语音模块识别的是“语音”。对于非特定人语音识别来说,在描述关键词语时,是用音标标注出要识别的关键词语。对于Voice Recognition模块支持的中文识别来说,就是用拼音来描述出关键词语。也就是说,只要是拼音可以拼出的发音,都是可以进行识别的。
  在程序中我们用了一个数组来保存这几段语音值。
  1. char sRecog[SUM][80] = {"qian jin", "hou tui",       //前进,后退
  2.                           "zuo zhuan","you zhuan", "dun xia",  //左转,右转,蹲下
  3.                           "zuo quan","you quan",   //左拳,右拳
  4.                           "pa qi lai","zhan qi lai"};  //爬起来,站起来
复制代码
  而将语音转换成控制机器人的触发指令我们放在了函数finally()中,函数中使用了一个switch来对应不同的指令。

  详细代码如下:
  1. #include <Voice.h>
  2. #define SUM 9                                 //SUM表示语音指令的数量,我们这里只设置了9条
  3. uint8  nAsrStatus=0;
  4. char sRecog[SUM][80] = {"qian jin", "hou tui",
  5.                           "zuo zhuan","you zhuan", "dun xia",
  6.                           "zuo quan","you quan",
  7.                           "pa qi lai","zhan qi lai"};
  8.   //前进,后退
  9.   //左转,右转,蹲下
  10.   //左拳,右拳
  11.   //爬起来,站起来
  12.   
  13. int state=7;  //控制器状态指示灯
  14. void finally (unsigned char n)
  15. {
  16. switch(n)          //判断语音分析结果
  17.         {
  18.         case 0:
  19.   //前进
  20.   
  21.   Serial.write(1);//向机器人发送1,机器人将做出前进的动作
  22.                 break;
  23.         case 1:
  24.   //后退
  25.                 Serial.write(2); //向机器人发送2,机器人将做出后退的动作
  26.                 break;
  27.         case 2:
  28.   //左转
  29.                 Serial.write(15); //向机器人发送15,机器人将做出左转的动作
  30.                 break;
  31.         case 3:
  32.   //右转
  33.                 Serial.write(14); //向机器人发送14,机器人将做出右转的动作
  34.                 break;
  35.         case 4:
  36.   //蹲下
  37.                 Serial.write(12); //向机器人发送12,机器人将做出蹲下的动作
  38.                 break;
  39.         case 5:
  40.   //左拳
  41.                 Serial.write(6); //向机器人发送6,机器人将做出左拳的动作
  42.                 break;
  43.         case 1:
  44.   //右拳
  45.                 Serial.write(5); //向机器人发送5,机器人将做出右拳的动作
  46.                 break;
  47.         case 1:
  48.   //爬起来
  49.                 Serial.write(9); //向机器人发送9,机器人将从前爬起
  50.                 break;
  51.         case 1:
  52.   //站起来
  53.                 Serial.write(16); //向机器人发送16,机器人将从后爬起
  54.                 break;
  55.         default:
  56.             break;        
  57.         }
  58. }
  59. void ExtInt0Handler ()
  60. {
  61.          Voice.ProcessInt0();                                
  62. }
  63. void setup()
  64. {
  65.          Serial.begin(57600);
  66.   Voice.Initialise(MIC,VoiceRecognitionV1);
  67.   //Initialise mode MIC or MONO,default is MIC
  68.     //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield
  69.     //VoiceRecognitionV2 is VoiceRecognitionV2.1 module
  70.   
  71.   attachInterrupt(0,ExtInt0Handler,LOW);
  72.   pinMode(state,OUTPUT);
  73.   digitalWrite(state,HIGH);        //设置状态灯熄灭,模块是高电平时熄灭
  74. }
  75. void loop()
  76. {  
  77.   uint8 nAsrRes;
  78.   nAsrStatus = LD_ASR_NONE;
  79.         while(1)
  80.         {
  81.                 switch(nAsrStatus)
  82.                 {
  83.                         case LD_ASR_RUNING:
  84.                         case LD_ASR_ERROR:               
  85.                                 break;
  86.                         case LD_ASR_NONE:
  87.                         {
  88.                                 nAsrStatus=LD_ASR_RUNING;
  89.                 if (Voice.RunASR(SUM,80,sRecog)==0)
  90.                                 {      
  91.                                         nAsrStatus= LD_ASR_ERROR;
  92.                                 }
  93.                 digitalWrite(state,LOW);
  94.                                 break;
  95.                         }
  96.                         case LD_ASR_FOUNDOK:
  97.                         {
  98.                 digitalWrite(state,HIGH);
  99.                                 nAsrRes =Voice. LD_GetResult();
  100.                 finally(nAsrRes);
  101.                                 nAsrStatus = LD_ASR_NONE;
  102.                                 break;
  103.                         }
  104.                         case LD_ASR_FOUNDZERO:
  105.                         default:
  106.                         {
  107.                                 nAsrStatus = LD_ASR_NONE;
  108.                                 break;
  109.                         }
  110.             }// switch
  111.         delay(200);
  112.         }// while
  113. }
复制代码

  以上的代码是在中文语音识别模块的示例代码上修改而来的,主要就是修改了finally()函数,模块的示例代码大家可以到DFRobot的网站上下载。
  程序下载完成后,我们再接上电源和无线模块。这样,一个简单的语音控制器就做好了,外观如下图所示。
IMG_20140806_140336.jpg
图5 完成后的语音控制器

  另外要说明一点,我们使用的中文语音识别模块可以连接一个单声道语音输入设备,连接接口如下图所示。
600px-Voice_Recognition_V1.0_1.jpg
图6单声道输入接口
  通常我们使用的是板载的MIC来输入语音,但如果你觉得这样不够酷,想像电影里的男主人公一样,利用头戴的语音输入设备来输入,就可以利用这个单声道输入接口。
9356a883jw1dorn33uh43j.jpg
图7 《铁甲钢拳》剧照
  把麦克戴在头上,然后把我们之前的那一堆硬件板和电池都放在包里就可以了。不过使用单声道输入设备时还要更改一下程序,在setup()中的Voice.Initialise()函数中的第一个参数要改成MONO,如下所示。

  1.   Voice.Initialise(MONO,VoiceRecognitionV1);
复制代码

To be continued...





相关链接:语音识别扩展板IO 传感器扩展板LED发光模块无线程序下载模块UNO,电池盒,电池




mickey  NPC

发表于 2014-8-27 11:39:11

程老师V5
回复

使用道具 举报

amy.liao  高级技师

发表于 2014-11-21 20:02:05

图片良心!内容良心!好想买一个回来玩玩呢,LZ下次直接在零件名称上给个超链接嘛。
回复

使用道具 举报

Eric  初级技神

发表于 2014-12-7 19:10:43

我也要玩~这个应用很好啊,而且还写的这么详细,超赞~~~!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail