STM32傳感器模塊編程實踐(十五)DIY語音對話控制+滿溢檢測智能垃圾桶模型

文章目錄

    • 一.概要
    • 二.實驗模型原理
      • 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通訊有更深的了解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95935.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95935.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95935.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[bat-cli] docs | 控制器

鏈接&#xff1a;https://github.com/sharkdp/bat 前文傳送&#xff1a; 【探索Linux命令行】從基礎指令到高級管道操作的介紹與實踐【Linux命令行】從時間管理-&#xff1e;文件查找壓縮的指令詳解【Linux】1w詳解如何實現一個簡單的shell docs&#xff1a;bat bat 是一個*…

無線自動信道調整

通過信道調整功能&#xff0c;可以保證每個AP 能夠分配到最優的信道&#xff0c;盡可能地 減少和避免相鄰信道干擾&#xff0c;而且通過實時信道檢測&#xff0c;使AP 實時避開雷達&#xff0c;微波爐等干擾源。 動態信道調整能夠實現通信的持續進行&#xff0c;為網絡的可靠傳…

ios面試八股文

??Swift 語言特性??&#xff1a;請解釋一下 struct和 class的主要區別。特性????struct (值類型)????class (引用類型)????類型本質??值類型 (復制時創建獨立副本)引用類型 (復制時共享同一實例)??內存分配??通常在棧上 (更快速)在堆上 (需要ARC管理)??…

IntelliJ IDEA 2023更新git憑據

背景&#xff1a;已知原來從遠程倉庫獲取的項目&#xff0c;需要更新git用戶和密碼&#xff0c;但是又不想刪除本地項目環境&#xff08;不想重新獲取新建項目&#xff09;。報錯&#xff1a;remote: HTTP Basic: Access denied. The provided password or token is incorrect …

Docker 容器 OOM:從資源監控到JVM調優的實戰記錄

人們眼中的天才之所以卓越非凡&#xff0c;并非天資超人一等而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成超凡的必要條件。———— 馬爾科姆格拉德威爾 &#x1f31f; Hello&#xff0c;我是Xxtaoaooo&#xff01; &#x1f308; “代碼是邏輯的詩篇&#xff…

【開題答辯全過程】以 基于微信小程序的寵物領養系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

【可信數據空間-連接器狀態監控-Java代碼集成】

可信數據空間-連接器狀態監控-Java代碼集成一、 核心概念1. Micrometer2. Micrometer Registry Prometheus3.Prometheus二、 依賴配置 (Maven)三、 集成步驟與代碼示例場景一&#xff1a;在 Spring Boot 應用中集成&#xff08;最簡單&#xff09;1. 添加依賴&#xff08;如上所…

反編譯分析C#閉包

一、問題描述&#xff1a;比如有這樣的代碼&#xff1a;它的輸出結果是 3&#xff0c;3&#xff0c;3。通過搜索得知這一現象是因為C#閉包導致的.我們借助ILSpy看下IL中間代碼&#xff0c;首先它生成了一個名叫DisplayClass的類&#xff0c;類中定義了i的字段主代碼&#xff1a…

卷積神經網絡(CNN):從圖像識別原理到實戰應用的深度解析

目錄一.CNN的技術必要性&#xff1a;破解傳統圖像處理的兩大核心痛點痛點1&#xff1a;特征依賴人工設計&#xff0c;通用性差痛點2&#xff1a;全連接網絡參數爆炸&#xff0c;訓練難收斂二.CNN的核心原理&#xff1a;兩大機制與分層感知邏輯1.核心機制1&#xff1a;局部連接&…

用 SPL 編寫阿里云 FC2.0 函數

前言 在數字化轉型持續加速的背景下&#xff0c;企業越來越多地將業務邏輯以服務化方式部署至云端。阿里云函數計算&#xff08;Function Compute&#xff0c;簡稱FC&#xff09;作為一種無服務器計算平臺&#xff0c;屏蔽了底層資源運維的復雜性&#xff0c;使開發者能夠專注…

AR 巡檢與普通巡檢有哪些區別,有哪些優勢|阿法龍XR云平臺

