查看SKU:RB-13K049 AS-4WD语音识别操控移动机器人的源代码
←
SKU:RB-13K049 AS-4WD语音识别操控移动机器人
跳转至:
导航
、
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
[[文件:RB13K04901.png|600px|缩略图|右]] ==产品概述== AS - 4WD 语音识别移动机器人语音识别采用凌阳单片机控制器,它可以学习记录你的声音,并且跟你实现人机对话,通过识别和理解过程把语音信号转变为相应的命令,经过无线蓝牙模块传输给机器人,从而可以完成前进、后退、左转、右转、测距播报等功能,实现人机互动。 ==技术参数== ===平台参数=== * 平台长度:206mm * 平台宽度:200mm * 平台高度:65mm * 平台重量:620g ===平台尺寸图=== [[文件:RB13K00610.png|700px|缩略图|居中]] ===直流减速电机(1:48)=== * 驱动电机齿轮箱减速比:1:48 * 额定转速(6V):275±10 rpm * 额定转速(7.4V):345±10 rpm * 额定电流(6V):180±10 mA * 额定电流(7.4V):200±10 mA * 最大扭矩(6V):0.095 Nm * 最大扭矩(7.4V):0.11 Nm * 尺寸大小:70.50 mm×27.00 mm×23.00 mm(长×宽×高) * 重量大小:约30g ===语音操控小车参数=== # 尺寸:215 * 200 * 120 mm # 重量:1.5kg # 机器人类型:移动机器人 # 工作电压:7 - 12V # 主控器:Carduino UNO R3 # 操控方式:语音操控 # 操控距离:5 m - 8 m ==配件清单== * 4WD 铝合金移动平台 * 1套 [[文件:RB13K00601.jpg|400px|缩略图|居中]] * 4WD 语音识别操控移动机器人附件 [[文件:RB13K04900.png|600px|缩略图|居中]] ==安装步骤 - 4WD铝合金平台部分== ===4wd 铝合金平台内部元件详解(<small><small>图片标号对应清单序号</small></small>)=== [[文件:13K00820.png|800px|缩略图|居中]] ===步骤1:焊接部分=== ====电机连接线焊接==== 1、准备如下图所示的材料<br/> *4 * 直流减速电机; *4 * 红色导线(长度为 15cm); *4 * 黑色导线(长度为 15cm); *4 * 扎带<br/> [[文件:13K00821.png|490px|缩略图|居中]] 2、如下图所示,将红黑导线焊接到电机上,并将两个电机连接到一起<br/> [[文件:13K00822.png|700px|缩略图|居中]] 3、如下图所示,分别在两组电机上焊接两条线,为了后续连接到驱动板使用,再将四个电机都捆绑上扎带后,电机部分的焊接就完成了<br/> [[文件:13K00823.png|700px|缩略图|居中]] ====开关接口线焊接==== 1、准备如下图所示的材料<br/> * 充电接口 * 拨动开关 * 连接线(红色 10cm * 1条、红色 15cm * 1条、黑色 15cm * 1条、红色 20cm * 1条、黑色 20cm * 1条)、热缩管、电池盒<br/> [[文件:13K00824.png|500px|缩略图|居中]] 2、如图所示,进行连接线的焊接<br/> [[文件:13K008251.png|500px|缩略图|居中]] 3、如图所示,连接充电接口和拨动开关<br/> [[文件:13K00826.png|600px|缩略图|居中]] 4、如图所示,使用两根较短的线连接电池盒<br/> [[文件:13K00827.png|500px|缩略图|居中]] 注意:本例中小车的供电使用的电池盒,本电池盒需要使用的是 6 节 5 号电池盒,若使用锂电池,焊接的方式是相同的。<br/> 更加详细的制作过程,可以点击:[http://www.alsrobot.cn/wiki/index.php?title=(SKU:RB-06L012)%E7%94%B5%E6%BA%90%E5%85%85%E7%94%B5%E6%8E%A5%E5%8F%A3%E8%BF%9E%E6%8E%A5%E7%BA%BF 充电接口及拨动开关制作方法]<br/> ===步骤2:侧板电机安装=== 1、准备如下图所示的材料:<br/> * 2 * 黄色直流减速电机 * 1 * 平台侧板 * 4 * M3 * 25 螺丝 * 4 * M3 六角螺母 [[文件:13K00828.png|600px|缩略图|居中]] 2、如图所示,将电机安装到侧板 实物安装图: [[文件:13K00829.png|600px|缩略图|居中]] [[文件:RB13K00607.png|500px|有框|居中]] 3、进行另一侧板电机的安装,如图所示,为两侧电机安装完成效果图 [[文件:13K00830.png|600px|缩略图|居中]] ===步骤3:侧板与底板的安装=== 1、准备如下图所示的材料:<br/> * 2 * 步骤 2 中安装好的侧板 * 1 * 平台底板 * 4 * M3 * 6螺丝 [[文件:13K00831.png|600px|缩略图|居中]] 2、按照下图进行安装 安装实物图: [[文件:13K00832.png|500px|缩略图|居中]] [[文件:RB13K00602.png|500px|有框|居中]] ===步骤4:电机驱动板的安装=== 1、准备如下图所示的材料:<br/> * 步骤 3 中安装好的零件 * 1 * 电机驱动板 * 4 * M3 * 6螺丝 * 4 * M3 螺母 * 4 * M3 * 10 尼龙柱<br/> [[文件:13K00833.png|700px|缩略图|居中]] 2、将尼龙柱固定到小车的底板上,位置如下图所示: [[文件:13K00834.png|700px|缩略图|居中]] 3、安装双H桥驱动板,如图所示: [[文件:13K00835.png|700px|缩略图|居中]] ===步骤5:电机接线=== 1、如图所示,将两侧电机的红线连接到电机驱动板的 A 接口,黑线连接到电机驱动板的 B 接口 [[文件:13K00836.png|700px|缩略图|居中]] 2、安装完成效果如下图所示 [[文件:13K00837.png|500px|缩略图|居中]] ===步骤6:上板充电接口拨动开关安装=== 1、准备如下图所示的材料:<br/> * 步骤 1 中做好的充电接口拨动开关连接线 * 平台上板 [[文件:13K00838.png|700px|缩略图|居中]] 2、安装完成效果如图所示 [[文件:13K00839.png|700px|缩略图|居中]] [[文件:RB13K00603.png|500px|有框|居中]] ===步骤7:控制器的安装=== 1、准备如下图所示的材料<br/> * 步骤 6 中安装好的零件 * Carduino UNO 控制器 * 传感器扩展板 V5.0 * 3 * 尼龙柱 M3 * 10 * 3 * M3 螺母 * 3 * M3 * 6 螺丝 [[文件:13K00840.png|700px|缩略图|居中]] 2、在小车上支撑板安装控制器的固定尼龙柱,位置如下图所示: [[文件:13K00841.png|700px|缩略图|居中]] 3、如图所示,安装 Carduino UNO 控制器 [[文件:13K00842.png|700px|缩略图|居中]] 4、如图所示,插入扩展板 [[文件:13K00843.png|700px|缩略图|居中]] 扩展板插入效果图: [[文件:13K00844.png|700px|缩略图|居中]] ===步骤8:电控部分接线=== 1、准备如下图所示的材料<br/> * 2 * 3P 传感器连接线 * 供电线,红色黑色各一条 * 20cm * 平台车体 * 平台上板 [[文件:13K00845.png|700px|缩略图|居中]] 2、如图所示为双H桥驱动板和 Carduino UNO 控制器的接线顺序<br/> (1) 双H桥驱动板端接线顺序<br/> * 黄色 EA、红色 I2、黑色 I1 * 黄色 EB、红色 I4、黑色 I1 [[文件:13K00846.png|700px|缩略图|居中]] (2)传感器扩展板端接线顺序<br/> * EA - D5、I2 - D6、I1 - D7 * EB - D11、I4 - D10、I3 - D9 [[文件:13K05631.png|700px|缩略图|居中]] (3)完成效果如下图所示,为了布线看起来更加整齐,我们将 3P 线从小车上板的孔穿出 [[文件:13K00848.png|700px|缩略图|居中]] 3、供电部分连接<br/> (1)如图所示为双H桥驱动板部分供电线连接,充电接口红色导线接到 VMS,黑色导线接到 GND;将双 H 桥驱动板输出的 5v 电源连接到 V5.0 扩展板的红色端子,<big>连接时注意正负极不要接错</big>; [[文件:13K00849.png|700px|缩略图|居中]] (2)如图所示为传感器扩展板 V5.0 供电线连接 [[文件:13K00850.png|700px|缩略图|居中]] ===步骤9:舵机安装=== 1、准备如下图所示的材料:<br/> * 1 * 35PG 舵机 * 1 * 小车车体 * 1 * M4 * 8 螺丝套装 [[文件:13K05650.png|700px|缩略图|居中]] 2、按照下图进行安装 安装实物图: [[文件:13K05651.png|700px|缩略图|居中]] ===步骤10:超声波传感器支架安装=== 1、准备如下图所示的材料:<br/> * 1 * 超声波传感器支架 * 1 * 圆形舵盘 * 1 * 黑色自攻钉(大) * 4 * 黑色自攻钉(小) [[文件:13K05652.png|700px|缩略图|居中]] 2、按照下图给超声波传感器支架分别安装橡胶套圈、圆形舵盘 安装实物图: [[文件:13K05653.png|400px|缩略图|左]] [[文件:13K05654.png|400px|缩略图|居中]] <br/><br/> 3、如图所示,将超声波支架连接到舵机轴,'''注意在连接舵机和超声波支架的时候,尽量不要转动舵机,使舵机仍然保持在中间位置上''' [[文件:13K05655.png|700px|缩略图|居中]] ===步骤11:超声波传感器安装=== 1、准备如下图所示的材料:<br/> * 1 * 安装好的车体 * 1 * 超声波传感器 * 2 * M3 * 10 尼龙柱 * 2 * M3 螺母 * 2 * M3 * 6 螺丝 [[文件:13K05656.png|700px|缩略图|居中]] 2、如下图所示,首先将超声波传感器调节到模式 1 [[文件:13K05657.png|700px|缩略图|居中]] 3、在下图所示位置安装尼龙柱用来固定超声波传感器,并将 4P 线从超声波支架较小的孔中穿出 [[文件:13K05658.png|700px|缩略图|居中]] 4、如图所示,安装超声波传感器,由于例程中使用的是单模式,超声波传感器只需连接 input 引脚,所以我们将 4P 线中的黄色线取掉 [[文件:13K05659.png|700px|缩略图|居中]] ===步骤12:传感器接线=== 如图所示,将超声波传感器连接到传感器扩展板 V5.0<br/> 注意:4WD 语音识别小车中的舵机,不需要连接任何接口,只是起到了固定超声波传感器的作用。<br/> [[文件:RB13K049041.png|600px|缩略图|居中]] ===步骤13:4WD 平台上板安装=== 1、准备如下图所示的材料:<br/> * 未固定上板的车体 * 4 * M3 * 6螺丝 [[文件:13K056611.png|700px|缩略图|居中]] 2、在图中圆圈位置安装 4 个 M3 * 6 螺丝来固定小车上板 [[文件:13K056622.png|700px|缩略图|居中]] ===步骤14:4WD 平台端板安装=== 1、准备如下图所示的材料:<br/> * 步骤 13 中安装好的车体 * 2 * 小车端板 * 8 * M3 * 6 螺丝 [[文件:13K056633.png|700px|缩略图|居中]] 2、如图所示,将端板与车体进行固定 [[文件:13K056644.png|700px|缩略图|居中]] ===步骤15:4WD 平台车轮安装=== 1、准备如下图所示的材料:<br/> * 步骤 14 中安装好的车体 * 4 * 车轮 [[文件:13K056655.png|650px|缩略图|居中]] 2、如图所示,将车轮与车体安装在一起 [[文件:13K056666.png|700px|缩略图|居中]] ===步骤16:插接蓝牙模块=== 1、准备如下图所示的材料:<br/> * 1 * 蓝牙模块 * 步骤 15 中安装好的小车平台整体 [[文件:RB13K049021.png|600px|缩略图|居中]] 2、将蓝牙模块插接到传感器扩展板的蓝牙接口上,如图所示 [[文件:RB13K049031.png|600px|缩略图|居中]] ==安装步骤 - 语音操控部分== 1、准备如下产品 * 凌阳开发板 * 1套 * 蓝牙模块 * 1个(模式:主) 注:如果不知道如何配置蓝牙模块主从模式,可以参考:[http://www.alsrobot.com.cn/wiki/index.php/SKU:RB-03T008_RB%E6%97%A0%E7%BA%BF%E8%93%9D%E7%89%99%E6%A8%A1%E5%9D%97 蓝牙模块说明书] * 10P 杜邦线 * 1组 2、凌阳61实验板部分接线<br/> * 如图所示,连接电池盒凌阳实验板<br/> [[文件:RB13K049100.png|600px|缩略图|居中]] 3、语音训练<br/> 按一下KEY3 键开始按照语音提示进行语音训练。<br/> [[文件:RB13K049101.png|600px|缩略图|居中]] 训练采用应答形式,每条指令训练两次,每条命令的训练方法是相同的,以第一条命令“前进”为例说明:<br/> 第一步:控制器提示“前进”<br/> 第二步:我们对着话筒说“前进”<br/> 第三步:语音控制器提示“再说一遍”<br/> 第四步:我们再次对着话筒说“前进”<br/> 到此第一条命令训练完毕。如果训练成功控制器会自动进入下一条命令的训练,如果环境很吵或前后你说的话偏差太大,控制器会提示“没有声音”或者“没有听清”这样这条命令就会从新训练。当所有的命令训练完毕,控制器会提示“准备好了”。此时命令已经存储完毕,断电后开启不用从新训练,如果在训练过程中断电,则再次上电时会从新从第一条训练。<br/> 4、按键说明<br/> 按键位置图:<br/> [[文件:RB13K049101.png|600px|缩略图|居中]] * KEY1:按下KEY1 键播放控制器内所有语音(控制器自检功能)<br/> * KEY2:紧急停止命令等同语音“停止”命令<br/> * KEY3:从新进行语音训练(当识别灵敏度降低或更换法令人时使用)<br/> 5、接线说明<br/> 按照图中说明连接凌阳61板和蓝牙模块<br/> [[文件:RB13K049102.png|600px|缩略图|居中]] 说明:控制器——无线蓝牙模块<br/> * IOB7(RXD) ——PIN5(TXD) * IOB10(TXD)——PIN4(RXD) * IOB+(5V) ———PIN1(5V) * IOB-(GND)———PIN2(GND) ==例子程序== ===凌阳板烧录程序=== <pre style='color:blue'>//======================================================== //按键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 } } } </pre> ===4WD 平台端程序=== 将下列程序上传到 Carduino 控制器中 * [http://www.alsrobot.cn/wiki/index.php/Arduino%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B#Arduino.E7.82.B9.E4.BA.AELED.E5.AE.9E.E9.AA.8C 点击此处 Arduino 入门教程]查看程序上传方法 * * [https://github.com/chenboyang77/RB-13K049_AS-4WD_yu_yin.git 示例程序下载] 将下载到的压缩文件解压到到 Arduino IDE 软件的 libraries 文件中(·····\arduino-1.7.6\libraries),启动 Arduino IDE 选择文件 -- 示例 -- RB-13K049_AS-4WD_yu_yin-master -- 打开 example 中的相应例子程序,上传到 Arduino UNO 控制器中,就可以实现代码测试。操作方法下图所示:<br/> 解压过程<br/> [[文件:05L007A10.png|500px|缩略图|居中]] [[文件:05L007A11.png|700px|缩略图|居中]] <pre style='color:blue'>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; } }</pre> ===程序效果概述== * 发出语音命令“前进” - 凌阳板播报“前进”,小车向前行进 * 第二次发出语音命令“前进” - 凌阳板播报“加速前进”,小车向前行进 * 第三次发出语音命令“前进” - 凌阳板播报“全速前进”,小车向前行进 * 发出语音命令“后退” - 凌阳板播报“后退,请注意”,小车向后行进 * 发出语音命令“左转” - 凌阳板播报“左转”,小车向左转弯 * 发出语音命令“右转” - 凌阳板播报“右转”,小车向右转弯 * 发出语音命令“停止” - 凌阳板播报“停止”,小车停止 * 发出语音命令“停止 、 停止” - 凌阳板播报“停止,当前距离 XX 厘米”,小车停止 注意: 1、尽量是录音的人对小车进行操作,不然错误率会提高<br/> 2、语音命令发出时,尽量保证吐字的清晰度,不然也会造成错误识别,小车不能按照语音进行运动<br/> 3、由于小车在向前行进过程中,不能自动避障,所以请您注意操作距离,距离过长会造成蓝牙断开<br/> ==相关推荐== ==产品相关推荐== [[文件:erweima.png|230px|无框|右]] ===产品购买地址=== [http://www.alsrobot.cn/goods-309.html Arduino 4WD 语音识别移动机器人平台]<br/> ===周边产品推荐=== [http://www.alsrobot.cn/goods-407.html Arduino 4WD铝合金移动平台车灯套件]<br/> [http://www.alsrobot.cn/goods-185.html Arduino 光电码盘 光电测速传感器]<br/> [http://www.alsrobot.cn/goods-47.html Arduino 双H桥直流电机驱动板]<br/> ===相关问题解答=== [http://www.makerspace.cn/forum.php?mod=viewthread&tid=4875&highlight=4WD AS-4WD 碰撞机器人如何安装]<br/> [http://www.makerspace.cn/forum.php?mod=viewthread&tid=5473&fromuid=10780 4wd 红外线巡线壁障车调试助手没有反应]<br/> ===相关学习资料=== [http://www.makerspace.cn/forum.php?mod=viewthread&tid=3953&fromuid=10780 视频:机器人调试助手无线操控AS-4WD轮式机器人]<br/> [http://v.youku.com/v_show/id_XMjgwMjk0NDE2.html 视频:Arduino-4WD移动机器人寻线功能演示]<br/> [http://v.youku.com/v_show/id_XMjgwMjkyNDM2.html 视频:Arduino-4WD移动机器人碰撞功能演示]<br/> [http://v.youku.com/v_show/id_XMjgwMjk4MjU2.html 视频:Arduino-4WD移动机器人追光功能演示]<br/> [http://v.youku.com/v_show/id_XMjgwNTg5NTI4.html 视频:Arduino-4WD移动机器人寻线与避障功能演示]<br/> [http://v.youku.com/v_show/id_XMzQyNzk2MzM2.html 视频:Arduino-4WD移动机器人侦测避障功能演示]<br/> [http://v.youku.com/v_show/id_XNjQ2MDY0MDg=.html?from=y1.7-2 视频:直流减速电机驱动实例]<br/> [http://www.makerspace.cn/portal.php 奥松机器人技术论坛]<br/>
返回
SKU:RB-13K049 AS-4WD语音识别操控移动机器人
。
导航菜单
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面
页面信息