板子上面所有可以使用的IO口都用排针引了出来,这样可以方便用户测试与使用MCU的一些功能,板子上面集成了麦克风与一个LED外设。留了喇叭接口,可以直接驱动1W的喇叭。单单做语音识别,不需要播放语音的案例可以不需要这个喇叭接口。板子上面还留了接触摸板的接口,如果功能需要,可以增加触摸的功能。总的来说,对于做小家电方面的应用,功能是够丰富的了。
晾衣架要实现的功能介绍
实现照明功能,利用ISD9160的一个IO口进行控制照明的开与关,要做得炫酷点的话,可以使用一个PWM输出IO,来进行调光控制。实现不同灯光不同的流明。因为条件有限,本实验只是利用了板载的LED来进行演示灯光的开与关。
实现晾衣架的自动升降功能,利用两个IO通过控制IO电平的互相切换,从而实现晾衣架的升降与停止。本次试验利用继电器的开启与关闭来表示。
ISD9460的板子使用很简单,语音识别的底层部分官方已经以库的形式提供,使用方法也已经提供,用户只需要在应用处理函数App_Process()里面填写自己要实现的功能即可实现语音识别的应用。下面来给大家介绍一下软件部分的使用:
软件介绍
1. 首先进行时钟的初始化,需要修改时钟频率的可以在这个函数里面进行修改
此函数的内部实现使用了宏定义引用了另外一个函数如下:
- UINT32 SysClk_InitiateRC(UINT32 u32SystemClk)
- {
- UINT32 u32SysClkDiv;
- /* 使能外部时钟*/ CLK_EnableXtalRC(CLK_PWRCTL_LXTEN_Msk|CLK_PWRCTL_HIRCEN_ Msk|CLK_PWRCTL_LIRCEN_Msk);
- /* 切换HCLK时钟源*/
- if( u32SystemClk == (32*1000000UL) )
- {
- CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKSEL0_HIRCFSEL_32M, CLK_CLKDIV0_HCLK(1));
- return 32768000UL;
- }
- /* 配置HCLK的时钟来自内部的RC*/
- if ( (u32SysClkDiv = _48MHZ_/u32SystemClk) == 0 ) u32SysClkDiv = 1;
- else if (u32SysClkDiv > 0x10) u32SysClkDiv = 0x10;
- CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKSEL0_HIRCFSEL_48M, CLK_CLKDIV0_HCLK(u32SysClkDiv));
- u32SystemClk = _48MHZ_/u32SysClkDiv;
- return u32SystemCl
复制代码
2. 使能内部LDO,使得外部flash接口的电平为3.3V
- CLK_EnableLDO(CLK_LDOSEL_3_3V);
复制代码
3. 外设初始化,包括GPIO,串口,按键接口之类的初始化。用户可以根据自己的需求增加或者删除自己需要的初始化功能就可以了,注解写得比较详细 !
- OUTPUTPIN_INITIATE();
- ULTRAIO_INITIATE();
- KEYPAD_INITIATE();
- UART_Init();
复制代码
4. 语音识别,播放的外设初始化 。这里用户可以根据自己的需求,如果不需要语音播放的话,可以不用初始化扬声器的驱动,可以把SPK_INITIATE()函数屏蔽掉,节约的空间
- PDMA_INITIATE();
- SPK_INITIATE();
- MIC_INITIATE();
复制代码
1. 应用相关初始化 ,这里面主要是初始化一些参数,如果用户有需要初始化的参数都可以在这里进行添加处理。
接下来就下看我们main函数的重点了:
主循环函数很简单,就是一个App_Process(),此函数进行语音识别处理与执行相对应的语音命令。用户在此函数里面可以根据不同的命令ID,来执行自己需要执行的内容。此次试验,只是使用了其中的4个ID,实现两个不同的功能的开与关。大家可以根据自己的需求,需要用到多少命令词条,根据此来判断命令ID。命令词条暂时是不能修改的,要修改只能找大联大官方来处理了。不过对于功能验证来说,是不受影响的。用户只需要验证指令的识别率就好了。
使用总结:
在智能家居的离线识别小分支中,使用ISD9160的语音方案,简单,容易上手。本次应用只是小试牛刀了一下,真正离产品级别的应用还有一段不少的距离,比如降噪,识别距离怎么延长,如何在一定分贝噪声的环境下,能够清新的识别,不误触发。通过本次的使用也学了不少知识,比如喇叭刚开始不够响,原来是没有腔体的缘故,用手握住也能当一个临时腔体,可以增大喇叭的发声。
使用建议:板子的功能不够丰富,可以适当增加多一点功能,方便客户使用;希望板子板载调试器,对于没用用过此IC的开发人员提供便利
下面是在本实验中使用到的命令代码,大家会发现操作起来是非常的简单。复杂的算法之类的,官方已经做好了。说明已经在代码段里面进行了很详细的注解,这里就不解析了。
- void App_Process(void)
- {
- INT16 *pi16BuffAddr;
- INT32 i32ID = 0;
- UINT16 u16GetSamples = 0;
- // static BOOL VR_flag = FALSE;
-
- // 播放相对应的命令
- if( g_u8AppCtrl&APPCTRL_PLAY )
- {
- if (MD4App_DecodeProcess(&g_sApp.Mic_MD4.asMD4App) == FALSE )
- {
- // 停止语音播放
- App_StopPlay();
- //开始麦克风语音采集
- MicGetApp_StartRec(&g_sApp.Mic_MD4.sMicGetApp, VRONECMDAPP_SAMPLE_RATE);
- }
- }
- else
- {
- u16GetSamples = MicGetApp_ProcessRec(&g_sApp.Mic_MD4.sMicGetApp, (UINT32 **)&pi16BuffAddr);
- //VR application needs 7.2~7.8ms computing in 10ms (160 samples) interval,
- //Other application must work completely at 2.2~2.8ms if cooperation with VR.
- if ((i32ID = VROneCmdApp_GetCMDID(&g_sApp.sVRapp, pi16BuffAddr, u16GetSamples)) > 0)
- {
- // 停止麦克风采集,在进行语音回应的时候
- MicGetApp_StopRec(&g_sApp.Mic_MD4.sMicGetApp);
- App_StartPlay(i32ID-1);
- // 根据不同的命令,执行不同的IO动作,进行灯光,空调的控制。
- if(i32ID == 0x03)
- {
- OUT1(0);
- }
- else if(i32ID == 0x04)
- {
- OUT1(1);
- }
- else if(i32ID == 0x09)
- {
- OUT3(1);
- }
- else if(i32ID == 0x0A)
- {
- OUT3(0);
- }
- else;
- }
- }
- }
复制代码
在智能家居的离线识别小分支中,使用ISD9160的语音方案,简单,容易上手。ISD9160语音识别是集成在MCU中的,避免了利用MCU+语音芯片方案的复杂性,同时也节省了BOM成本。本次应用只是小试牛刀了一下,真正离产品级别的应用还有一段不少的距离,比如降噪,识别距离怎么延长,如何在一定分贝噪声的环境下,能够清新的识别,不误触发。通过本次的使用也学了不少知识,比如喇叭刚开始不够响,原来是没有腔体的缘故,用手握住也能当一个临时腔体,可以增大喇叭的发声。
使用建议:板子的功能不够丰富,可以适当增加多一点功能,方便客户使用;希望板子板载调试器,对于没用用过此IC的开发人员提供便利
本次应用的视频还有代码在附件,大家可以下载试用。