核心組件
元件 | 類型 | 目的 | 接口 |
---|---|---|---|
STM32F103CB | 微控制器 | 主處理單元 | - |
MPU6050 | 6 軸 IMU | 移動偵測 | I2C 接口 |
W25Q64 系列 | 閃存 | 信號和配置存儲 | SPI 系列 |
按鈕 | 用戶輸入 | 模式選擇和激活 | GPIO (通用輸出) |
搭載了LED | 用戶反饋 | 系統狀態指示 | GPIO (通用輸出) |
RT6150 系列 | 穩壓器 | 3.3V 電源 | - |
型號 CH340N | USB 轉串行 | 開發和調試 | 串口 |
作模式
系統有兩種主要作模式,用于確定識別手勢時的行為:
模式 0 (執行)
在此模式下,魔杖根據識別的手勢執行預先錄制的動作:
- 對于 IR 模塊:從閃存傳輸記錄的 IR 信號
- 對于 RF 模塊:從閃存傳輸記錄的 RF 信號
- 對于自定義模塊:執行特定于模塊的函數
模式 1 (錄制)
在此模式下,魔杖會在識別手勢時記錄信號:
- 對于 IR 模塊:記錄來自外部設備(例如電視遙控器)的 IR 信號
- 對于 RF 模塊:記錄來自外部發射器的 RF 信號
- 對于自定義模塊:記錄特定于模塊的數據
默認情況下,系統以模式 0 啟動。長按按鈕 (>0.5 秒) 可在模式之間切換,LED 指示燈模式提供當前模式的視覺反饋。
核心硬件組件
STM32F103CB 微控制器
STM32F103CB 微控制器用作 WAND 系統的中央處理單元。這款基于 ARM Cortex-M3 的 MCU 提供:
- 72 MHz 最大 CPU 頻率
- 128 KB 閃存
- 20 KB 的 SRAM
- 接口:I2C、SPI、UART
- 16 通道 12 位 ADC
- 工作電壓:3.3V
微控制器負責:
- 從 IMU 讀取運動數據
- 通過 CNN 模型處理數據以進行手勢識別
- 根據識別的手勢控制模塊界面
- 管理電源狀態和系統模式
MPU6050 IMU 傳感器
MPU6050 是一個 6 軸運動跟蹤裝置,結合了 3 軸陀螺儀和 3 軸加速度計。它通過 I2C 接口與 STM32 通信,并為手勢識別提供運動數據。
主要特點:
- 數字輸出加速度計和陀螺儀
- 用于運動處理的數字運動處理器 (DMP)
- I2C 接口工作頻率為 400kHz
- 每個軸的 16 位 ADC 分辨率
- 可編程滿量程范圍:±2g、±4g、±8g、±16g(加速度計)和 ±250、±500、±1000、±2000°/s(陀螺儀)
W25Q64 閃存
W25Q64 是一款 64Mbit SPI 閃存,用于存儲:
- 手勢識別模型參數
- 模塊配置數據
- 針對不同手勢錄制的 IR/RF 信號
閃存通過 SPI 接口連接到 STM32,提供非易失性存儲。
高級軟件架構
系統初始化
系統初始化序列由該功能管理,該功能設置所有硬件外圍設備并檢測已安裝的模塊。System_Init()
核心處理循環
Cyberry Potter 魔杖的主要處理循環包括捕獲手勢數據、識別手勢以及根據當前系統模式執行適當的模塊處理程序。
模塊系統
模塊系統是一個關鍵的架構組件,它通過支持不同的硬件連接來提供靈活性。
模塊檢測和初始化
該磁棒使用 ADC 讀數來識別通過特定于每個模塊的分壓器電路連接的模塊。
手勢識別架構
手勢識別系統從 MPU6050 IMU 捕獲運動數據,并使用通過 nnom 庫實現的 CNN 對其進行處理。
IMU 數據采集
系統模式管理
中斷處理
該系統將中斷用于時間關鍵型功能,包括 IMU 數據采集和 IR/RF 信號處理。
內存管理
Cyberry Potter 系統利用不同的內存區域進行作:
內存類型 | 用法 | 詳 |
---|---|---|
Flash (內部) | 程序代碼、CNN 權重 | 128KB 內置于 STM32F103CB 中 |
RAM | 運行時變量、數據緩沖區 | 20KB 用于易失性作 |
W25Q64 閃光燈 | 信號存儲、用戶配置 | 8MB 外部閃存,用于存儲 IR/RF 信號 |
目錄結構
代碼庫被組織成幾個反映架構組件的關鍵目錄:
通信接口
該系統采用多個通信接口進行內部和外部交互:
接口 | 協議 | 主要用途 |
---|---|---|
美國薩爾特1 | 串行 (115200 波特) | 調試、PC 通信 |
I2C 接口 | I2C 接口 | IMU (MPU6050) 通信 |
SPI2 | SPI 系列 | 外部閃存 (W25Q64) 訪問 |
GPIO (通用輸出) | 數字 I/O | 模塊檢測、按鈕輸入、LED 控制 |
外部接口 | 紅外/射頻 | 通過模塊與外部設備通信 |
結論
Cyberry Potter Electromagic Wand 軟件架構采用模塊化、分層的方法,在保持一致用戶體驗的同時,允許靈活的硬件配置。實時手勢識別、模塊特定功能和基于模式的作相結合,實現了一個多功能平臺,可通過直觀的棒狀手勢控制各種外部設備。
代碼庫遵循關注點的清晰分離,為核心系統功能、手勢識別、模塊管理和硬件抽象提供不同的組件。這種設計有助于維護和擴展,允許在不進行重大架構更改的情況下添加新的模塊和手勢。
手勢捕獲過程
當用戶按下魔杖上的按鈕時,手勢捕獲過程開始。這將從 MPU6050 傳感器啟動 1.5 秒的數據收集窗口。
捕獲序列
- 用戶按下并釋放按鈕(短按)
- 系統禁用按鈕中斷以防止捕獲過程中的干擾
- 系統啟用 IMU 中斷以進行數據收集
- 采樣期間 LED 關閉以節省電力
- MPU6050 捕獲 1.5 秒的運動數據
- 收集的數據經過預處理并饋送到 CNN 模型中
手勢識別算法
該魔杖使用卷積神經網絡 (CNN) 來識別各種運動模式。該模型使用 TensorFlow/Keras 進行訓練,然后使用 nnom 庫轉換為 STM32 微控制器部署。
CNN 架構
CNN 模型由以下層組成:
- Input layer - 接受時間序列運動數據
- Conv1D 層(30 個濾波器,內核大小 3,步幅 3)
- LeakyReLU 激活
- Conv1D 層(15 個濾波器,內核大小 3,步幅 3)
- LeakyReLU 激活
- 拼合圖層
- 密集圖層(輸出大小與手勢數量匹配)
- Dropout 層(0.3 率)
- Softmax 輸出層
支持的手勢
該系統能夠識別 13 種不同的手勢,每個手勢都映射到特定的作:
手勢 ID | 手勢名稱 | 描述 |
---|---|---|
0 | RightAngle (右角) | 形成直角的運動 |
1 | 銳角 | 形成銳角的運動 |
2 | 閃電 | 閃電圖案 |
3 | 三角形 | 三角運動 |
4 | Letter_h | 繪制字母 'h' |
5 | letter_R | 繪制字母 'R' |
6 | letter_W | 繪制字母 'W' |
7 | letter_phi | 繪制希臘 phi 符號 |
8 | 圈 | 圓周運動 |
9 | UpAndDown | 上下運動 |
10 | 角 | 喇叭狀圖案 |
11 | 浪 | 揮動動作 |
12 | 無運動 | 未檢測到明顯的運動 |
運行時數據處理
- 在 1.5 秒的捕獲窗口內收集原始 IMU 數據
- 數據經過預處理(縮放)以用于模型輸入
- CNN 模型通過其層處理數據
- 分析輸出概率以確定最可能的手勢
- 識別的手勢將傳遞給模塊處理程序以執行作
模式相關行為
手勢識別系統與模塊系統的交互方式因當前模式而異:
- 模式 0 (執行):識別的手勢觸發預先錄制的命令的執行
- 模式 1 (Record):識別的手勢開始錄制新命令
性能注意事項
手勢識別系統旨在在資源受限的 STM32 微控制器上高效運行。多項優化可確保可靠的性能:
- 有限采樣窗口:1.5 秒的捕獲窗口提供足夠的數據進行識別,同時最大限度地減少處理開銷
- 高效的 CNN 架構:該模型設計為輕量級,同時保持準確性
- 量化:量化模型權重以減少內存占用
- nnom 庫:使用優化的 nnom 庫在微控制器上進行神經網絡推理
定制流程
用戶可以通過使用自己的手勢數據訓練模型來自定義手勢識別系統:
- 在 config.h 中設置以啟用數據收集模式
SYSTEM_MODE_DATA_COLLECT
- 使用 Serial_Read.py 通過串行連接收集手勢數據
- 運行 CNNTrainRaw.py 以使用收集的數據訓練新模型
- 該腳本會生成一個包含模型參數的 weights.h 文件
- 替換固件中已有的 weights.h 文件并重新編譯
錯誤處理
手勢識別系統包括多種處理潛在錯誤的機制:
- IMU 通信檢查:驗證 IMU 在初始化期間是否正常運行
- 無移動檢測:包括一個“NoMotion”類,用于處理未執行不同手勢的情況
- 置信度閾值:僅考慮置信度高于特定閾值的手勢
- LED 反饋:提供有關系統狀態和識別結果的視覺反饋
數據采集
本頁記錄了從 Cyberry Potter Electromagic Wand 收集慣性測量單元 (IMU) 數據以訓練手勢識別模型的過程。有效的數據收集對于實現準確的手勢分類至關重要。
數據收集過程概述
數據收集過程包括在特殊數據收集模式下使用棒硬件,以在執行特定手勢時捕獲原始 IMU(加速度計和陀螺儀)讀數。然后,這些數據通過串行連接傳輸到計算機,并保存為文本文件,以供以后在 CNN 訓練中使用。
數據收集配置
在收集數據之前,您必須將魔杖的固件配置為在數據收集模式而不是推理模式下運行。
硬件要求
- 組裝的 Cyberry Potter Electromagic 魔杖
- 用于連接計算機的 USB Type-C 數據線
- 設置了 Python 環境的計算機
固件配置
-
修改文件以啟用數據收集模式:
config.h
- 取消注釋定義
SYSTEM_MODE_DATA_COLLECT
- 這會將魔杖從正常作切換到數據傳輸模式
- 取消注釋定義
-
將修改后的固件編譯并燒錄到魔杖上
正確配置后,當按下按鈕時,魔杖將通過串行連接輸出原始 IMU 數據,而不是嘗試對手勢進行分類。
數據收集腳本
該腳本通過與魔杖通信、接收 IMU 數據并將其保存到正確標記的文本文件來管理數據收集過程。Serial_Read.py
腳本作流程
使用腳本
- 運行腳本:
python Serial_Read.py
- 從顯示的列表中選擇適當的 COM 端口
- 從預定義列表中選擇要錄制的手勢:
- 直角、銳角、閃電、三角形、Letter_h、letter_R、letter_W、letter_phi、圓、UpAndDown、喇叭、波浪、NoMotion
- 指定要為此手勢錄制的樣本數
- 對于每個樣本:
- 按下魔杖按鈕
- 執行手勢
- 該腳本將在收到數據時保存數據
- (可選)錄制其他手勢
數據存儲和組織
目錄結構
該腳本使用以下命名約定創建目錄結構:
./TrainingData_[month]_[day]/
例如,如果在 8 月 23 日收集數據,則文件將保存到 。./TrainingData_8_23/
文件命名約定
數據文件使用指示手勢類型和順序索引的名稱進行保存:
[gesture_name]_[index].txt
例如:, , etc.RightAngle_1.txt
RightAngle_2.txt
該腳本會自動跟蹤用于每個手勢的最高索引并相應地遞增,以確保新記錄不會覆蓋現有數據。
數據格式
收集的數據包括來自 MPU6050 IMU 傳感器的原始讀數,包括 3 軸加速度計和 3 軸陀螺儀隨時間變化的值。采樣率和持續時間由固件固定。
示例數據格式
每個數據文件包含一行 6 個值,代表連續時間點的傳感器讀數:
ax ay az gx gy gz
ax ay az gx gy gz
...
哪里:
ax
, , : X、Y 和 Z 軸的加速度計讀數ay
az
gx
, , : X、Y 和 Z 軸的陀螺儀讀數gy
gz
按下按鈕時,IMU 數據將被捕獲大約 1.5 秒,從而每個手勢的樣本數是固定的。
支持的手勢
該腳本支持收集 13 種預定義手勢的數據:
指數 | 手勢名稱 |
---|---|
1 | RightAngle (右角) |
2 | 銳角 |
3 | 閃電 |
4 | 三角形 |
5 | Letter_h |
6 | letter_R |
7 | letter_W |
8 | letter_phi |
9 | 圈 |
10 | UpAndDown |
11 | 角 |
12 | 浪 |
13 | 無運動 |
這些手勢對應于項目文檔中顯示的符卡。
數據收集的最佳實踐
為了獲得最佳模型訓練結果,請遵循以下最佳實踐:
- 一致性:以一致的速度和大小執行每個手勢
- 多樣性:包括您執行每個手勢的方式的細微變化,以提高模型的穩健性
- 樣本量:每個手勢至少收集 10-20 個樣本以進行充分訓練
- 平衡:確保每種手勢類型的樣本數相似
- 移動:按下按鈕后立即開始手勢,因為數據收集立即開始
- 定位:將磁棒保持在舒適、自然的位置 - 方向會影響 IMU 讀數
- 驗證:在采集大量樣品之前驗證數據是否保存正確
故障 排除
常見問題及其解決方案:
-
未檢測到串行端口:
- 確保 USB 數據線已正確連接
- 驗證 Wand 是否已開機
- 檢查是否安裝了正確的驅動程序
-
未收到數據:
- 確認在 config.h 中未注釋
SYSTEM_MODE_DATA_COLLECT
- 驗證固件是否已成功刷新
- 檢查所選的 COM 端口是否正確
- 確認在 config.h 中未注釋
-
數據不完整或損壞:
- 該腳本檢查有效的數據標頭 - 如果數據被拒絕,請重試
- 確保按住按鈕足夠長的時間以完成數據收集
- 驗證魔杖的電池是否充滿電
與固件集成
中包含的導出模型旨在編譯到固件中,其中包含以下關鍵組件:weights.h
- 權重和偏差:存儲為常數整數數組
- 量化參數:用于正確縮放的十進制位位置
- 層配置:定義每個層參數的結構
- Model Creation Function:組裝神經網絡的函數
nnom_model_create()
在運行時,固件:
- 從 MPU6050 捕獲 IMU 數據
- 預處理數據以匹配訓練輸入格式
- 使用 NNoM 庫通過 CNN 模型傳遞數據
- 解釋輸出以確定識別的手勢
模型結構與在 Python 中訓練的模型結構相同,但針對嵌入式執行進行了優化:
性能注意事項
為優化資源受限環境的 CNN 模型,我們做出了幾種設計選擇:
- 模型大小:架構特意保持較小(兩個卷積層,一個密集層)
- 參數效率:使用 1D 卷積而不是 2D 卷積可以減少參數數量
- 量化:8 位整數量化降低了內存需求和計算開銷
- 選定的特征列:僅使用陀螺儀數據(第 3、4、5 列)而不是所有 IMU 數據
- 固定序列長度:使用 150 個時間步的固定輸入大小來標準化處理
這些優化使模型能夠在 STM32F103CB 微控制器上高效運行,同時保持足夠的手勢識別精度。
CNN 集成
目的和范圍
本文檔介紹了如何將預先訓練的卷積神經網絡 (CNN) 模型集成到 Cyberry Potter Electromagic Wand 固件中。它涵蓋了 STM32 微控制器上神經網絡的模型架構、部署過程和運行時作。
模型量化
該模型被量化為使用 8 位整數而不是浮點值,以顯著降低內存使用和計算要求,同時保持可接受的準確性。量化參數是為每個層定義的:
層 | 重量 Dec Bits | Bias Dec Bits | 輸出偏移 | 偏置偏移 |
---|---|---|---|---|
卷積 1D | 8 | 10 | 8 | 2 |
LSTM 系列 | 8/7 (內核/循環) | 6 | 5 | 6 |
稠 | 8 | 10 | 12 | 5 |
這些量化參數控制整個推理過程中網絡權重、偏差和激活的定點表示。
固件中的模型定義
神經網絡模型在固件中通過一組張量定義,這些張量代表每層的權重、偏差和配置結構。模型參數以靜態數組的形式存儲在文件中。weights.h
模型初始化
通過以下函數在固件中創建和初始化模型:nnom_model_create()
- 創建一個空的模型結構
- 定義每個層及其特定配置
- 將各層連接在一起以形成完整的網絡
- 編譯模型以準備進行推理
模型初始化遵循順序模式,其中每一層都掛接到前一層,從而創建一個完整的神經網絡管道。
運行時推理過程
在作過程中,魔杖的固件會在用戶按下按鈕時收集 IMU 傳感器數據,通過神經網絡處理這些數據,并輸出手勢分類。
內存管理
該模型針對STM32F103CB的有限資源進行了優化:
- 使用 8 位量化權重和激活
- 所有模型參數的靜態內存分配
- 作為靜態數組分配的輸入和輸出緩沖區
Input buffer: 450 bytes (150 timestamps × 3 axes)
Output buffer: 13 bytes (13 gesture classes)
總結
Cyberry Potter Electromagic Wand 中的 CNN 集成代表了在資源受限的嵌入式系統上機器學習的復雜實現。通過使用 NNoM 庫、量化技術和優化的模型架構,該系統無需外部處理即可實現實時手勢識別。
集成過程包括:
- Python 中的模型訓練(在?CNN 模型訓練中介紹))
- 將訓練的權重導出到 C 頭文件
- 使用 NNoM 在固件中定義模型結構
- 對 IMU 數據進行實時推理
- 用于控制魔杖功能的手勢分類
此實現展示了一種在嵌入式系統上部署神經網絡以實現交互式應用程序的有效方法。
模塊系統
模塊系統是 Cyberry Potter Electromagic Wand 的關鍵組件,它通過可互換的硬件模塊實現可擴展的功能。本頁介紹了模塊架構、接口以及魔杖如何與各種插件模塊通信,以根據識別的手勢執行不同的作。
模塊系統架構
Cyberry Potter 魔杖采用模塊化設計,帶有金手指插槽連接器,允許插入不同的模塊并被系統識別。模塊系統位于手勢識別系統和魔杖與之交互的外部設備之間,將識別的手勢轉換為特定的硬件作。
模塊作模式
模塊系統以兩種主要模式運行,控制魔杖與外部設備的交互方式:
- 模式 0 (執行):當識別到手勢時,魔杖通過連接的模塊傳輸預先錄制的信號以控制外部設備。
- 模式 1 (Record): 當識別到手勢時,魔杖等待錄制傳入信號,然后將其存儲并與該手勢相關聯。
信號數據結構
模塊系統使用通用數據結構來存儲和管理信號數據,允許不同類型的模塊使用相同的底層信號處理框架。
每個信號都存儲為一組持續時間,表示信號的交替高電平和低電平狀態。這種格式適用于 IR 和 RF 協議,使其適用于不同的模塊類型。
模塊處理程序接口
Module Handler 充當核心系統和特定 Module 實現之間的抽象層。它提供了一個統一的接口,用于初始化、發送和接收信號,而與模塊類型無關。
主要功能
功能 | 目的 |
---|---|
Module_IR_RF_Init | 根據檢測到的模塊類型初始化相應的模塊 |
Module_IR_RF_Transmit | 從閃存中讀取信號并通過模塊傳輸 |
Module_IR_RF_Receive | 記錄輸入信號并將其存儲到閃存中 |
Module_IR_RF_Copy_From_Buffer | 從 Flash 緩沖區中提取信號數據 |
Module_IR_RF_Copy_To_Buffer | 準備信號數據以存儲在 Flash 中 |
模塊類型檢測和初始化
當系統啟動時,它會檢測插入 Gold Finger 插槽的模塊類型,并初始化相應的硬件接口。這種檢測機制允許 Wand 無縫地處理不同的模塊類型。
信號記錄過程
當處于 recording 模式時,模塊系統等待輸入信號,捕獲信號轉換的時序,并將此信息存儲在信號緩沖區中。
信號錄制過程使用 Timer2 來測量信號轉換之間的持續時間。如果在定義的超時時間內未檢測到信號,則錄制過程將自動終止。
信號傳輸過程
當在執行模式下識別到手勢時,該模塊會從 Flash 存儲器中檢索相應的存儲信號,并通過活動模塊傳輸。
模塊通信協議
每種模塊類型都實現了與外部設備通信的特定協議:
紅外模塊(類型 0)
- 使用 38kHz 載波頻率進行紅外傳輸
- 支持常見的 IR 協議,包括 NEC、Sony、RC5 等。
- 信號被編碼為載波開/關周期的交替持續時間
射頻模塊(類型 1-2)
- 支持 433MHz 和 315MHz 射頻通信
- 兼容各種射頻遙控系統
- 信號編碼類似于 IR 的開/關持續時間序列
閃存組織
模塊記錄的信號存儲在外部 W25Q64 閃存中,并為不同的模塊類型和手勢分配不同的區域。
這種內存組織允許系統為模塊類型和識別手勢的每種組合存儲不同的信號,從而使魔杖高度可定制。
使用自定義模塊進行擴展
模塊系統設計為可擴展,允許用戶通過以下方式創建自定義模塊:
- 開發符合 Gold Finger 接口規范的硬件
- 通過創建新的 moduleX.c 和 moduleX.h 文件來實現驅動程序
- 將新模塊與現有模塊處理程序系統集成
模塊系統集成
模塊系統與 Cyberry Potter Electromagic Wand 的其他組件集成,如下所示:
這種集成允許魔杖檢測手勢并通過附加的模塊執行適當的作,從而創建無縫的用戶體驗。
紅外模塊
概述和目的
紅外模塊是 Cyberry Potter Electromagic Wand 系統的插件組件,可實現紅外信號功能。該模塊允許魔杖記錄來自遙控器的紅外信號并回放它們,通過手勢識別有效地將魔杖變成通用遙控器。
硬件架構
IR 模塊由兩個主要組件組成:
- 紅外發射器:連接到 STM32 微控制器的 GPIO A6 的紅外 LED
- 紅外接收器:連接到 GPIO A7 的紅外接收器模塊
該模塊通過 Gold Finger 連接器接口與魔杖的主板集成。
IR 模塊硬件配置
信號表示
IR 信號表示為 timing durations 序列,其中每個 duration 代表載波開啟或載波關閉周期。系統使用一種稱為 structure 來存儲這些信號。IR_RF_Signal_t
IR 信號數據結構
該數組存儲脈沖和空間序列的時序,每個元素以 Timer2 計數單位(默認為 20μs)表示一個時間段。交替元件表示 IR 載波的 ON 和 OFF 狀態。duration
信號傳輸
IR 模塊在 PWM 模式下使用定時器 3 (TIM3) 生成 3kHz 載波用于 IR 傳輸。載波根據記錄的信號模式進行調制。
傳輸函數遍歷存儲的持續時間數組,在 carrier-on 和 carrier-off 狀態之間交替。當載波開啟時,IR LED 發出 38kHz 脈沖;熄滅時,LED 保持非活動狀態。
信號記錄
IR 模塊通過 IR 接收器觸發的外部中斷捕獲 IR 信號。每個邊沿轉換 (上升或下降) 都會觸發中斷,轉換之間的時間使用 Timer 2 (TIM2) 進行測量。
錄制過程
錄制過程由函數啟動,并一直持續到信號緩沖區已滿或發生超時(50 毫秒不活動)。Module_IR_RF_receiver_start()
與 Gesture Recognition 集成
IR 模塊與魔杖的手勢識別系統配合使用。不同的手勢可以映射到不同的 IR 命令,允許用戶通過簡單的魔杖移動來控制 IR 設備。
IR 模塊作模式
模式 | 描述 | 功能 |
---|---|---|
執行(模式 0) | 根據識別的手勢傳輸預先錄制的 IR 信號 | Module_IR_RF_Transmit() |
錄制(模式 1) | 記錄新的 IR 信號并將其與特定手勢相關聯 | Module_IR_RF_Receive() |
在錄制模式下,魔杖首先從現有遙控器捕獲 IR 信號。錄制后,此信號將與特定手勢相關聯。在執行模式下,執行手勢將導致魔杖傳輸相應的 IR 信號。
實現細節
IR 信號載波生成
IR 模塊使用定時器 3 (TIM3) 生成 3kHz 載波用于 IR 傳輸,參數如下:
- 頻率:38kHz
- PWM 模式:PWM1
- 占空比:~33%(激活時)
該函數通過設置適當的 PWM 占空比來控制載波的生成:Module0_IR_38Khz_Logic()
- 邏輯 1:PWM 占空比 = 422/633 (~67%)
- 邏輯 0:PWM 占空比 = 0(無載波)
時序參數
定時器 2 (TIM2) 用于對 IR 信號的持續時間進行定時,配置如下:
- 頻率:50kHz
- 每次計數時間:20μs(由 US_PER_TIMER2_COUNT 定義)
- 超時時間:50ms(由 TIM2_RECORD_OVERTIME_US 定義)
常見使用場景
IR 模塊支持 Cyberry Potter Electromagic Wand 的多種實際應用:
-
通用遙控器:使用來自多個遙控器的 IR 信號對魔杖進行編程,并以不同的手勢控制不同的設備。
-
宏命令:錄制復雜的 IR 命令序列,并通過單個手勢觸發它們。
-
智能家居集成:使用魔杖控制支持 IR 的智能家居設備,如空調、電視和娛樂系統。
該系統的模塊化設計允許 IR 模塊與其他通信模塊交換,為不同的用例提供靈活性。
RF433 模塊
RF433 模塊通過以下引腳連接到 STM32 微控制器:
針 | 功能 | 描述 |
---|---|---|
PA6 | RF433 發射器輸出 | 驅動 RF433 發射器的數字輸出 |
PA7 系列 | RF433 接收器輸入 | 帶上拉電阻的數字輸入,可連接到 RF433 接收器 |
軟件架構
RF433 模塊的軟件實現由初始化函數和信號處理功能組成。
初始化
該功能配置 RF433 通信所需的硬件組件:Module1_RF433_Init()
- 將 GPIO PA6 初始化為發射器的輸出
- 將 GPIO PA7 初始化為接收器的上拉輸入
- 配置 EXTI7 中斷,以便在 PA7 上進行信號邊沿檢測
- 設置 Timer2 以進行精確的定時測量
信號數據結構
RF 信號使用該結構進行存儲,其中包含:IR_RF_Signal_t
typedef struct IR_RF_Signal_t{eSignal_Status status; // Signal status (EMPTY, RECORDING, READY)uint16_t duration[SIGNAL_SEQUENCE_SET_LENGTH]; // Time durations between transitionsuint16_t length; // Number of transitions in the signal
}IR_RF_Signal_t;
該結構保存 timing 信息而不是原始信號,使其與協議無關且存儲效率高。
信號傳輸過程
該功能通過根據錄制的持續時間切換發射機輸出來再現射頻信號:Module1_RF433_Transmit()
信號記錄和定時
RF433 模塊使用基于中斷的方法來記錄信號:
- 當接收器引腳 (PA7) 改變狀態時,將觸發 EXTI 中斷
- 中斷處理程序記錄轉換之間的時間
- Timer2 用于以微秒精度測量時間間隔
時序參數
參數 | 價值 | 描述 |
---|---|---|
TIM2_FREQUENCY | 50 赫茲 | 定時器工作頻率 |
US_PER_TIMER2_COUNT | 20 微秒 | 每個計時器計數的時間分辨率 (1000000/TIM2_FREQUENCY) |
TIM2_RECORD_OVERTIME_US | 50000 微秒 | 連續信號的最大記錄時間 (50ms) |
SIGNAL_SEQUENCE_LENGTH | 1024 | 可錄制的最大過渡數 |
如評論中所述,RF433 發射器需要 13kHz 的最小頻率才能正常運行。
與 Cyberry Potter System 的模塊集成
RF433 模塊通過模塊接口與魔杖系統的其余部分集成:
RF433 模塊通過抽象層與其他 RF 和 IR 模塊共享通用功能,為記錄和傳輸信號提供統一的功能。
使用示例
記錄 RF 信號
- 將魔杖設置為錄制模式
- 執行與要錄制的 RF 信號關聯的手勢
- 在瞄準魔杖的 RF433 接收器的同時按下原裝 RF 遙控器上的按鈕
- LED 指示燈將指示錄制成功
傳輸 RF 信號
- 將魔杖設置為 Execute 模式
- 執行與錄制的 RF 信號關聯的手勢
- RF433 模塊將傳輸信號以控制目標設備
技術規格
- 工作頻率: 433.92 MHz
- 信號編碼:記錄原始時序信息,兼容各種射頻協議
- 分辨率:每個計時單位 20 微秒
- 最大信號長度:1024 個過渡
- 最大單次持續時間:50 毫秒
該模塊設計為與協議無關,只要它們在 433MHz 頻段上運行,就可以與各種 RF433 設備一起使用,無論其特定的編碼機制如何。
串行命令模塊
目的和概述
串行命令模塊將識別的手勢模式轉換為串行命令,這些命令可以通過 UART 傳輸到外部設備。該模塊用作通信接口,允許 Cyberry Potter Electromagic Wand 通過手勢識別控制計算機、微控制器或其他支持串行的設備。
功能架構
串行命令模塊提供了一種將物理手勢轉換為串行數據命令的方法。它支持兩種不同的作模式,為每個識別的手勢定義不同的命令映射。
模塊初始化
串行命令模塊初始化 USART3 外設以進行串行通信。這是在 函數 中執行的。Module3_Init()

