首页 > 技术文章 > STM32 HAL库快速实战【八】《声音传感器的使用》--基于黑龙江科技大学机电工业机器人实训

USTHzhanglu 2021-12-09 15:32 原文

系列目录

点击查看

前言

本章介绍声音传感器的简单使用,和其他系列关联性较低。前置章节需要《蓝牙控制》,至少需要《串口的简单实用》

模块介绍与使用

介绍

image
1.可以检测周围环境的声音强度,使用注意:此传感器只能识别声音的有无(根据震动原理)不能识别声音的大小或者特定频率的声音
2 .灵敏度可调(图中蓝色数字电位器调节)
3.工作电压3.3V-5V
4.输出形式数字开关量输出(0和1高低电平)

使用

1.声音模块对环境声音强度最敏感,一般用来检测周围环境的声音强度。
2.模块在环境声音强度达不到设定阈值时,OUT口输出高电平,当外界环境声音强度超过设定阈值时,OUT口输出低电平
3.模块数字量输出OUT可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境的声音

调节

1.将模块电源接到最小版上,电源指示灯亮。
2.找到一个相对安静的环境,此时开关指示亮。如果不亮,可以调节数位器改变阈值,直至开关指示灯亮。
3.制造出一定的声音,此时开关指示灯灭。如果不灭或者一直闪烁,以调节数位器改变阈值,直至没有声音时开关指示灯常亮,有声音时开关指示灯常灭。
调节完毕后,将OUT与SD6端口相连。

CUBEMX配置

复制上一节的工程继续配置。
image
可以看到SD6与PA7相连接。
配置PA7为输入模式
image
打上标签方便使用
image

编写代码

首先新建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_strmotor.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会收到对应报警信息。
image

工程源码

国内用户请使用gitee克隆或是使用代理访问Github
https://github.com/USTHzhanglu/stm32-hal/tree/main/sound

推荐阅读