SKU:RB-13K049 AS-4WD语音识别操控移动机器人

来自ALSROBOT WiKi
跳转至: 导航搜索
RB13K04901.png

目录

产品概述

AS - 4WD 语音识别移动机器人语音识别采用凌阳单片机控制器,它可以学习记录你的声音,并且跟你实现人机对话,通过识别和理解过程把语音信号转变为相应的命令,经过无线蓝牙模块传输给机器人,从而可以完成前进、后退、左转、右转、测距播报等功能,实现人机互动。

产品参数

  1. 产品名称:AS - 4WD 语音识别操控移动平台
  2. 产品类型:轮式移动机器人
  3. 产品货号:RB - 13K049
  4. 编程软件:Arduino IDE
  5. 基础模块:凌阳61、蓝牙模块、Carduino UNO R3、传感器扩展板 V5.0、双 H 桥电机驱动板
  6. 控制方式:语音操控
  7. 操控距离:5 m - 8 m
  8. 产品尺寸:215 * 200 * 120 mm
  9. 产品重量:1.5 kg

配件技术参数

移动平台参数

  • 平台长度:206mm
  • 平台宽度:200mm
  • 平台高度:65mm
  • 平台重量:620g

平台尺寸图

RB13K00610.png

直流减速电机(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

电控配件参数

  1. 蓝牙模块
  2. Starduino UNO R3 控制器
  3. 传感器扩展板 V5.0
  4. 双 H 桥电机驱动板
  5. 凌阳 61 开发板资料
  6. RB - 35PG 舵机资料

配件清单

  • 4WD 铝合金移动平台 * 1套
RB13K00601.jpg
  • 4WD 语音识别操控移动机器人附件
RB13K04900.png

安装步骤 - 4WD铝合金平台部分

4wd 铝合金平台内部元件详解(图片标号对应清单序号

13K00820.png

步骤1:焊接部分

电机连接线焊接

1、准备如下图所示的材料

  • 4 * 直流减速电机;
  • 4 * 红色导线(长度为 15cm);
  • 4 * 黑色导线(长度为 15cm);
  • 4 * 扎带
13K00821.png

2、如下图所示,将红黑导线焊接到电机上,并将两个电机连接到一起

13K00822.png

3、如下图所示,分别在两组电机上焊接两条线,为了后续连接到驱动板使用,再将四个电机都捆绑上扎带后,电机部分的焊接就完成了

13K00823.png

开关接口线焊接

1、准备如下图所示的材料

  • 充电接口
  • 拨动开关
  • 连接线(红色 10cm * 1条、红色 15cm * 1条、黑色 15cm * 1条、红色 20cm * 1条、黑色 20cm * 1条)、热缩管、电池盒
13K00824.png

2、如图所示,进行连接线的焊接

13K008251.png

3、如图所示,连接充电接口和拨动开关

13K00826.png

4、如图所示,使用两根较短的线连接电池盒

13K00827.png

注意:本例中小车的供电使用的电池盒,本电池盒需要使用的是 6 节 5 号电池盒,若使用锂电池,焊接的方式是相同的。
更加详细的制作过程,可以点击:充电接口及拨动开关制作方法

步骤2:侧板电机安装

1、准备如下图所示的材料:

  • 2 * 黄色直流减速电机
  • 1 * 平台侧板
  • 4 * M3 * 25 螺丝
  • 4 * M3 六角螺母
13K00828.png

2、如图所示,将电机安装到侧板 实物安装图:

13K00829.png
RB13K00607.png

3、进行另一侧板电机的安装,如图所示,为两侧电机安装完成效果图

13K00830.png

步骤3:侧板与底板的安装

1、准备如下图所示的材料:

  • 2 * 步骤 2 中安装好的侧板
  • 1 * 平台底板
  • 4 * M3 * 6螺丝
13K00831.png

2、按照下图进行安装 安装实物图:

13K00832.png
RB13K00602.png

步骤4:电机驱动板的安装

1、准备如下图所示的材料:

  • 步骤 3 中安装好的零件
  • 1 * 电机驱动板
  • 4 * M3 * 6螺丝
  • 4 * M3 螺母
  • 4 * M3 * 10 尼龙柱
13K00833.png

2、将尼龙柱固定到小车的底板上,位置如下图所示:

13K00834.png

3、安装双H桥驱动板,如图所示:

13K00835.png

步骤5:电机接线

1、如图所示,将两侧电机的红线连接到电机驱动板的 A 接口,黑线连接到电机驱动板的 B 接口

13K00836.png

2、安装完成效果如下图所示

13K00837.png

步骤6:上板充电接口拨动开关安装

1、准备如下图所示的材料:

  • 步骤 1 中做好的充电接口拨动开关连接线
  • 平台上板
13K00838.png

2、安装完成效果如图所示

13K00839.png
RB13K00603.png

步骤7:控制器的安装

1、准备如下图所示的材料

  • 步骤 6 中安装好的零件
  • Carduino UNO 控制器
  • 传感器扩展板 V5.0
  • 3 * 尼龙柱 M3 * 10
  • 3 * M3 螺母
  • 3 * M3 * 6 螺丝
13K00840.png

2、在小车上支撑板安装控制器的固定尼龙柱,位置如下图所示:

13K00841.png

3、如图所示,安装 Carduino UNO 控制器

13K00842.png

4、如图所示,插入扩展板

13K00843.png

扩展板插入效果图:

13K00844.png

步骤8:电控部分接线

1、准备如下图所示的材料

  • 2 * 3P 传感器连接线
  • 供电线,红色黑色各一条 * 20cm
  • 平台车体
  • 平台上板
13K00845.png

2、如图所示为双H桥驱动板和 Carduino UNO 控制器的接线顺序
(1) 双H桥驱动板端接线顺序

  • 黄色 EA、红色 I2、黑色 I1
  • 黄色 EB、红色 I4、黑色 I1
13K00846.png

(2)传感器扩展板端接线顺序

  • EA - D5、I2 - D6、I1 - D7
  • EB - D11、I4 - D10、I3 - D9
13K05631.png

(3)完成效果如下图所示,为了布线看起来更加整齐,我们将 3P 线从小车上板的孔穿出

13K00848.png

3、供电部分连接
(1)如图所示为双H桥驱动板部分供电线连接,充电接口红色导线接到 VMS,黑色导线接到 GND;将双 H 桥驱动板输出的 5v 电源连接到 V5.0 扩展板的红色端子,连接时注意正负极不要接错

13K00849.png

(2)如图所示为传感器扩展板 V5.0 供电线连接

13K00850.png

步骤9:舵机安装

1、准备如下图所示的材料:

  • 1 * 35PG 舵机
  • 1 * 小车车体
  • 1 * M4 * 8 螺丝套装
13K05650.png

2、按照下图进行安装 安装实物图:

13K05651.png

3、舵机接线
语音小车的舵机起到的是支撑超声波传感器作用,所以不需要连接到 Arduino 的接口上。接线悬空即可

步骤10:超声波传感器支架安装

1、准备如下图所示的材料:

  • 1 * 超声波传感器支架
  • 1 * 圆形舵盘
  • 1 * 黑色自攻钉(大)
  • 4 * 黑色自攻钉(小)
13K05652.png

2、按照下图给超声波传感器支架分别安装橡胶套圈、圆形舵盘 安装实物图:

13K05653.png
13K05654.png



3、如图所示,将超声波支架连接到舵机轴,注意在连接舵机和超声波支架的时候,尽量不要转动舵机,使舵机仍然保持在中间位置上

13K05655.png

步骤11:超声波传感器安装

1、准备如下图所示的材料:

  • 1 * 安装好的车体
  • 1 * 超声波传感器
  • 2 * M3 * 10 尼龙柱
  • 2 * M3 螺母
  • 2 * M3 * 6 螺丝
13K05656.png

2、如下图所示,首先将超声波传感器调节到模式 1

13K05657.png

3、在下图所示位置安装尼龙柱用来固定超声波传感器,并将 4P 线从超声波支架较小的孔中穿出

13K05658.png

4、如图所示,安装超声波传感器,由于例程中使用的是单模式,超声波传感器只需连接 input 引脚,所以我们将 4P 线中的黄色线取掉

13K05659.png

步骤12:传感器接线

如图所示,将超声波传感器连接到传感器扩展板 V5.0
注意:4WD 语音识别小车中的舵机,不需要连接任何接口,只是起到了固定超声波传感器的作用。

RB13K049041.png

步骤13:4WD 平台上板安装

1、准备如下图所示的材料:

  • 未固定上板的车体
  • 4 * M3 * 6螺丝
13K056611.png

2、在图中圆圈位置安装 4 个 M3 * 6 螺丝来固定小车上板

13K056622.png

步骤14:4WD 平台端板安装

1、准备如下图所示的材料:

  • 步骤 13 中安装好的车体
  • 2 * 小车端板
  • 8 * M3 * 6 螺丝
13K056633.png

2、如图所示,将端板与车体进行固定

13K056644.png

步骤15:4WD 平台车轮安装

1、准备如下图所示的材料:

  • 步骤 14 中安装好的车体
  • 4 * 车轮
13K056655.png

2、如图所示,将车轮与车体安装在一起

13K056666.png

步骤16:插接蓝牙模块

1、准备如下图所示的材料:

  • 1 * 蓝牙模块
  • 步骤 15 中安装好的小车平台整体
RB13K049021.png

2、将蓝牙模块插接到传感器扩展板的蓝牙接口上,如图所示

RB13K049031.png

安装步骤 - 语音操控部分

1、准备如下产品

  • 凌阳开发板 * 1套
  • 蓝牙模块 * 1个(模式:主)

注:如果不知道如何配置蓝牙模块主从模式,可以参考:蓝牙模块说明书

  • 10P 杜邦线 * 1组

2、凌阳61实验板部分接线

  • 如图所示,连接电池盒凌阳实验板
RB13K049100.png

3、语音训练
按一下KEY3 键开始按照语音提示进行语音训练。

RB13K049101.png

训练采用应答形式,每条指令训练两次,每条命令的训练方法是相同的,以第一条命令“前进”为例说明:
第一步:控制器提示“前进”
第二步:我们对着话筒说“前进”
第三步:语音控制器提示“再说一遍”
第四步:我们再次对着话筒说“前进”
到此第一条命令训练完毕。如果训练成功控制器会自动进入下一条命令的训练,如果环境很吵或前后你说的话偏差太大,控制器会提示“没有声音”或者“没有听清”这样这条命令就会从新训练。当所有的命令训练完毕,控制器会提示“准备好了”。此时命令已经存储完毕,断电后开启不用从新训练,如果在训练过程中断电,则再次上电时会从新从第一条训练。
4、按键说明
按键位置图:

RB13K049101.png
  • KEY1:按下KEY1 键播放控制器内所有语音(控制器自检功能)
  • KEY2:紧急停止命令等同语音“停止”命令
  • KEY3:从新进行语音训练(当识别灵敏度降低或更换法令人时使用)

5、接线说明
按照图中说明连接凌阳61板和蓝牙模块

RB13K049102.png

说明:控制器——无线蓝牙模块

  • 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 IDE 软件的 libraries 文件中(·····\arduino-1.7.6\libraries),启动 Arduino IDE 选择文件 -- 示例 -- RB-13K049_AS-4WD_yu_yin-master -- 打开 example 中的相应例子程序,上传到 Arduino UNO 控制器中,就可以实现代码测试。操作方法下图所示:
解压过程

05L007A10.png
05L007A11.png
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、由于小车在向前行进过程中,不能自动避障,所以请您注意操作距离,距离过长会造成蓝牙断开

产品相关推荐

Erweima.png

产品购买地址

Arduino 4WD 语音识别移动机器人平台

周边产品推荐

Arduino 4WD铝合金移动平台车灯套件
Arduino 光电码盘 光电测速传感器
Arduino 双H桥直流电机驱动板

相关问题解答

AS-4WD 碰撞机器人如何安装
4wd 红外线巡线壁障车调试助手没有反应

相关学习资料

视频:机器人调试助手无线操控AS-4WD轮式机器人
视频:Arduino-4WD移动机器人寻线功能演示
视频:Arduino-4WD移动机器人碰撞功能演示
视频:Arduino-4WD移动机器人追光功能演示
视频:Arduino-4WD移动机器人寻线与避障功能演示
视频:Arduino-4WD移动机器人侦测避障功能演示
视频:直流减速电机驱动实例
奥松机器人技术论坛