作模式
串行命令模塊以兩種不同的模式運行,每種模式具有不同的命令映射策略:
模式 0:手勢名稱輸出
在模式 0 中,模塊通過串行通信將識別的手勢名稱以純文本字符串的形式傳輸。這樣就可以與可以解釋字符串命令的設備進行簡單的基于文本的通信。
模式 1:鍵碼序列
在模式 1 中,模塊傳輸與每個手勢對應的預定義鍵碼序列。這允許魔杖模擬鍵盤輸入或發送特定的控制代碼。
手勢到命令映射
下表顯示了手勢如何映射到每種模式下的命令:
模式 0 映射(手勢名稱)
手勢 | 串行輸出 |
---|---|
RightAngle (右角) | “RightAngle\n” |
銳角 | “SharpAngle\n” |
閃電 | “閃電\n” |
三角形 | “三角形\n” |
Letter_h | “Letter_h\n” |
Letter_R | “Letter_R\n” |
Letter_W | “Letter_W\n” |
Letter_phi | “Letter_phi\n” |
圈 | “圓圈\n” |
UpAndDown | “UpAndDown\n” |
角 | “喇叭\n” |
浪 | “Wave\n” |
模式 1 映射(鍵序列)
手勢 | 鍵序列 | 功能 |
---|---|---|
RightAngle (右角) | 進入 | 發送 Enter 鍵 |
銳角 | 右 | 發送右箭頭鍵 |
閃電 | 左 | 發送向左箭頭鍵 |
三角形 | 下 | 發送向下箭頭鍵 |
Letter_h | 向上 | 向上發送箭頭鍵 |
Letter_R | “5” + 回車 | 發送 “5” 后跟 Enter 鍵 |
Letter_W | “6” + 回車 | 發送 “6” 后跟 Enter 鍵 |
Letter_phi | “7” + 回車 | 發送 “7” 后跟 Enter 鍵 |
圈 | “8” + 回車 | 發送 “8” 后跟 Enter 鍵 |
UpAndDown | “9” + 回車 | 發送 “9” 后跟 Enter 鍵 |
角 | “10” + 回車 | 發送 “10” 后跟 Enter 鍵 |
浪 | “11” + 回車 | 發送 “11” ,然后按 Enter 鍵 |
實現細節
鍵代碼定義
該模塊定義了表示鍵盤鍵和特殊功能的鍵代碼枚舉。這些鍵代碼在模式 1 中用于創建鍵序列命令。
KEY_NAME enum values:
- Basic modifiers: LCTRL, LSHIFT, LALT, LMETA
- Navigation keys: UP, DOWN, LEFT, RIGHT
- Function keys: F1-F12
- Special keys: ESC, BACKSPACE, ENTER, TAB
命令處理流程
兩種作模式都遵循類似的處理命令的過程:
- 識別的手勢 () 是從手勢識別系統接收的
model_output
- 根據手勢選擇相應的命令字符串或鍵序列
- 命令將復制到緩沖區
- 緩沖區內容通過 USART3 逐字節傳輸
- 在字節之間插入 50 毫秒的延遲以確保正確接收
與系統架構集成
串行命令模塊與 Cyberry Potter Electromagic Wand 系統集成,作為可互換的模塊選項之一,可以連接到主板上的模塊接口。
技術規格
- 通訊接口:USART3
- 波特率:由 USART3 初始化定義(標準配置)
- 數據格式:8 位數據,無奇偶校驗,1 個停止位
- 傳輸時序:字節間 50ms 延遲
- 緩沖區大小:命令字符串為 64 字節
- 支持的手勢:12 種不同的模式
使用示例
控制演示文稿
串行命令模塊可用于通過將手勢映射到導航箭頭鍵來控制演示軟件:
- 使用 “SharpAngle” 手勢發送向右箭頭(下一張幻燈片)
- 使用 “Lightning” 手勢發送向左箭頭(上一張幻燈片)
設備控制
用于控制智能家居設備或其他接受串行命令的系統:
- 配置接收系統以解釋模式 0 中的純文本手勢名稱
- 在接收端為每個已識別的手勢編程特定作
實施注意事項
在實現與 Serial Command Module 接口的應用程序時,請考慮:
- 傳輸字節之間的 50ms 延遲,這可能會影響對時序敏感的應用程序
- 模式 0 輸出字符串的固定格式,始終以換行符結尾
- 模式 1 中的預定義鍵序列,以常見的控制方案為目標
LED 狀態指示燈及含義
磁棒上的狀態 LED 提供有關系統狀態的重要反饋。了解這些適應癥有助于診斷問題:
LED 圖案 | 意義 | 可能存在的問題 |
---|---|---|
10Hz 閃爍 | 系統繁忙 | 處理過程中正常 |
5Hz 閃爍 | 等待輸入 | 錄制模式下的正常 |
2Hz 閃爍 | 錯誤狀態 | 檢查最近的作 |
常亮 | 作已完成 | 作成功后正常 |
關閉 | 關機或深度錯誤 | 檢查電源或重置系統 |