基于EV54Y39A PIC-IOT WA的手指數量檢測功能開發(MPLAB+ADC)

目錄

  • 項目介紹
  • 硬件介紹
  • 項目設計
    • 開發環境及工程參考
    • 總體流程圖
    • 硬件基本配置
      • 光照傳感器讀取
      • 定時器
      • 檢測邏輯
  • 功能展示
  • 項目總結

👉 【Funpack3-2】基于EV54Y39A PIC-IOT WA的手指數量檢測功能開發
👉 Github: EmbeddedCamerata/PIC-IOT_finger_recognition

項目介紹

基于 Microchip 的 EV54Y39A PIC-IOT WA 開發板,通過板卡上集成的光照傳感器,將板卡平放后,每秒對揮動的手指數量進行檢測。在較強光源下,可準確識別揮動的手指數量。

👉 MPLAB X IDE

硬件介紹

PIC-IoT WA硬件概述:

  • 控制器包含兩個主要組件:PIC微控制器(PIC24FJ128GA705)和Wi-Fi模塊(WINC1510)。PIC24F是一款低功耗的16位微控制器,時鐘頻率為32MHz,具有集成的12位ADC。Wi-Fi模塊采用Microchip的ATWINC1510,是低功耗認證的IoT網絡控制器。
  • 板載ATECC608的密碼協處理器。用于生成私鑰和公鑰,私鑰用于加密發送的每條消息,而公鑰可與服務提供商(如Google IoT cloud或AWS)共享。
  • 板載傳感器包括TEMT6000X01光傳感器和MCP9808溫度傳感器。光傳感器連接到PIC控制器的10位ADC,溫度傳感器通過I2C接口測量-20℃至100℃之間的溫度,典型精度為0.25℃。
  • PIC IoT WA開發板可通過微型USB端口或4.2V鋰電池供電,同時具有板上編程仿真器和調試器(PKOB)支持一路串口和一個IO的邏輯分析功能。

PIC-IOT WA

項目設計

開發環境及工程參考

本項目使用 Microchip 官方的 MPLAB X IDE 開發。項目所用到的工具鏈、庫或 packs 如下:

  1. 編譯器:xc16 v1.50,這個版本的編譯器確保編譯通過
  2. Packs: PIC24F-GA-GB_DFP 1.9.336、PKOB nano 1.13.715
  3. MCC Content Libraries:
    1. MCC core 5.7.1
    2. PIC24 / dsPIC33 MCUs 1.171.4
    3. Board Support Library 1.12.0

總體流程圖

工程總體流程
進行系統初始化以后,先啟動周期為1s的定時器,該定時器自動重載,在其回調函數中打印識別的手指數目 count,之后清零并進入 STATE_IDLE。工程主體為一個 while(1) 循環的 FSM,用一個全局變量記錄系統狀態:

  • 每次都會先讀取光照傳感器的數據,并根據此次與上次讀數的差值,進入其他的狀態
  • 在 STATE_IDLE 中,當差值小于一個負閾值時,進入 STATE_NEGA,此時識別到光照降低,這說明有手指遮擋。其余情況沒有手指遮擋,狀態不轉移。當定時器觸發時,打印出此時的識別數目并將 count 清零,系統重新進入 STATE_IDLE。
  • 在 STATE_NEGA,當差值大于一個正閾值時,進入 STATE_POS,此時識別到光照增加,這說明手指移開了,count++。在 STATE_NEGA,若保持光照讀數相對穩定,這說明該手指還未完全經過傳感器,狀態不轉移。當定時器觸發時,打印出此時的識別數目并將 count 清零,系統重新進入 STATE_IDLE。
  • 在 STATE_POS 中,只有當差值又一次小于負閾值時,進入 STATE_NEGA,此時識別到光照降低,這說明又有手指遮擋。若保持光照讀數相對穩定或增加,這說明并沒有新的手指遮擋。當定時器觸發時,打印出此時的識別數目并將 count 清零,系統重新進入 STATE_IDLE。

由于測量周期是1s,即便測量狀態沒有變化,定時器回調也會將狀態、變量全部重置。在 FSM 中,只需要處理有效的測量的統計邏輯即可。

硬件基本配置

根據手冊可知,板載光照傳感器與ADC AN8(RB12)相連。檢測的周期設計為1秒,如此,需要一個定時器 TMR1。其次,還需要串口以供調試與結果顯示。在MCC中,IO口設置如下圖所示:

外設配置
RB10/11供調試使用。串口設置為9600 8N1,RC8 UITX 需要勾選“Start High”,勾選“Redirect printf to UART”。

