文章目錄
- 一.概要
- 二.實驗模型原理
- 1.硬件連接原理框圖
- 2.控制原理
- 三.實驗模型控制流程
- 四.語音控制垃圾桶模型程序
- 五.實驗效果視頻
- 六.小結
一.概要
以前介紹的智能垃圾桶模型都是通過超聲波模塊感知控制,這次介紹一款新的智能垃圾桶,直接使用語音交互模塊進行垃圾桶的開閉控制。
本文就做一個語音對話智能感應垃圾桶套件模型,采用STM32F103C8T6單片機+舵機+語音交互模塊+激光紅外模塊,實現使用語音指令就能進行垃圾桶自動開啟,以及垃圾桶里的物體放滿了,就產生垃圾桶滿的語音報警。
二.實驗模型原理
1.硬件連接原理框圖
模型主要分為五部分:主芯片單元,語音對話單元,執行動作單元,滿溢檢測單元。
圖中主控芯片為STM32F103C8T6單片機,語音對話單元為ASR-PRO模塊,執行傳感器為180度SG90舵機,滿溢檢測單元為紅外激光測距檢測。
信號線連接:SG90(180度)舵機的信號腳橙色線接到單片機的PA6腳。ASR-PRO模塊接單片機的PB8,PB9引腳。紅外激光測距模塊接單片機的模擬IIC通訊引腳PB12,PB13以及PB7引腳。
2.控制原理
語音模塊交互原理:
語音交互模塊是一款集成了離線語音識別功能的模塊,用戶可以通過該模塊實現語音識別功能,外部加上麥克風與喇叭,就能實現語音識別與對話。
語音核心板固件程序可以通過 USB轉 TTL模塊連接實現硬件連接下載,接線是 5V,GND,TX,RX四根線。
使用語音模塊的開發軟件,天問 Block 編程軟件,制作好圖形化語音對話控制程序,下圖是語音交互程序,接收的語音命令是"打開垃圾桶",“關閉垃圾桶”,生成模型后,點擊2M編譯下載,連接USB轉 TTL模塊就能實現對語音模塊進行固件程序下載。
舵機控制原理:
SG90舵機,首先,控制引腳是三根線,分別是GND(棕色)、VCC(紅色)、PWM(黃色),控制方式也是一樣的PWM時序,具體的方法如下:
(1)采用PWM控制的方式來進行舵機的旋轉
(2)舵機的控制需要MCU產生一個20ms周期的脈沖信號,以0.5ms到2.5ms的高電平來控制舵機的角度。
(3)高電平時間跟舵機旋轉的角度對應關系:
0.5ms-------------0度;對應函數中占空比為2.5%
1.0ms------------45度;對應函數中占空比為5.0%
1.5ms------------90度;對應函數中占空比為7.5%
2.0ms-----------135度;對應函數中占空比為10.0%
2.5ms-----------180度;對應函數中占空比為12.5%
滿溢檢測原理:
通過紅外激光模塊裝在垃圾桶頂部區域,單片機通過IIC總線與紅外模塊進行通訊,讀取檢測到的距離值,紅外激光模塊通過光線的反射原理,用來測量障礙物的距離,如果障礙物的距離比較小,說明垃圾桶滿了。
三.實驗模型控制流程
1.語音交互模塊接收到"打開垃圾桶"的語音之后,語音模塊的PA4引腳就會輸出高電平。
2.單片機一直讀取PB9引腳,由于單片機的PB9跟語音模塊的PA4引腳是相連的,如果讀取到PB9引腳為高電平,單片機就會通過PA6引腳輸出20ms周期的PWM波。PWM波高電平脈沖時間為2.5ms,這樣舵機就會旋轉180度,從而帶動垃圾桶的蓋打開,垃圾桶保持打開狀態不變。單片機同時驅動紅外激光模塊測距,如果距離小于8CM,說明垃圾桶頂部被東西覆蓋,垃圾桶已經滿了,單片機就會控制PB8引腳輸出高電平,由于單片機的PB8引腳與語音模塊的PA1引腳是相連的,語音模塊的PA1引腳讀取到高電平之后,就會輸出"滿了滿了"的語音。
3.語音交互模塊接收到"關閉垃圾桶"的語音之后,語音模塊的PA4引腳就會輸出低電平,單片機一直讀取PB9引腳,由于單片機的PB9跟語音模塊的PA4引腳是相連的,如果為低電平,單片機通過PA6引腳輸出20ms周期。PWM波高電平脈沖時間為0.5ms,這樣舵機就回到0度,從而帶動垃圾桶的蓋閉合。
四.語音控制垃圾桶模型程序
板子與SG90舵機(180度舵機)用杜邦線連接:
板子5V----紅色線
板子A6----橙色線
板子G-----棕色線板子與紅外激光測距模塊用杜邦線連接:
板子3.3V----VIN
板子B12----SCL
板子B13----SDA
板子B7------XSHUT
板子G-------GND
USB線需要接小系統板,給STM32板子供5V, 板子與語音模塊直接相連,板載麥克風,板子再外接一個喇叭。
實物地址
打開STM32CubeMX軟件,新建工程
Part Number處輸入STM32F103C8,再雙擊就創建新的工程
配置下載口引腳
配置外部晶振引腳
配置系統主頻
PB8,PB12,PB13,PB7配置成輸出,PB9配置成輸入,而且是下拉輸入,因為要讀取語音模塊輸出的高電平信號。
配置PWM輸出,定時器3通道1,周期20ms
配置工程文件名,保存路徑,KEIL5工程輸出方式
生成工程
用Keil5打開工程
添加代碼
添加紅外激光代碼:
添加語音模塊輸出的高低電平控制舵機驅動代碼:
添加滿溢檢測代碼:
主要程序:
/* USER CODE BEGIN 0 */
uint16_t Pluse_Time=500,Old_Pluse_Time,DistanceTimeCounter,DistanceCounter;//1毫秒脈沖,單位是us
uint8_t OpenFlag;
uint8_t Vl53l0_FullFlag;//滿報警,連續檢測3次滿,認為滿了
/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM3_Init();/* USER CODE BEGIN 2 */while(vl53l0x_init(&vl53l0x_dev))//vl53l0x初始化{ HAL_Delay(500);}if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6腳PWM輸出{/* PWM generation Error */while(1);}HAL_Delay(200);//等待200ms//以180度角度伺服為例,那么對應的控制關系是這樣的(t為高電平時間)://t=0.5ms(占空比2.5%)---------0°;//t=1.0ms(占空比5%)-----------45°;//t=1.5ms(占空比7.5%)---------90°;//t=2.0ms(占空比10%)---------135°;//t=2.5ms(占空比12.5%)-------180°;Pluse_Time=500;//0.5ms高電平脈沖,用于控制舵機轉到0度HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止輸出HAL_Delay(100);//等待100msMX_TIM3_Init();//重新初始化配置PWM波if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6腳PWM輸出{/* PWM generation Error */while(1);}HAL_Delay(200);//等待200msHAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止輸出 OpenFlag=0;//關閉vl53l0x_general_Init(&vl53l0x_dev,Default_Mode);//默認模式測試/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(100);//等待100ms if((HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9) == 1) && OpenFlag==0)//收到打開垃圾桶語音,進行打開垃圾桶動作{DistanceCounter=0;Pluse_Time=2500;HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止輸出MX_TIM3_Init();//重新初始化配置PWM波if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6腳PWM輸出{while(1);}HAL_Delay(1000);OpenFlag=1;}else if((HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9) == 0)&& OpenFlag==1)//收到關閉垃圾桶語音,進行關閉垃圾桶動作{DistanceCounter=0;Pluse_Time=500;//0.5ms高電平脈沖,用于控制舵機轉到0度if(Old_Pluse_Time!=Pluse_Time){HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止輸出MX_TIM3_Init();//重新初始化配置PWM波HAL_Delay(100);//等待100msif (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6腳PWM輸出{/* PWM generation Error */while(1);}HAL_Delay(1000);//等待1000msOpenFlag=0; } }if(OpenFlag==1)//打開的時候做滿檢測{vl53l0x_general_Test(&vl53l0x_dev);if(Vl53l0_OK_Flag==1&& vl53l0x_data.RangeMilliMeter<=50)//檢測到有效距離,且距離小于5cm,說明滿了{Vl53l0_FullFlag++;if(Vl53l0_FullFlag>=3){HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_SET);//PB8輸出高電平,控制語音模塊輸出滿了滿了語音HAL_Delay(1000);//等待1000ms}}else{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_RESET);//PB8輸出低電平,關閉滿了滿了的語音Vl53l0_FullFlag=0;}}Old_Pluse_Time=Pluse_Time;}/* USER CODE END 3 */
}
語音模塊是通過圖形化編程,用天問軟件,流程代碼如下:
五.實驗效果視頻
STM32單片機帶語音交互控制和滿溢檢測智能垃圾桶模型
六.小結
融合了舵機,語音交互模塊,紅外激光測距的控制,對STM32的單片機的定時器PWM功能,定時器功能,IIC通訊有更深的了解。