SKU:RB-13K049 AS-4WD语音识别操控移动机器人
产品概述
AS - 4WD 语音识别移动机器人语音识别采用凌阳单片机控制器,它可以学习记录你的声音,并且跟你实现人机对话,通过识别和理解过程把语音信号转变为相应的命令,经过无线蓝牙模块传输给机器人,从而可以完成前进、后退、左转、右转、测距播报等功能,实现人机互动。
产品参数
- 产品名称:AS - 4WD 语音识别操控移动平台
- 产品类型:轮式移动机器人
- 产品货号:RB - 13K049
- 编程软件:Arduino IDE
- 基础模块:凌阳61、蓝牙模块、Carduino UNO R3、传感器扩展板 V5.0、双 H 桥电机驱动板
- 控制方式:语音操控
- 操控距离:5 m - 8 m
- 产品尺寸:215 * 200 * 120 mm
- 产品重量:1.5 kg
配件技术参数
移动平台参数
- 平台长度:206mm
- 平台宽度:200mm
- 平台高度:65mm
- 平台重量:620g
平台尺寸图
直流减速电机(1:48)
- 驱动电机齿轮箱减速比:1:48
- 额定转速(6V):270±10 rpm
- 额定转速(7.4V):340±10 rpm
- 额定电流(6V):180±10 mA
- 额定电流(7.4V):200±10 mA
- 最大扭矩(6V):大于等于 0.095 Nm
- 最大扭矩(7.4V):0.11 Nm
- 堵转电流(6V):小于等于1A
- 堵转电流(7.4V):小于等于1.2A
- 尺寸大小:70.50 mm×27.00 mm×23.00 mm(长×宽×高)
- 重量大小:约 30g
电控配件参数
配件清单
- 4WD 铝合金移动平台 * 1套
- 4WD 语音识别操控移动机器人附件
安装步骤 - 4WD铝合金平台部分
4wd 铝合金平台内部元件详解(图片标号对应清单序号)
步骤1:焊接部分
电机连接线焊接
1、准备如下图所示的材料
- 4 * 直流减速电机;
- 4 * 红色导线(长度为 15cm);
- 4 * 黑色导线(长度为 15cm);
- 4 * 扎带
2、如下图所示,将红黑导线焊接到电机上,并将两个电机连接到一起
3、如下图所示,分别在两组电机上焊接两条线,为了后续连接到驱动板使用,再将四个电机都捆绑上扎带后,电机部分的焊接就完成了
开关接口线焊接
1、准备如下图所示的材料
- 充电接口
- 拨动开关
- 连接线(红色 10cm * 1条、红色 15cm * 1条、黑色 15cm * 1条、红色 20cm * 1条、黑色 20cm * 1条)、热缩管、电池盒
2、如图所示,进行连接线的焊接
3、如图所示,连接充电接口和拨动开关
4、如图所示,使用两根较短的线连接电池盒
注意:本例中小车的供电使用的电池盒,本电池盒需要使用的是 6 节 5 号电池盒,若使用锂电池,焊接的方式是相同的。
更加详细的制作过程,可以点击:充电接口及拨动开关制作方法
步骤2:侧板电机安装
1、准备如下图所示的材料:
- 2 * 黄色直流减速电机
- 1 * 平台侧板
- 4 * M3 * 25 螺丝
- 4 * M3 六角螺母
2、如图所示,将电机安装到侧板 实物安装图:
3、进行另一侧板电机的安装,如图所示,为两侧电机安装完成效果图
步骤3:侧板与底板的安装
1、准备如下图所示的材料:
- 2 * 步骤 2 中安装好的侧板
- 1 * 平台底板
- 4 * M3 * 6螺丝
2、按照下图进行安装 安装实物图:
步骤4:电机驱动板的安装
1、准备如下图所示的材料:
- 步骤 3 中安装好的零件
- 1 * 电机驱动板
- 4 * M3 * 6螺丝
- 4 * M3 螺母
- 4 * M3 * 10 尼龙柱
2、将尼龙柱固定到小车的底板上,位置如下图所示:
3、安装双H桥驱动板,如图所示:
步骤5:电机接线
1、如图所示,将两侧电机的红线连接到电机驱动板的 A 接口,黑线连接到电机驱动板的 B 接口
2、安装完成效果如下图所示
步骤6:上板充电接口拨动开关安装
1、准备如下图所示的材料:
- 步骤 1 中做好的充电接口拨动开关连接线
- 平台上板
2、安装完成效果如图所示
步骤7:控制器的安装
1、准备如下图所示的材料
- 步骤 6 中安装好的零件
- Carduino UNO 控制器
- 传感器扩展板 V5.0
- 3 * 尼龙柱 M3 * 10
- 3 * M3 螺母
- 3 * M3 * 6 螺丝
2、在小车上支撑板安装控制器的固定尼龙柱,位置如下图所示:
3、如图所示,安装 Carduino UNO 控制器
4、如图所示,插入扩展板
扩展板插入效果图:
步骤8:电控部分接线
1、准备如下图所示的材料
- 2 * 3P 传感器连接线
- 供电线,红色黑色各一条 * 20cm
- 平台车体
- 平台上板
2、如图所示为双H桥驱动板和 Carduino UNO 控制器的接线顺序
(1) 双H桥驱动板端接线顺序
- 黄色 EA、红色 I2、黑色 I1
- 黄色 EB、红色 I4、黑色 I1
(2)传感器扩展板端接线顺序
- EA - D5、I2 - D6、I1 - D7
- EB - D11、I4 - D10、I3 - D9
(3)完成效果如下图所示,为了布线看起来更加整齐,我们将 3P 线从小车上板的孔穿出
3、供电部分连接
(1)如图所示为双H桥驱动板部分供电线连接,充电接口红色导线接到 VMS,黑色导线接到 GND;将双 H 桥驱动板输出的 5v 电源连接到 V5.0 扩展板的红色端子,连接时注意正负极不要接错;
(2)如图所示为传感器扩展板 V5.0 供电线连接
步骤9:舵机安装
1、准备如下图所示的材料:
- 1 * 35PG 舵机
- 1 * 小车车体
- 1 * M4 * 8 螺丝套装
2、按照下图进行安装 安装实物图:
3、舵机接线
语音小车的舵机起到的是支撑超声波传感器作用,所以不需要连接到 Arduino 的接口上。接线悬空即可
步骤10:超声波传感器支架安装
1、准备如下图所示的材料:
- 1 * 超声波传感器支架
- 1 * 圆形舵盘
- 1 * 黑色自攻钉(大)
- 4 * 黑色自攻钉(小)
2、按照下图给超声波传感器支架分别安装橡胶套圈、圆形舵盘 安装实物图:
3、如图所示,将超声波支架连接到舵机轴,注意在连接舵机和超声波支架的时候,尽量不要转动舵机,使舵机仍然保持在中间位置上
步骤11:超声波传感器安装
1、准备如下图所示的材料:
- 1 * 安装好的车体
- 1 * 超声波传感器
- 2 * M3 * 10 尼龙柱
- 2 * M3 螺母
- 2 * M3 * 6 螺丝
2、如下图所示,首先将超声波传感器调节到模式 1
3、在下图所示位置安装尼龙柱用来固定超声波传感器,并将 4P 线从超声波支架较小的孔中穿出
4、如图所示,安装超声波传感器,由于例程中使用的是单模式,超声波传感器只需连接 input 引脚,所以我们将 4P 线中的黄色线取掉
步骤12:传感器接线
如图所示,将超声波传感器连接到传感器扩展板 V5.0
注意:4WD 语音识别小车中的舵机,不需要连接任何接口,只是起到了固定超声波传感器的作用。
步骤13:4WD 平台上板安装
1、准备如下图所示的材料:
- 未固定上板的车体
- 4 * M3 * 6螺丝
2、在图中圆圈位置安装 4 个 M3 * 6 螺丝来固定小车上板
步骤14:4WD 平台端板安装
1、准备如下图所示的材料:
- 步骤 13 中安装好的车体
- 2 * 小车端板
- 8 * M3 * 6 螺丝
2、如图所示,将端板与车体进行固定
步骤15:4WD 平台车轮安装
1、准备如下图所示的材料:
- 步骤 14 中安装好的车体
- 4 * 车轮
2、如图所示,将车轮与车体安装在一起
步骤16:插接蓝牙模块
1、准备如下图所示的材料:
- 1 * 蓝牙模块
- 步骤 15 中安装好的小车平台整体
2、将蓝牙模块插接到传感器扩展板的蓝牙接口上,如图所示
安装步骤 - 语音操控部分
1、准备如下产品
- 凌阳开发板 * 1套
- 蓝牙模块 * 1个(模式:主)
注:如果不知道如何配置蓝牙模块主从模式,可以参考:蓝牙模块说明书
- 10P 杜邦线 * 1组
2、凌阳61实验板部分接线
- 如图所示,连接电池盒凌阳实验板
3、语音训练
按一下KEY3 键开始按照语音提示进行语音训练。
训练采用应答形式,每条指令训练两次,每条命令的训练方法是相同的,以第一条命令“前进”为例说明:
第一步:控制器提示“前进”
第二步:我们对着话筒说“前进”
第三步:语音控制器提示“再说一遍”
第四步:我们再次对着话筒说“前进”
到此第一条命令训练完毕。如果训练成功控制器会自动进入下一条命令的训练,如果环境很吵或前后你说的话偏差太大,控制器会提示“没有声音”或者“没有听清”这样这条命令就会从新训练。当所有的命令训练完毕,控制器会提示“准备好了”。此时命令已经存储完毕,断电后开启不用从新训练,如果在训练过程中断电,则再次上电时会从新从第一条训练。
4、按键说明
按键位置图:
- KEY1:按下KEY1 键播放控制器内所有语音(控制器自检功能)
- KEY2:紧急停止命令等同语音“停止”命令
- KEY3:从新进行语音训练(当识别灵敏度降低或更换法令人时使用)
5、接线说明
按照图中说明连接凌阳61板和蓝牙模块
说明:控制器——无线蓝牙模块
- IOB7(RXD) ——PIN5(TXD)
- IOB10(TXD)——PIN4(RXD)
- IOB+(5V) ———PIN1(5V)
- IOB-(GND)———PIN2(GND)
例子程序
凌阳板烧录程序
//========================================================
//按键3可从新训练
//程序说明学习五条语音命令并控制相应动作
//命令名称 对应位置 对应文件 发送数据
//红灯亮 S_ACT0 go.48k W 第二次‘1’第三次‘2’
//绿灯亮 S_ACT1 back.48k X
//红灯灭 S_ACT2 left.48k A
//绿灯灭 S_ACT3 right.48k D
//全都灭 S_ACT4 stop.48k S 第二次‘#’接收数据
//播放超声测试距离精度5CM 范围1-45CM 超过播放999
// TXD IOB10
// RXD IOB7 高电`平
//========================================================
//修改前后左右提示“请注意”
#include "s480.h"
#include "bsrsd.h"
#include "SPCE061A.h"
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_TimerA_Data (volatile unsigned int *)0x700A
#define P_TimerA_Ctrl (volatile unsigned int *)0x700B
#define P_TimerB_Data (volatile unsigned int *)0x700C
#define P_TimerB_Ctrl (volatile unsigned int *)0x700D
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define P_INT_Mask (volatile unsigned int *)0x702D
#define P_INT_Clear (volatile unsigned int *)0x7011
//=============================================================
// 波特率定义 49MHz情况下使用哪个用哪个
//=============================================================
//#define C_UARTBaudRate_9600_H 0x05 ////波特率设置为9600bps
//#define C_UARTBaudRate_9600_L 0x00
#define C_UARTBaudRate_115200_H 0x00; //波特率设置为115200bps
#define C_UARTBaudRate_115200_L 0x6B
#define RED_ON 0x100 //训练存储地址
#define BLUE_ON 0x101
#define RED_OFF 0x102
#define BLUE_OFF 0x103
#define ALL_OFF 0x104
#define S_ACT0 0 //红灯亮
#define S_ACT1 1 //绿灯亮
#define S_ACT2 2 //红灯灭
#define S_ACT3 3 //绿灯灭
#define S_ACT4 4 //全灭
#define S_RDY 5 //Yeah
#define S_AGAIN 6 //请再说一遍
#define S_NOVOICE 7 //没有听到任何声音
#define S_CMDDIFF 8 //没有听清
#define S_NOISY 8 //没有听清
#define S_START 9 //准备就绪,开始辨识
#define S_QZY 10 //请注意
#define JIASU 11 //加速
#define QUANSU 12 //减速
#define DQJL 13 //当前距离
#define CM 14 //厘米
#define POINT 15 //点
#define ONE 16 //1
#define TWO 17 //2
#define THREE 18 //3
#define FOUR 19 //4
#define FIVE 20 //5
#define SIX 21 //6
#define SEVEN 22 //7
#define EIGHT 23 //8
#define NINE 24 //9
#define TEN 25 //10
extern unsigned int BSR_SDModel[100]; //外部变量BSR_SDModel[100],辨识器自带
extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);
extern void F_FlashErase(unsigned int sector);
unsigned int uiTimeset = 3; //运行时间定时,调整该参数控制运行时间
unsigned int uiTimecont; //运行时间计时
unsigned int SPEED = 0; //速度标志位
unsigned int STOP = 0; //停止次数记录
unsigned int g_uiData; //收到的数据
unsigned int RxNum = 0, RxEndSign = 0; //收到数据寄存器
//char RxData[3];
unsigned int TxNumTemp, TxNum, TxEndSign; //发送数据标志
char RXdata;
//=============================================================
// 语法格式: void Delay();
// 实现功能: 延时
// 参数: 无
// 返回值: 无
//=============================================================
void Delay()
{
unsigned int i;
for(i=0;i<0x3Fff;i++)
{
*P_Watchdog_Clear=0x0001;
}
}
//=============================================================
// 语法格式: void Delay_Us(unsigned int TimeCnt)
// 实现功能: 延时(uS)
// 参数: unsigned int TimeCnt:延时的us数
// 返回值: 无
//=============================================================
void Delay_Us(unsigned int TimeCnt)
{
int i;
*P_SystemClock = 0x98;
for(i = 0; i < TimeCnt; i++)
{
*P_Watchdog_Clear = 0x0001;
}
}
/*
//=============================================================
// 语法格式: void IRQ7(void);
// 实现功能: 接收UART数据并存
// 参数: 无
// 返回值: 无
//=============================================================
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
*P_Watchdog_Clear = 0x0001;
if((*P_UART_Command2&0x0080) != 0)
{
for(RxNum=0;RxNum<3;RxNum++){
g_uiData = *P_UART_Data; //取收到数据
RxData[RxNum] = g_uiData;
}
}
}*/
/*==========================================================
// 实现功能 UART中断
============================================================*/
void IRQ7(void)__attribute__((ISR));
void IRQ7(void)
{
// if((*P_UART_Command2&0x80)!=0)
// {
RXdata = *P_UART_Data;
// }
}
//=============================================================
// 实现功能: ULTRA初始化
//=============================================================
void UART_Init(void)
{
*P_IOB_Dir |= 0x0400; // bit10设为输出口(Tx),bit7设为输入口(Rx)
*P_IOB_Dir &= 0xff7f;
*P_IOB_Attrib |= 0x0400;
*P_IOB_Attrib &= 0xff7f;
*P_IOB_Buffer |= 0x0400;
*P_UART_Command1 = C_UART_Reset; //UART复位
*P_UART_BaudScalarHigh = C_UARTBaudRate_115200_H; //波特率设为115200
*P_UART_BaudScalarLow = C_UARTBaudRate_115200_L;
*P_UART_Command1 = 0x80; //UART接收中断使能
*P_UART_Command2 = 0xc0; //UART接收发送管脚使能
}
//=============================================================
// 实现功能: 串口接收数据
//=============================================================
unsigned int UartreciveByte(void) //该函数在中断服务程序中
{
int a,dat;
a=*P_UART_Command2;
a=a&0x0080;
while(a==0) //Check bit 6 to see if TxRDY = 1
{
a=*P_UART_Command2;
a=a&0x0080;
*P_Watchdog_Clear=0x0001;
}
dat =*P_UART_Data; // recive data
return dat;
}
//=============================================================
// 实现功能: 串口发送数据
//=============================================================
void UartSendByte(unsigned int data) //
{
int a;
a=*P_UART_Command2;
a=a&0x0040;
while(!a) //Check bit 6 to see if TxRDY = 1
{
a=*P_UART_Command2;
a=a&0x0040;
}
*P_UART_Data=data; // send data
}
//=============================================================
// 语法格式: void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);
// 实现功能: 语音播放函数
// 参数: SndIndex-播放语音资源索引号
// DAC_Channel-播放声道选择
// 返回值: 无
//=============================================================
void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
{
BSR_StopRecognizer(); //停止识别器
SACM_S480_Initial(1); //初始化为自动播放
SACM_S480_Play(SndIndex, DAC_Channel, 3); //开始播放一段语音
while((SACM_S480_Status()&0x0001)!= 0) //是否播放完毕?
{
SACM_S480_ServiceLoop(); //解码并填充队列
*P_Watchdog_Clear=0x0001; //清看门狗
}
SACM_S480_Stop(); //停止播放
BSR_InitRecognizer(BSR_MIC); //初始化识别器
}
//=============================================================
// 语法格式: int TrainWord(int WordID,int SndID);
// 实现功能: 训练一条指令
// 参数: WordID-指令编码
// SndID-指令提示音索引号
// 返回值: 无
//=============================================================
int TrainWord(unsigned int WordID,unsigned int SndID)
{
int Result;
PlaySnd(SndID,3); //引导训练,播放指令对应动作
while(1)
{
Result = BSR_Train(WordID,BSR_TRAIN_TWICE); //训练两次,获得训练结果
if(Result==0)break;
switch(Result)
{
case -1: //没有检测出声音
PlaySnd(S_NOVOICE,3);
return -1;
case -2: //需要训练第二次
PlaySnd(S_AGAIN,3);
break;
case -3: //环境太吵
PlaySnd(S_NOISY,3);
return -3;
case -4: //数据库满
return -4;
case -5: //检测出声音不同
PlaySnd(S_CMDDIFF,3);
return -5;
case -6: //序号错误
return -6;
default:
break;
}
}
return 0;
}
//=============================================================
// 语法格式: void TrainSD();
// 实现功能: 训练函数
// 参数: 无
// 返回值: 无
//=============================================================
void TrainSD()
{
while(TrainWord(RED_ON,S_ACT0) != 0); //训练第1个动作 前进
while(TrainWord(BLUE_ON,S_ACT1) != 0); //训练第2个动作 后退
while(TrainWord(RED_OFF,S_ACT2) != 0); //训练第3个动作 左
while(TrainWord(BLUE_OFF,S_ACT3) != 0); //训练第4个动作 右
while(TrainWord(ALL_OFF,S_ACT4) != 0); //训练第5个动作 停
}
//=============================================================
// 语法格式: void StoreSD();
// 实现功能: 存储语音模型函数
// 参数: 无
// 返回值: 无
//=============================================================
void StoreSD()
{ unsigned int ulAddr,i,commandID,g_Ret;
F_FlashWrite1Word(0xef00,0xaaaa);
F_FlashErase(0xe000);
F_FlashErase(0xe100);
F_FlashErase(0xe200);
ulAddr=0xe000;//********
for(commandID=0x100;commandID<0x105;commandID++) //五条commandID<0x105
{
g_Ret=BSR_ExportSDWord(commandID);
while(g_Ret!=0) //模型导出成功?
g_Ret=BSR_ExportSDWord(commandID);
for(i=0;i<100;i++) //保存语音模型SD1(0xe000---0xe063)
{
F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
ulAddr+=1;
}
}
}
//=============================================================
// 语法格式: void StoreSD();
// 实现功能: 装载语音模型函数
// 参数: 无
// 返回值: 无
//=============================================================
void LoadSD()
{ unsigned int *p,k,jk,Ret,g_Ret;
p=(int *)0xe000;
for(jk=0;jk<5;jk++)//原jk<5/////////////////////////////////////////////////////////////////////////////////////
{
for(k=0;k<100;k++)
{
Ret=*p;
BSR_SDModel[k]=Ret; //装载语音模型
p+=1;
}
g_Ret=BSR_ImportSDWord();
while(g_Ret!=0) //模型装载成功?
g_Ret=BSR_ImportSDWord();
}
}
/*
//=============================================================
// 语法格式: void paydistance(data);
// 实现功能: 播放串口数据
// 参数: 无
// 返回值: 无
//=============================================================
void playdistance(unsigned int udata){
unsigned int decade;
unsigned int theunit;
unsigned int hundreds;
if(udata > 100){
hundreds = udata/100;
udata = udata - hundreds*100;
}
decade = udata/10;
theunit = udata%10;
if(decade >0 && decade < 10){ //没有十位时不读
PlaySnd(decade+15,3);//
PlaySnd(TEN,3);//10
}else if(theunit > 0&& theunit <10){ //没有个位时不读
PlaySnd(theunit+15,3);//
// data = 0;//清除接收缓存
}
}
*/
//=============================================================
// 语法格式: void BSR(void);
// 实现功能: 辨识子函数
// 参数: 无
// 返回值: 无
//=============================================================
void BSR(void)
{
int Result; //辨识结果寄存
Result = BSR_GetResult(); //获得识别结果
if(Result>0) //有语音触发?
{
*P_Watchdog_Clear = 0x1;
switch(Result)
{
case RED_ON:
if(SPEED == 0){
UartSendByte('W');
SPEED++;STOP = 0;
PlaySnd(S_ACT0,3);//播放前进
}else if(SPEED == 1){
UartSendByte('1');
SPEED++;STOP = 0;
PlaySnd(JIASU,3); //播放加速前进
}else if(SPEED == 2){
UartSendByte('2');
SPEED = 2;STOP = 0; //预留档位
PlaySnd(QUANSU,3);//播放全速前进
}
break;
case BLUE_ON:
UartSendByte('X');
PlaySnd(S_ACT1,3); //后退
PlaySnd(S_QZY,3); //请注意
SPEED = 0;STOP = 0; //转弯后减到一档 清除STOP次数
break;
case RED_OFF:
UartSendByte('A');
PlaySnd(S_ACT2,3); //左转
// PlaySnd(S_QZY,3); //请注意
SPEED = 0;STOP = 0; //转弯后减到一档 清除STOP次数
break;
case BLUE_OFF:
UartSendByte('D');
PlaySnd(S_ACT3,3); //右转
// PlaySnd(S_QZY,3); //请注意
SPEED = 0;STOP = 0; //转弯后减到一档 清除STOP次数
break;
case ALL_OFF:
if(STOP == 0){
UartSendByte('S');
STOP = 1;
PlaySnd(S_ACT4,3); //停止
SPEED = 0; //转弯后减到一档
}else if(STOP == 1){
STOP = 1; //允许重复读取
UartSendByte('#'); //发送超声波数据请求
Delay(600); //等待数据接收完
while(RXdata != 0){
switch(RXdata){
case 'a':
PlaySnd(DQJL,3);//当前距离
PlaySnd(ONE,3);//1
PlaySnd(TEN,3);//10
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'b':
PlaySnd(DQJL,3);//当前距离
PlaySnd(ONE,3);//1
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'c':
PlaySnd(DQJL,3);//当前距离
PlaySnd(TWO,3);//2
PlaySnd(TEN,3);//10
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'd':
PlaySnd(DQJL,3);//当前距离
PlaySnd(TWO,3);//2
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'e':
PlaySnd(DQJL,3);//当前距离
PlaySnd(THREE,3);//3
PlaySnd(TEN,3);//10
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'f':
PlaySnd(DQJL,3);//当前距离
PlaySnd(THREE,3);//3
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'g':
PlaySnd(DQJL,3);//当前距离
PlaySnd(FOUR,3);//4
PlaySnd(TEN,3);//10
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
case 'h':
PlaySnd(DQJL,3);//当前距离
PlaySnd(FOUR,3);//4
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'i':
PlaySnd(DQJL,3);//当前距离
PlaySnd(FIVE,3);//5
PlaySnd(TEN,3);//10
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'j':
PlaySnd(DQJL,3);//当前距离
PlaySnd(FIVE,3);//5
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'k':
PlaySnd(DQJL,3);//当前距离
PlaySnd(SIX,3);//6
PlaySnd(TEN,3);//10
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'l':
PlaySnd(DQJL,3);//当前距离
PlaySnd(SIX,3);//6
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'm':
PlaySnd(DQJL,3);//当前距离
PlaySnd(SEVEN,3);//7
PlaySnd(TEN,3);//10
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'n':
PlaySnd(DQJL,3);//当前距离
PlaySnd(SEVEN,3);//7
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'o':
PlaySnd(DQJL,3);//当前距离
PlaySnd(EIGHT,3);//8
PlaySnd(TEN,3);//10
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'p':
PlaySnd(DQJL,3);//当前距离
PlaySnd(EIGHT,3);//8
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'q':
PlaySnd(DQJL,3);//当前距离
PlaySnd(NINE,3);//9
PlaySnd(TEN,3);//10
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
case 'r':
PlaySnd(DQJL,3);//当前距离
PlaySnd(NINE,3);//9
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
STOP = 1; //允许重复读取
break;
/* case 's':
PlaySnd(DQJL,3);//当前距离
PlaySnd(FOUR,3);//4
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
break;
case 't':
PlaySnd(DQJL,3);//当前距离
PlaySnd(FOUR,3);//4
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
break;
case 'u':
PlaySnd(DQJL,3);//当前距离
PlaySnd(FOUR,3);//4
PlaySnd(TEN,3);//10
PlaySnd(FIVE,3);//5
PlaySnd(CM,3);//厘米
RXdata = 0;
break;
*/
case '~':
PlaySnd(DQJL,3);//当前距离
PlaySnd(NINE,3);//9
PlaySnd(NINE,3);//9
PlaySnd(NINE,3);//9
PlaySnd(CM,3);//厘米
RXdata = 0;
break;
default:
RXdata = 0;
break;
}
}
}
break;
default:
break;
}
}
}
//=============================================================
// 语法格式: int main(void);
// 实现功能: 主函数
// 参数: 无
// 返回值: 无
//=============================================================
int main(void)
{
unsigned int BS_Flag; //Train标志位 空
BSR_DeleteSDGroup(0); //初始化存储器RAM
BS_Flag=*(unsigned int *)0xe000; //读存储单元0xe000
if(BS_Flag==0xffff) //没有经过训练(0xe000内容为0xffff)
{
TrainSD(); //训练
StoreSD(); //存储训练结果(语音模型)
}
else //经过训练(0xe000内容为0x0055)
{
LoadSD(); //语音模型载入识别器
}
PlaySnd(S_START,3); //开始识别提示
BSR_InitRecognizer(BSR_MIC); //初始化识别器
UART_Init(); //UART初始化
__asm("IRQ ON"); //开中断
while(1)
{
BSR();// 语音识别
*P_Watchdog_Clear=0x0001;
// __asm("IRQ OFF"); //跳出关中断
if((*P_IOA_Data)&0x0004) //按键4从新训练
{
F_FlashErase(0xe000);
while(1);
}
if((*P_IOA_Data)&0x0002){ //紧急停止按键2
UartSendByte('S');
// playdistance(RxData[0]-30);
// UartSendByte(RxData[0]);//RXdata -48
// playdistance(RxData[1]-30);
// UartSendByte(RxData[1]);//RXdata -48
// UartSendByte(RxData[2]);//RXdata -48
}
if((*P_IOA_Data)&0x0001) //按键1播放所有声音
{
PlaySnd(S_ACT0,3);//测试声音
PlaySnd(S_ACT1,3);//测试声音
PlaySnd(S_ACT2,3);//测试声音
PlaySnd(S_ACT3,3);//测试声音
PlaySnd(S_ACT4,3);//测试声音
PlaySnd(S_RDY,3);//测试声音
PlaySnd(S_AGAIN,3);//测试声音
PlaySnd(S_NOISY,3);//测试声音
PlaySnd(S_START,3);//测试声音
PlaySnd(S_QZY,3);//测试声音
PlaySnd(JIASU,3);//测试声音
PlaySnd(QUANSU,3);//测试声音
PlaySnd(DQJL,3);//当前距离
PlaySnd(CM,3);//厘米
PlaySnd(POINT,3);//点
PlaySnd(ONE,3);//1
PlaySnd(TWO,3);//2
PlaySnd(THREE,3);//3
PlaySnd(FOUR,3);//4
PlaySnd(FIVE,3);//5
PlaySnd(SIX,3);//6
PlaySnd(SEVEN,3);//7
PlaySnd(EIGHT,3);//8
PlaySnd(NINE,3);//9
PlaySnd(TEN,3);//10
}
}
}
4WD 平台端程序
将下列程序上传到 Carduino 控制器中
- 点击此处 Arduino 入门教程查看程序上传方法
- * 示例程序下载
将下载到的压缩文件解压到到 Arduino IDE 软件的 libraries 文件中(·····\arduino-1.7.6\libraries),启动 Arduino IDE 选择文件 -- 示例 -- RB-13K049_AS-4WD_yu_yin-master -- 打开 example 中的相应例子程序,上传到 Arduino UNO 控制器中,就可以实现代码测试。操作方法下图所示:
解压过程
int srfPin = 15; //定义srfPin 发送引脚为15
int z; //定义全局变量z
int Distance; //定义距离寄存器存放测试距离数据
int duration; //定义脉宽寄存器
int data; //定义串口接收寄存器
#define EA 5
#define I2 6
#define I1 7
#define EB 11
#define I4 10
#define I3 9
int ultrasonic(int distance)
{
digitalWrite(srfPin, LOW); //确保在发送脉冲前保持该引脚为低电平
delayMicroseconds(2); //保持低电平2ms
digitalWrite(srfPin, HIGH); //发送一个高脉冲开始测距
delayMicroseconds(10); //保持10ms
digitalWrite(srfPin, LOW); //在等待脉冲返回来之前发送低电平
pinMode(srfPin, INPUT); //调整超声波引脚为输入
duration = pulseIn(srfPin, HIGH); //从SRF05 回波脉冲在读取在微秒
distance = duration/58; //除以58 就是我们要得到的厘米数
return distance; //返回厘米数
}
void BACK() //后退
{
analogWrite(EA,130);//输入模拟值进行设定速度
analogWrite(EB,130);
digitalWrite(I2,HIGH);//使直流电机运转
digitalWrite(I1,LOW);
digitalWrite(I3,HIGH);//使直流电机运转
digitalWrite(I4,LOW);
}
void GO() //前进
{
analogWrite(EA,100);//输入模拟值进行设定速度
analogWrite(EB,100);
digitalWrite(I2,LOW);//使直流电机运转
digitalWrite(I1,HIGH);
digitalWrite(I3,LOW);//使直流电机运转
digitalWrite(I4,HIGH);
}
void QUICKEN() //加速前进
{
analogWrite(EA,140); //输入模拟值进行设定速度
analogWrite(EB,140);
digitalWrite(I2,LOW);//使直流电机运转
digitalWrite(I1,HIGH);
digitalWrite(I3,LOW);//使直流电机运转
digitalWrite(I4,HIGH);
}
void FULLSPEED() //全速前进
{
analogWrite(EA,165); //输入模拟值进行设定速度
analogWrite(EB,165);
digitalWrite(I2,LOW);//使直流电机运转
digitalWrite(I1,HIGH);
digitalWrite(I3,LOW);//使直流电机运转
digitalWrite(I4,HIGH);
}
void LEFT() //左转
{
analogWrite(EA,130);//输入模拟值进行设定速度
analogWrite(EB,130);
digitalWrite(I2,LOW);//使直流电机运转
digitalWrite(I1,HIGH);
digitalWrite(I3,HIGH);//使直流电机运转
digitalWrite(I4,LOW);
}
void RIGHT() //右转
{
analogWrite(EA,130);//输入模拟值进行设定速度
analogWrite(EB,130);
digitalWrite(I2,HIGH);//使直流电机运转
digitalWrite(I1,LOW);
digitalWrite(I3,LOW);//使直流电机运转
digitalWrite(I4,HIGH);
}
void STOP() //停止
{
digitalWrite(I2,HIGH);//使直流电机停转
digitalWrite(I1,HIGH);
digitalWrite(I3,HIGH);//使直流电机停转
digitalWrite(I4,HIGH);
}
void PLAYDISTANCE() //发送超声波数据
{
Distance = ultrasonic(z);
if(Distance > 0 && Distance <= 10){ //判断测试距离为1 至10CM
Serial.print('a');} //发送字符'a'
else if(Distance > 10 && Distance <= 15){ //判断测试距离为11 至15CM
Serial.print('b');} //发送字符'b'
else if(Distance > 15 && Distance <= 20){
Serial.print('c');}
else if(Distance > 20 && Distance <= 25){
Serial.print('d');}
else if(Distance > 25 && Distance <= 30){
Serial.print('e');}
else if(Distance > 30 && Distance <= 35){
Serial.print('f');}
else if(Distance > 35 && Distance <= 40){
Serial.print('g');}
else if(Distance > 40 && Distance <= 45){
Serial.print('h');}
else if(Distance > 45 && Distance <= 50){
Serial.print('i');}
else if(Distance > 50 && Distance <= 55){
Serial.print('j');}
else if(Distance > 55 && Distance <= 60){
Serial.print('k');}
else if(Distance > 60 && Distance <= 65){
Serial.print('l');}
else if(Distance > 65 && Distance <= 70){
Serial.print('m');}
else if(Distance > 70 && Distance <= 75){
Serial.print('n');}
else if(Distance > 75 && Distance <= 80){
Serial.print('o');}
else if(Distance > 80 && Distance <= 85){
Serial.print('p');}
else if(Distance > 85 && Distance <= 90){
Serial.print('q');}
else if(Distance > 90 && Distance <= 95){
Serial.print('r');}
else{
Serial.print('~');}
}
void setup()
{
Serial.begin(115200); //打开串口并设置通信波特率为115200
pinMode(9,OUTPUT); //定义I3 接口
pinMode(10,OUTPUT); //定义I4 接口
pinMode(11,OUTPUT); //定义EB(PWM 调速)接口
pinMode(5,OUTPUT); //定义EA(PWM 调速)接口
pinMode(6,OUTPUT); //定义I2接口
pinMode(7,OUTPUT); //定义I1接口
}
void loop() //主程序开始
{
Distance = ultrasonic(z); //读取超声波值
data = Serial.read(); //读取串口数据
switch (data){
case 'W': //前进命令
GO(); //前进函数
Serial.flush(); //刷新串口缓冲区数据
break;
case 'X': //后退命令
BACK(); //后退函数
Serial.flush(); //刷新串口缓冲区数据
break;
case 'A': //左转命令
LEFT(); //左转函数
Serial.flush(); //刷新串口缓冲区数据
break;
case 'D': //右转命令
RIGHT(); //右转函数
Serial.flush(); //刷新串口缓冲区数据
break;
case 'S': //停止命令
STOP(); //停止函数
Serial.flush(); //刷新串口缓冲区数据
break;
case '1': //加速前进命令
QUICKEN(); //加速前进函数
Serial.flush(); //刷新串口缓冲区数据
case '2': //全速前进命令
FULLSPEED(); //全速前进函数
Serial.flush(); //刷新串口缓冲区数据
break;
case '#': //测试当前距离命令
PLAYDISTANCE(); //发送当前距离函数
Serial.flush(); //刷新串口缓冲区数据
break;
default:
break;
}
}
程序效果概述
- 发出语音命令“前进” - 凌阳板播报“前进”,小车向前行进
- 第二次发出语音命令“前进” - 凌阳板播报“加速前进”,小车向前行进
- 第三次发出语音命令“前进” - 凌阳板播报“全速前进”,小车向前行进
- 发出语音命令“后退” - 凌阳板播报“后退,请注意”,小车向后行进
- 发出语音命令“左转” - 凌阳板播报“左转”,小车向左转弯
- 发出语音命令“右转” - 凌阳板播报“右转”,小车向右转弯
- 发出语音命令“停止” - 凌阳板播报“停止”,小车停止
- 发出语音命令“停止 、 停止” - 凌阳板播报“停止,当前距离 XX 厘米”,小车停止
注意:
1、尽量是录音的人对小车进行操作,不然错误率会提高
2、语音命令发出时,尽量保证吐字的清晰度,不然也会造成错误识别,小车不能按照语音进行运动
3、由于小车在向前行进过程中,不能自动避障,所以请您注意操作距离,距离过长会造成蓝牙断开
产品相关推荐
产品资料
下载链接:https://pan.baidu.com/s/189SAlN4wH-9cDhcUsnPKEw 提取码:ag69
产品购买地址
周边产品推荐
Arduino 4WD铝合金移动平台车灯套件
Arduino 光电码盘 光电测速传感器
Arduino 双H桥直流电机驱动板
相关问题解答
AS-4WD 碰撞机器人如何安装
4wd 红外线巡线壁障车调试助手没有反应
相关学习资料
视频:机器人调试助手无线操控AS-4WD轮式机器人
视频:Arduino-4WD移动机器人寻线功能演示
视频:Arduino-4WD移动机器人碰撞功能演示
视频:Arduino-4WD移动机器人追光功能演示
视频:Arduino-4WD移动机器人寻线与避障功能演示
视频:Arduino-4WD移动机器人侦测避障功能演示
视频:直流减速电机驱动实例
奥松机器人技术论坛
























































