拿小车超声波测距摇头的代码进行修改
需要在厂家的配置平台上进行配置,根据不同的语音,将某些引脚输出不同的电平,给单片机检测,然后将生成的SDK包下载到本地,再烧录进SU-03T模块中,后续将模块搭配小车使用
平台:http://www.smartpi.cn/#/
1.main.c:调用控制舵机的定时器0初始化函数、控制超声波的定时器2初始化函数,循环内调用语音识别函数Voice()
2.Motor.c:小车前进、后退、左转、右转和停止的函数
3.Delay.c:延时函数
4.Sg90.c:定时器0初始化函数,中断PWM,舵机摇头的角度(封装成函数)
5.HC-SR04.c:定时器2初始化函数,不开启中断,超声波测距函数
6.Avoid.c:避障模式
7.Voice.c:语音识别模块,根据语音模块的三个输出引脚的电平状态不同,调用不同的功能模块
8.Tracking.c:循迹模式,将之前的循迹代码封装整合而来
9.Follow.c:跟随模式,将之前的跟随代码封装整合
10.OLED.c:OLED相关函数,语音控制时该模块可用可不用
11.IIC.c:IIC协议,OLED使用
1.SU-03T语音识别模块控制小车程序
SU-03T提前烧录好SDK,将A25、A26、A27引脚接到单片机P1.5、P1.6、P1.7口,因为在官网平台上设置了A25、A26、A27默认上电为高电平,听到语音控制后,将引脚的输出电平改变,单片机检测到三个引脚的不同电平调用不同的模块,然后主函数main中while循环里直接调用Voice()即可
Voice.c:
sbit A25 = P1^5;
sbit A26 = P1^6;
sbit A27 = P1^7;
/**
* @brief 语音识别,根据A25,A26,A27端口状态启用不同模式
* @param 无
* @retval无
*/
void Voice()
{
//循迹模式
if(A25 == 0 && A26 == 1 && A27 == 1)
{
TrackIng();
}
//避障模式
if(A25 == 1 && A26 == 0 && A27 == 1)
{
Start_Avoid();
}
//跟随模式
if(A25 == 1 && A26 == 1 && A27 == 0)
{
Follow();
}
//停止
if(A25 == 1 && A26 == 1 && A27 == 1)
{
Stop();
}
//前进
if(A25 == 0 && A26 == 0 && A27 == 0)
{
GoForward();
}
//后退
if(A25 == 0 && A26 == 1 && A27 == 0)
{
GoBack();
}
//左转
if(A25 == 1 && A26 == 0 && A27 == 0)
{
GoLeft();
}
//右转
if(A25 == 0 && A26 == 0 && A27 == 1)
{
GoRight();
}
}
OLED屏可根据需要接电路显示,不过在OLED显示时会去遍历点阵数据,有for循环, 清屏函数也有,如果for循环调用得多,对循迹和跟随模块的实时性会造成影响,因为切换模式时想在OLED屏上显示当前模式,就要在上面的 if 判断内调用OLED的显示函数, 有可能模块的输出脚发生了电平转换,但程序还在for循环里跑,就不能及时改变状态,造成小车实时性不好
上电后,语音模块初始化,可用语音控制小车前进后退左转右转,或切换到具体的功能
但有一点小瑕疵,小车启动的时候马达声音有点大,有噪声,有时候语音模块识别不到人说话,在配置平台上有降噪功能选择,选择后重新生成SDK烧录,识别效果会好一点,但偶尔也会被噪声干扰,得靠近点,说大声点才能识别得到
至此,小车项目完结撒花。。。
小车演示:【年轻人的第一辆三轮车,争取以后能载人】 https://www.bilibili.com/video/BV1K3411M7P9?share_source=copy_web&vd_source=d6b62ea36d09d5899101585761eec921