系列目錄
點擊查看
- 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