1. 功能说明
本文实例将实现语音控制R214e样机运动(前进、后退、左转、右转、拿起、放下)的功能。
2. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
主控板 | Basra主控板(兼容Arduino Uno) |
扩展板 | Bigfish2.1扩展板 |
传感器 | 语音识别模块 |
电池 | 7.4V锂电池 |
电路连接:
① 小车左轮电机连到Bigfish扩展板的D9,D10接口;小车右轮电机连到Bigfish扩展板的D5,D6
② 将语音识别模块HBR640连接到Bigfish扩展板的扩展坞上
③ 将关节模块的舵机线连接到Bigfish扩展板的D11端口上
④ 将机械爪的舵机线连接到Bigfish扩展板的D12端口上
3. 功能实现
编程环境:Arduino 1.8.19
实现思路:语音命令机器人前进、后退、左转、右转、拿起、放下。
3.1 配置语音库
步骤1:将文末资料中的\语音识别模块HBR640文件夹拷贝至本机位置。
步骤2:将语音HBR640模块更改为“配置模式”,并用一个USB线将主控板连接至电脑上,将下图中的空程序烧录至主控板中
(注意:在烧录程序的时候,语音识别HBR640要从扩展板的扩展坞上拔下来)
步骤3:打开\语音识别模块HBR640\4 开发工具\HBR640开发工具:SRTool.exe(如下图所示)
步骤4:先新建一个“HBR640对话工程”文件夹,然后在软件中点击“新建”,选择“HBR640对话工程”文件夹后,再创建一个文件名“che”,点击“保存”。
步骤5:在下图中的“未命名”区增加“机器人”分组。
步骤6:在下图所示位置添加“前进”命令,然后点击“增加”按钮,即可将“前进”命令添加至左侧的词条列表中。
步骤7:在下图所示位置再添加“后退”命令,然后点击“增加”按钮,即可将“后退”命令添加至左侧的词条列表中。
步骤8:按照步骤6、步骤7的方式依次再分别添加“左转”、“右转”、“拿起”、“放下”命令至左侧的词条列表中。
步骤9:点击“保存词条”。
步骤10:点击“生成”按钮。
步骤11:选择端口号,并点击“连接”,显示连接成功即可(这里以端口号COM17为例)
步骤12:点击“烧录”并选择“全部”。在烧录过程中尽量不要移动主控板,显示烧录成功即可。
步骤13:点击“测试”按钮,会在左侧的词条列表下面出现“候选命令”区。
步骤14:对着语音识别模块分别说出刚刚编辑的命令“后退”、“前进”、“左转”、“右转”、“拿起”、“放下”时,会在候选命令区出现对应的识别结果。
步骤15:测试成功后,点击“停止”按钮,并“断开”连接,此时语音库即已配置完成。
3.2 示例程序
将机器人语音控制程序(ohmygod.ino)下载到主控板,实验效果可参考官网演示视频。
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-04-23 https://www.robotway.com/
------------------------------*/
/*******************************************************************************************************
实现功能:
用语音640实现语音小车;
实现思路:
将语音640安装好后,如果接收到命令为“前进”,小车前进1秒后停止;如果接收到命令为“后退”,小车
后退1秒后停止;如果接收到命令为“左转”,小车左转1秒后停止;如果接收到命令为“右转”,小车右转
1秒后停止;如果接收到命令为“拿起”,机械爪抓取物体;如果接收到命令为“放下”,机械爪释放物体
实验接线:
小车左轮接到D9,D10;
小车右轮接到D5,D6;
语音640模块接到扩展板的扩展坞上;
*******************************************************************************************************/
#include<ServoTimer2.h>;
ServoTimer2 servo_arm12;
ServoTimer2 servo_leg11;
#define servo_catch 63
#define servo_release 80
#define servo_up 30
#define servo_down 70
#include "HBR640.h" //语音640需要的函数库
#define DelayTime 1000//小车执行相关动作的时间;
HBR640 hbr640; //实例化一个语音识别模块
void setup(){
hbr640.open(); //开始进行语音识别
pinMode( 5 , OUTPUT);
pinMode( 6 , OUTPUT);
pinMode( 9 , OUTPUT);
pinMode( 10 , OUTPUT);//将直流电机设置为输出模式;
servo_arm12.attach(12);
servo_arm12.write(map(servo_release,0,180,500,2500));
servo_leg11.attach(11);
servo_leg11.write(map(servo_down,0,180,500,2500));
}
void loop(){
if(hbr640.isHeard()) //如果监测到识别语句
{
int value = hbr640.getSentence(); //获得识别语句的序号
switch (value)
{
case 0x00: MotorMode(1,DelayTime); hbr640.open();break;//如果接收到命令为“前进”,小车前进1秒后停止;
case 0x01: MotorMode(2,DelayTime); hbr640.open();break;//如果接收到命令为“后退”,小车后退1秒后停止;
case 0x02: MotorMode(3,DelayTime); hbr640.open();break;//如果接收到命令为“左转”,小车左转1秒后停止;
case 0x03: MotorMode(4,DelayTime); hbr640.open();break;//如果接收到命令为“右转”,小车右转1秒后停止;
case 0x04: down();delay(1000);Catch();delay(1000);up ();delay(1000); hbr640.open();break;//如果接收到命令为“拿起”,机械爪抓取物体
case 0x05: down();delay(1000);Release(); delay(1000);up ();delay(1000);hbr640.open();break;//如果接收到命令为“放下”,机械爪释放物体
default: break;
}
}
}
void Catch()//拿起
{
servo_arm12.write(map(servo_catch,0,180,500,2500));
}
void up ()//拿起
{
servo_leg11.write(map(servo_up,0,180,500,2500));
}
void Release()//放下
{
servo_arm12.write(map(servo_release,0,180,500,2500));
}
void down()//放下
{
servo_leg11.write(map(servo_down,0,180,500,2500));
}
void MotorMode(int mode,int t) //直流电机模式;
{
switch(mode)
{
case 1: Forward(t); break;
case 2: Back(t); break;
case 3: Left(t); break;
case 4: Right(t); break;
case 5: Stop(t); break;
}
}
void Forward(int t) //前进
{
digitalWrite(5,LOW);digitalWrite(6,LOW);
digitalWrite(10,HIGH);digitalWrite(9,HIGH);
delay(t); Stop(2);
}
void Back(int t) //后退
{
digitalWrite(10,LOW);digitalWrite(9,LOW);
digitalWrite(5,HIGH);digitalWrite(6,HIGH);
delay(t); Stop(2);
}
void Left(int t) //左转
{
digitalWrite(5,HIGH);digitalWrite(6,LOW);
digitalWrite(9,LOW);digitalWrite(10,HIGH);
delay(t); Stop(2);
}
void Right(int t) //右转
{
digitalWrite(5,LOW);digitalWrite(6,HIGH);
digitalWrite(10,LOW);digitalWrite(9,HIGH);
delay(t); Stop(2);
}
void Stop(int t) //停止
{
digitalWrite(5,HIGH);digitalWrite(6,HIGH);
digitalWrite(9,HIGH);digitalWrite(10,HIGH);
delay(t);
}
void serialEvent() //程序会自动调用该程序;
{
hbr640.lisen(); //在串口接收事件中调用语音识别的监听指令
}
观察语音控制效果(注意:将语音识别HBR640模块更改为运行模式)。
4. 资料内容
①语音控制-例程源代码
②语音控制-样机3D文件
③语音识别模块HBR640
资料内容详见:轮式机械臂小车-语音控制