光照傳感器讀取

需要修改一下默認的 ADC1 配置。根據下方提示,修改“Conversion Clock”為2即可。

ADC1配置修改
根據生成的ADC示例,可以修改實現光照傳感器數據的讀取。

uint16_t get_light_sensor(void)
{int i;uint16_t conversion;ADC1_Enable();ADC1_ChannelSelect(LIGHT_SENSOR);ADC1_SoftwareTriggerEnable();//Provide Delayfor(i = 0; i < 1000; i++){}ADC1_SoftwareTriggerDisable();while(!ADC1_IsConversionComplete(LIGHT_SENSOR));conversion = ADC1_ConversionResultGet(LIGHT_SENSOR);ADC1_Disable();return conversion;
}

定時器

如下圖所示配置,設置 TMR1 為1s周期定時器。

1s周期定時器設置
在定時器的回調函數 periodic_handler 中,打印 count 手指數目,而后清零并將狀態設置為 APP_STATE_IDLE。在主循環之前創建定時器,定時器超時設置為 0xF423,在主循環內需要調用 timeout_callNextCallback() 以檢查回調。

static uint32_t periodic_handler(void)
{printf("Finger count: %d\n", count);appState = APP_STATE_IDLE;count = 0;return 0xF423;
}int main(void)
{// initialize the deviceSYSTEM_Initialize();timerStruct_t periodic_timer = {periodic_handler, NULL};timeout_create(&periodic_timer, 0xF423);while (1){timeout_callNextCallback();main_app();}return 1;
}

檢測邏輯

當手指遮擋時,光照減小,前后兩次讀數的差值為負數,反之為正數。因此,設置一個合適的閾值 LIGHT_TRIGGER_THRES,用于判斷是否發生了這兩種變化,同時也可以過濾掉讀數不穩定的影響。該值需要根據實際環境進行調整。

#define LIGHT_TRIGGER_THRES     (50)

系統分為三個狀態,用全局變量 appState 記錄。同時,需要幾個參數記錄傳感器的數值以及手指數目。

typedef enum {APP_STATE_IDLE,APP_STATE_DETECTED_NEGA,APP_STATE_DETECTED_POS
} appStates_e;static appStates_e appState = APP_STATE_IDLE;
static uint16_t light1 = 0;
static uint16_t light2 = 0;
static float light_prev1 = 0.;
static int count = 0;

反復讀取光照傳感器數據,讀取最近的兩次數據取平均值作為此次測量的結果,并與上次讀數作差。根據該差值進行狀態跳轉:

  1. 處于 APP_STATE_IDLE 時,當差值 delta 小于負閾值 LIGHT_TRIGGER_THRES 時,進入 APP_STATE_DETECTED_NEGA,此時檢測到有手指遮擋,光照降低。其余情況下,均不會有手指遮擋,狀態不轉移。
  2. 處于 APP_STATE_DETECTED_NEGA 時,當 delta 大于正閾值 LIGHT_TRIGGER_THRES 時,進入 APP_STATE_DETECTED_POS,此時說明手指移開了,計數+1。其余情況下,手指還未完全經過傳感器,因此差值不夠大(可以過濾毛刺情況)或者為負,狀態均不轉移。
  3. 處于 APP_STATE_DETECTED_POS 時,當 delta 又一次小于負閾值 LIGHT_TRIGGER_THRES 時,進入 APP_STATE_DETECTED_NEGA,此時又有手指遮擋。其余情況下,說明光照無較大變化或者光照變強,這說明沒有手指遮擋或手指逐漸遠離,狀態均不跳轉。
  4. 測量周期為1s,定時器超時后,將打印出計數結果 count 并清零,同時狀態轉移至 APP_STATE_IDLE,進行下一次測量。
void main_app(void)
{float delta;float light;light1 = get_light_sensor();light2 = get_light_sensor();light = (light1 + light2) / 2;delta = light - light_prev1;light_prev1 = light;switch(appState) {case APP_STATE_IDLE:{if (delta < -LIGHT_TRIGGER_THRES) {appState = APP_STATE_DETECTED_NEGA;}break;}case APP_STATE_DETECTED_NEGA:{if (delta > LIGHT_TRIGGER_THRES) {count++;appState = APP_STATE_DETECTED_POS;}break;}case APP_STATE_DETECTED_POS:{if (delta < -LIGHT_TRIGGER_THRES) {appState = APP_STATE_DETECTED_NEGA;}break;}}
}

功能展示