AR 巡檢&#xff08;增強現實巡檢&#xff09;與普通巡檢&#xff08;傳統人工巡檢&#xff09;在技術應用、效率、準確性等多個維度存在顯著差異&#xff0c;具體區別如下&#xff1a; 1. 巡檢方式更智能 普通巡檢&#xff1a;依賴人工現場觀察&#xff0c;主要通過眼看、手…

Java中的volatile關鍵字詳解

核心作用&#xff1a;解決可見性和有序性問題volatile 的主要作用可以歸結為兩點&#xff1a;1.保證變量的可見性 和 禁止指令重排序。2.它提供了一種輕量級的同步機制&#xff0c;3.但需要注意的是&#xff0c;它不能保證原子性。保證可見性&#xff1a;什么是可見性問題&…

【Linux】MySQL數據目錄遷移步驟(含流程圖踩坑經驗)

在生產環境中&#xff0c;有時候你會遇到一些看似簡單但實際上很棘手的問題。最近我就碰到了一次典型的服務器磁盤空間告急&#xff0c;最后通過遷移 MySQL 數據目錄成功解決了問題。本文記錄整個過程&#xff0c;包括我的分析思路、遷移步驟、踩坑和經驗總結&#xff0c;希望對…

數據驅動下的連鎖模式復制:技術科普與方法論深度解析

前言在連鎖經營的賽道上&#xff0c;“復制”是核心命題&#xff0c;但絕非簡單的“粘貼”。當行業進入數字化深水區&#xff0c;數據驅動正成為連鎖模式突破增長瓶頸、實現高效復制的“隱形引擎”。本文將從技術科普與方法論心得兩個維度&#xff0c;深度拆解數據如何重塑連鎖…

數據庫學習MySQL系列2、Windows11系統安裝MySQL方法一.msi安裝詳細教程

方法一.msi安裝詳細教程 Windows系統下MySQL——.msi安裝詳細教程&#xff08;默認--只安裝服務端“Server only”&#xff09;MySql官網地址&#xff1a;https://www.mysql.com/&#xff1b;快速下載通道請單擊→ No thanks, just start my download.ps&#xff1a;其他資源(…

html+css+vue實現增刪改查

代碼如下&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>優化版 Vue.js CRUD 示例&l…

(計算機網絡)DNS解析流程及兩種途徑

在計算機網絡中&#xff0c;DNS&#xff08;Domain Name System&#xff09;用于 將域名解析為 IP 地址。一個完整的解析過程涉及 遞歸查詢、迭代查詢&#xff0c;以及多個關鍵角色&#xff08;LDNS、本地域名服務器&#xff1b;根服務器&#xff1b;頂級域名服務器&#xff1b…

數據結構——隊列(Java)

一.基本概念 隊列用來存儲邏輯關系為“一對一”的數據&#xff0c;是一種“特殊”的線性存儲結構。 特點&#xff1a; ?先進先出&#xff1a;隊列中元素的添加&#xff08;入隊enqueue&#xff09;和移除&#xff08;出隊dequeue&#xff09;遵循先進先出的原 則。 ?端點&…

【Go】:mac 環境下GoFrame安裝開發工具 gf-cli——gf_darwin_arm64

當前主要是關于gf_darwin_arm64的安裝步驟 如何快速給mac電腦安裝gfgf是什么安裝步驟方法1&#xff1a;去github下載gf-cli去git上下載對應電腦版本的gf-cli驗證下載文件是否二進制文件授予該文件權限方法2&#xff1a;去goframe官網教你下載步驟驗證gf是否安裝成功可能遇到的問…

【新】ApiHug官方文檔-ApiHug Spring Security 擴展-補充說明

概述 在上次說明中我們寫了ApiHug 如何做授權的&#xff0c; 這里有個概念的混淆&#xff0c; 其實 apihug 不是在spring security 上做的安全擴展&#xff0c; 應該是 apihug spring, 安全設計框架&#xff0c; 和本身 spring security 沒有半毛錢關系&#xff0c; 而如果你…