STM32 HAL库快速实战【八】《声音传感器的使用》--基于黑龙江科技大学机电工业机器人实训
系列目录
点击查看
- STM32 HAL库快速实战【一】《32点灯》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
- STM32 HAL库快速实战【三】《pwm控制舵机》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
- STM32 HAL库快速实战【四】《串口简单使用》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
- STM32 HAL库快速实战【五】《控制串口电机》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
- STM32 HAL库快速实战【六】《蓝牙控制》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
- STM32 HAL库快速实战【七】《机械臂控制》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
- STM32 HAL库快速实战【八】《声音传感器的使用》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
- STM32 HAL库快速实战【九】《超声波传感器的使用以及自由避障》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
- STM32 HAL库快速实战【十】《颜色传感器的使用》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
- STM32 HAL库快速实战【十一】《红外传感器的使用及巡线循迹》--基于黑龙江科技大学机电工业机器人实训 - USTHzhanglu - 博客园 (cnblogs.com)
前言
本章介绍声音传感器的简单使用,和其他系列关联性较低。前置章节需要《蓝牙控制》,至少需要《串口的简单实用》
模块介绍与使用
介绍
1.可以检测周围环境的声音强度,使用注意:此传感器只能识别声音的有无(根据震动原理)不能识别声音的大小或者特定频率的声音
2 .灵敏度可调(图中蓝色数字电位器调节)
3.工作电压3.3V-5V
4.输出形式数字开关量输出(0和1高低电平)
使用
1.声音模块对环境声音强度最敏感,一般用来检测周围环境的声音强度。
2.模块在环境声音强度达不到设定阈值时,OUT口输出高电平,当外界环境声音强度超过设定阈值时,OUT口输出低电平
3.模块数字量输出OUT可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境的声音
调节
1.将模块电源接到最小版上,电源指示灯亮。
2.找到一个相对安静的环境,此时开关指示亮。如果不亮,可以调节数位器改变阈值,直至开关指示灯亮。
3.制造出一定的声音,此时开关指示灯灭。如果不灭或者一直闪烁,以调节数位器改变阈值,直至没有声音时开关指示灯常亮,有声音时开关指示灯常灭。
调节完毕后,将OUT与SD6端口相连。
CUBEMX配置
复制上一节的工程继续配置。
可以看到SD6与PA7相连接。
配置PA7为输入模式
打上标签方便使用
编写代码
首先新建sensor.c和sensor.h用来存放传感器相关代码。注意加入工程中。
通过HAL_GPIO_ReadPin(sound_GPIO_Port,sound_Pin)
来读取OUT的值。
实际上每次使用该函数读取电平较为麻烦,我们可以直接宏定义一个值到该函数上,这样只需要判断该值即可。
在.h文件中加入#define sound_vol HAL_GPIO_ReadPin(sound_GPIO_Port,sound_Pin)
在本节中,我们需要获取声音传感器的状态并作出相关操作
在.h中声明sound_task()
函数,并在.c中定义
@sensor.h
#define sound_vol HAL_GPIO_ReadPin(sound_GPIO_Port,sound_Pin)
void sound_task(void);
@sensor.c
#include "sensor.h"
/**
* @brief :获取声音传感器的值,并执行对应操作
* @param :None
* @retval None
**/
void sound_task(void)
{}
由于声音是连续的,并且很多时间存在抖动,只判断一次容易误判,所以可以使用软件消抖处理,当两次电平都为低时才认为有声音。
void sound_task(void)
{
if(!sound_vol){
HAL_Delay(10);//消抖
if(!sound_vol)
{ //放入需要执行的代码
执行的代码可以根据需求设计,这里放一个简单的报警功能,发送消息给蓝牙
void sound_task(void)
{
if(!sound_vol){
HAL_Delay(10);//消抖
if(!sound_vol)
{ //放入需要执行的代码
usart_send_str(&huart3,(unsigned char *)"Warning,is ringing\r\n");
}
}
return;
}
注意usart_send_str
在motor.h
中声明,因此在.文件头部include下
#include "sensor.h"
#include "motor.h"
然后在在合适的地方引用sound_task()
,一般需要一直循环执行。注意到main中使用了input=get_cmd();
等待命令,在get_cmd()
中使用了while(HAL_UART_Receive_IT(&huart3, &ch, 1)!=HAL_OK)
循环等待命令。
也就是说,实际上将任务放到main中的while(1)中并不会实时执行,这里直接放到get_cmd()
中。
char get_cmd(void)
{
uint8_t ch =0;
//HAL_UART_Receive(&huart1, &ch, 1, 0xffff);//轮询阻塞方式
while(HAL_UART_Receive_IT(&huart3, &ch, 1)!=HAL_OK)
{sound_task();};
return ch;
}
同样也需要在motor.c中#include "sensor.h"
实际上放到这里不是最好的,使用中断回调函数,在PA7触发下降沿时执行最省资源。
编译后烧录。
当声音传感器接收到声音后,蓝牙APP会收到对应报警信息。
工程源码
国内用户请使用gitee克隆或是使用代理访问Github
https://github.com/USTHzhanglu/stm32-hal/tree/main/sound