下載程序后將板卡平放,注意需要保證環境光照較強,需要根據實際情況調整閾值 LIGHT_TRIGGER_THRES。本測試在室內,并用手機手電筒照射光照傳感器的環境下進行。測試需要揮動手指,結果輸出有延遲,測試效果參見視頻更直觀。

揮動兩根手指測試結果
揮動三根手指測試結果
👉 詳細展示參見:B站:基于EV54Y39A PIC-IOT WA的手指數量檢測功能開發

項目總結

本次項目通過光照傳感器、定時器與狀態機,可在一定場景下準確識別揮動的手指數量,可以根據實際場景調整參數,以達到最佳效果。MPLAB IDE 一言難盡,打開 MCC 沒個半天是不可能的,這個板卡的有些配置還有坑,例如,編譯器需要選擇 v1.50 而不能是最新版的。

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

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

相關文章

Flutter基礎 -- Dart 語言 -- 注釋函數表達式

目錄 1. 注釋 1.1 單行注釋 1.2 多行注釋 1.3 文檔注釋 2. 函數 2.1 定義 2.2 可選參數 2.3 可選參數 默認值 2.4 命名參數 默認值 2.5 函數內定義 2.6 Funcation 返回函數對象 2.7 匿名函數 2.8 作用域 3. 操作符 3.1 操作符表 3.2 算術操作符 3.3 相等相關的…

上海亞商投顧:滬指沖高回落 兩市成交金額僅剩7000億

上海亞商投顧前言&#xff1a;無懼大盤漲跌&#xff0c;解密龍虎榜資金&#xff0c;跟蹤一線游資和機構資金動向&#xff0c;識別短期熱點和強勢個股。 一.市場情緒 三大指數昨日沖高回落&#xff0c;午后一度集體翻綠&#xff0c;臨近尾盤小幅回升。光伏產業鏈再度走強&#…

aws 在ecs外部實例上運行gpu負載

參考資料 https://docs.amazonaws.cn/zh_cn/AmazonECS/latest/developerguide/ecs-gpu.htmlhttps://docs.amazonaws.cn/AWSEC2/latest/UserGuide/accelerated-computing-instances.html#gpu-instanceshttps://docs.amazonaws.cn/AWSEC2/latest/UserGuide/install-nvidia-drive…

LeetCode 63.不同路徑Ⅱ

思路&#xff1a; 在有障礙物的地方增加一個判斷即可 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int dp[105][105];int mobstacleGrid.size();int nobstacleGrid[0].size();for(int i0;i<m;i){for(int j0…

K8s集群之 存儲卷 PV PVC

目錄 默寫 1 如何將pod創建在指定的Node節點上 2 污點的種類(在node上設置) 一 掛載存儲??????? 1 emptyDir存儲卷 2 hostPath存儲卷 ①在 node01 節點上創建掛載目錄 ② 在 node02 節點上創建掛載目錄 ③ 創建 Pod 資源 ④ 在master上檢測一下&#xff1a;…

C++ vector 模擬實現

vector的底層也是一個動態數組&#xff0c;他與 string 的區別就是&#xff0c;string 是專門用來存儲字符類數據的&#xff0c;為了兼容C語言&#xff0c;使用C語言的接口&#xff0c;在string的動態數組內都會都開一塊空間用來存 \0 &#xff0c;而vector則不會。 首先我們要…

【Linux多線程】認識多線程創建線程

文章目錄 什么是多線程為什么稱linux下的線程是輕量級進程呢&#xff1f; 線程的優點線程的缺點線程異常線程和進程創建線程1.pthread_create2.pthread_self 什么是多線程 進程是正在運行的程序的實例&#xff0c;而線程&#xff08;thread&#xff09;是進程中的一個執行路線…

python 刪除pdf 空白頁

環境 python 3.10 PyPDF2 3.0.1 安裝 pip install PyPDF2流程 將空白頁和內容頁讀取出來&#xff0c;看看內部結構有什么不同以此為依據&#xff0c;遍歷整個PDF 文件&#xff0c;標記處有內容的頁面&#xff0c;寫入到另外一個PDF文件。 python 代碼 # 每一個頁都是一個…

Springboot郵件發送配置

Springboot郵件發送配置 pom.xml依賴&#xff1a; <dependency><groupId>org.eclipse.angus</groupId><artifactId>jakarta.mail</artifactId><version>2.0.3</version> </dependency> <dependency><groupId>or…

跨域的解決方案

1. 計算機更改跨域 1.C盤->Windows->System32->drivers->etc 2.修改hosts 文件2. Chrome瀏覽器的跨域設置 操作步驟&#xff1a;1.打開我的電腦——C盤 新建一個文件夾&#xff0c;命名為MyChromeDevUserData2.右鍵——Chrome——快捷方式——目標&#xff0c;在…

