巧借离线语音模块做个Arduino“声控门”

2022-01-25 18:50牟晓东
电脑报 2022年3期
关键词:舵机声控离线

牟晓东

在很多的开源硬件编程创客作品中都会用到“语音识别”控制功能,比如通过“小度小度”等唤醒词来实现语音命令的唤醒与传送,目前大部分的语音识别功能都离不开网络支持(像百度智能云)。其实,我们还可以通过离线语音模块(比如好好搭搭的ASR-THREE)来实现语音识别,优点是响应速度非常快,而且支持中英文甚至是方言语音命令的训练学习与应用。如果想要设计制作一个Arduino“声控门”,用户通过发出“请开门!”、“请关门!”的语音指令来控制舵机进行开关门的动作,如何来实现呢?

1.实验装置及连接

实验装置包括Arduino UNO开发板一块,ASR-THREE离线语音模块一个,SG90舵机一个,红色、绿色LED灯各一支,小型面包板一个,各种颜色的杜邦线若干。

首先,通过红色和黑色两根杜邦线,将Arduino的5V和GND端分别连接至面包板的侧边(标注有“+”红色和“-”蓝色长线);接着,将ASR-THREE离线语音模块的V(电源正极)和G(接地端)连接至面包板的电源正极和负极,再将S(Signal)信号端连接至Arduino的3号引脚;然后,将SG90舵机的电源正极和接地端同样也连接至面包板的电源正极和负极,再将信号端连接至Arduino的10号引脚;最后,将红色和绿色LED灯的负极(“短腿”)均插入面包板的负极,正极(“长腿”)则分别通过杜邦线连接至Arduino的13号和12号引脚(如图1)。

2.训练ASR-THREE离线语音模块“学习命令词”

默认情况下,ASR-THREE离线语音模块提供了50多条包括“学习命令”、“唤醒词”和“命令词”在内的语音指令,每条语音指令均对应一个十进制的ID号,比如命令词“打开灯光”的ID号是70、“减小音量”的ID号是104等等。由于在设计制作的Arduino“声控门”项目中需要的语音命令词是“请开门!”和“请关门!”,因此需要进行自定义训练ASR-THREE离线语音模块进行“学习”,方法如下:

将Arduino的数据线连接至电脑的USB接口,很快就有“欢迎使用语音识别助手!”的语音提示;接着,对着离线语音模块的麦克风说出任意一条唤醒词——比如“智能管家”,离线语音模块回答“我在呢!”;再说:“学习命令词”,回答:“学习状态中,保持安静,请按提示学习命令词,请说出第一条要学习的指令”,再说:“请开门!”,回答:“学习成功,请再说一次”;按照提示,最终完成该语音指令命令词的训练学习。同样的操作,再训练完成对“请关门!”语音指令的学习,对应的ID号分别是53和54(如图2)。

3.方法一:在Arduino IDE中進行代码编程

(1)导入库与setup()函数初始化操作

为了进行串口数据传输及控制舵机的操作,需要先通过“#include ”和“#include ”两个语句导入对应的库;接着,通过SoftwareSerial类的构造函数来指定软串口的RX和TX引脚分别是3和6:“SoftwareSerial mySerial(3,6)”;再分别将红色、绿色LED的引脚号进行定义:“int RedLED = 13”、“int GreenLED = 12”;然后,通过“Servo myservo”语句来创建舵机对象,并且建立变量pos来初始化舵机的角度值为0:“int pos = 0”。

在setup()函数中,先设置串口通讯的波特率为115200:“mySerial.begin(115200)”;再将两支LED灯的工作模式设置为输出:“pinMode(RedLED,OUTPUT)”、“pinMode(GreenLED,OUTPUT)”;最后,声明舵机的数据线连接在Arduino的10号引脚:“myservo.attach(10)”(如图3)。

(2)编写open_door()和close_door()函数

先来编写open_door()“开门”函数:当收到“请开门!”语音指令时,首先控制红色LED灯亮:“digitalWrite(RedLED,HIGH)”;然后,通过一个for()循环结构(“for(pos=0;pos<=90;pos+=1)”)来实现舵机的旋转角度由0°逐渐递增为90°:“myservo.write(pos)”,并且在每次旋转增加1°后进行20毫秒的延时:“delay(20)”;最后,控制红色LED灯熄灭、绿色LED灯发光:“digitalWrite(RedLED,LOW)”、“digitalWrite(GreenLED,HIGH)”。

接着,编写close_door()“关门”函数,与open_door()函数非常类似,比如for()循环控制舵机由90°旋转恢复至0°(“for(pos=90;pos>=0;pos-=1)”)、控制红色和绿色LED灯的亮或灭,等等(如图4)。

(3)编写loop()主函数及Arduino“声控门”的测试

loop()主函数非常简单,通过if()语句来判断串口是否有新数据产生:“if (mySerial.available() > 0)”;如果有新数据产生,说明收到了某条语音指令,通过switch多分支结构(“switch (mySerial.read())”)来对语音指令的对应ID号进行判断——如果ID号是53,说明收到的语音指令是“请开门!”,则执行open_door()函数;如果ID号是54,说明收到的语音指令是“请关门!”,则执行close_door()函数。

将程序保存为Sound_Door.ino,上传至Arduino进行测试。先通过“智能管家”唤醒词进行唤醒,再发出“请开门!”语音指令,紅色LED灯亮、舵机由0°旋转至90°、红色LED灯熄灭、绿色LED灯发光;接着再发出“请关门!”语音指令,绿色LED熄灭、红色LED灯发光、舵机由90°旋转至0°、红色LED灯熄灭;反复测试,均能实现语音指令控制舵机正反转开关门的功能(如图5)。

4.方法二:在Mind+中进行图形化编程

启动Mind+,首先点击“扩展”按钮进行主控板中“Arduino Uno”、执行器中“舵机模块”和用户库中“离线语音识别模块”的添加;点击“返回”按钮后开始图形化的编程:

同样也是先编写“开门”和“关门”两个函数,包括红色和绿色LED灯的开关及舵机的旋转控制;然后再进行主程序的编写,包括语音识别的初始化和串口波特率的设置,同样也是在循环结构中先进行语音识别是否有数据可读的判断,然后通过变量Order_ID来存储语音识别的读取数据并判断其数值——如果是53,则调用执行“开门”函数;如果是54,则调用执行“关门”函数(如图6)。

将程序保存为Arduino“声控门”.sb3,点击“连接设备”后再进行程序的上传测试,效果与使用Arduino IDE进行代码编程的测试一致。

猜你喜欢
舵机声控离线
基于卷积神经网络的离线笔迹鉴别系统
新版Windows 10补丁离线安装更简单
声控灯为什么可以节能
海太克HS—1100WP数字舵机
超音速舵机保护器
声控灯为什么可以节能
菜鸟看模型
声控水龙头
好进难出 应对迅雷“口袋战”
舵机的应用