ChatGPT成知名度最高生成式AI產品,使用頻率卻不高

5月29日&#xff0c;牛津大學、路透社新聞研究所聯合發布了一份生成式AI&#xff08;AIGC&#xff09;調查報告。 在今年3月28日—4月30日對美國、英國、法國、日本、丹麥和阿根廷的大約12,217人進行了調查&#xff0c;深度調研他們對生成式AI產品的應用情況。 結果顯示&…

ElementUI之el-table標題列中顯示el-tooltip

ElementUI之el-table標題列中顯示el-tooltip 文章目錄 ElementUI之el-table標題列中顯示el-tooltip1. el-table標題列中顯示el-tooltip2. 實現代碼3. 展示效果 1. el-table標題列中顯示el-tooltip 在el-table-column標簽內添加具名插槽v-slot:header 在el-tooltip標簽中使用具…

【幾何】輸入0-360度任意的角度,求上面直線與橢圓相切點的坐標計算公式

?輸入0-360度任意的角度,求上面直線與橢圓相切點的坐標計算公式 使用積分計算 使用到的公式有橢圓公式: x 2 a 2 + y 2 b 2 = 1 \frac{x^2}{a^2}+\frac{y^2}{b^2} = 1 a2x2?+b2y2?=1 平面旋轉公式 X r = cos ? θ ? ( X s ? X O ) ? sin ? θ ? ( Y s ? Y O ) + X …

端午節粽子龍舟主題互動趣味小游戲效果是什么

端午三天樂&#xff0c;無論節日當天還是之前&#xff0c;行業商家都可以自己的品牌為主借勢營銷&#xff0c;趣味活動形式玩法和內容呈現達成多種效果&#xff0c;品牌傳播、公眾號漲粉、線下互動、商品促銷、用戶促活等。 在【雨科】平臺擁有多款端午節互動小游戲類型&#…

網易狼人殺 設置點擊自動發言

我們玩網易狼人殺 剛開始 都會發現 要按住麥克風才能發言 不得不說 相當的麻煩 我們可以點擊如下圖 右上角這個設置的齒輪 新彈出的設置面板上 勾選這個點擊發言 然后 我們只需要 點一下 就可以進入發言狀態 然后 再點一下即可停止發言 會方便非常多

zabbix事件告警監控:如何實現對相同部件觸發器告警及恢復的強關聯

有一定Zabbix使用經驗的小伙伴可能會發現&#xff0c;接收告警事件時&#xff0c;其中可能包含著大量不同的部件名&#xff0c;同一部件的事件在邏輯上具有很強關聯性&#xff0c;理論上應保持一致的告警/恢復狀態&#xff0c;但Zabbix默認并未對它們進行關聯&#xff0c;直接后…

AIGC降重:如何2分鐘降低論文AI率和查重率?推薦使用SpeedAI科研小助手

確保學術論文的獨立性與誠信性&#xff0c;對于學業的成就及學位的獲取至關重要&#xff0c;其中&#xff0c;論文的人工智能查重與降低AIGC相似度扮演著核心角色。 常規的查重手段主要圍繞查重軟件的運用和個體的自行審查&#xff1b;而降重則通常通過語句重組、同義替換、內…

單細胞分析(Signac): PBMC scATAC-seq 基因組區域可視化

引言 在本教學指南中&#xff0c;我們將探討由10x Genomics公司提供的人類外周血單核細胞&#xff08;PBMCs&#xff09;的單細胞ATAC-seq數據集。 加載包 首先加載 Signac、Seurat 和我們將用于分析人類數據的其他一些包。 if (!requireNamespace("EnsDb.Hsapiens.v75&qu…

ModuleNotFoundError: No module named ‘osgeo‘

顯示無osgeo模塊 pip install osgeo顯示失敗 方法&#xff1a; 確保你已經安裝了正確的依賴項&#xff0c;例如GDAL、GEOS和PROJ等。 方法1&#xff1a;pip install gdal 失敗 方法2&#xff1a;官網下載失敗&#xff0c;下載地址&#xff1a;https://www.lfd.uci.edu/~gohl…

在Linux系統中,使用OpenSSL生成私有證書文件,并提取私鑰的步驟如下:

在Linux系統中&#xff0c;使用OpenSSL生成私有證書文件&#xff0c;并提取私鑰的步驟如下&#xff1a; 生成私鑰&#xff08;如果還沒有私鑰的話&#xff09;&#xff1a; openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048 生成自簽名證書&…