自制鼠標!回報率1000Hz!
這是一個基于STM32制作的鼠標。
鼠標嘛,買一個就好了,為啥費勁做一個?
本人在做數字圖像處理時,接觸過一款adns3080光流傳感器,能夠近距離拍照生成黑白像素圖像。
深入了解后,發現其原理竟然和鼠標使用的傳感器原理一樣!索性就自己嘗試著做了一個鼠標!
且本著要做就做最好的原則,還選擇了當時最流行的鼠標傳感器paw3395,希望能給同樣想DIY鼠標的伙伴提供一些參考意義!
本文主要分享——功能亮點、硬件實現、軟件設計原理、成本說明
功能/亮點
鼠標回報率:實測950Hz,最大1000Hz,市面上場景鼠標回報率在500Hz左右(該數據為項目作者實測數據)
主控:stm32f103c8t6
光電傳感器:原相paw3395
使用HID協議與電腦通訊
目前以實現市面上鼠標所有基本功能,正常鼠標功能:光標移動、左右鍵、中鍵、滾輪、DPI切換,DPI切換時LED閃爍3次
拓展功能:兩個自定義按鍵(已預留接口),本例程未添加
尼龍外殼:基于嘉立創3D打印
電路:基于嘉立創EDA設計,尺寸支持免費打樣
硬件實現
硬件比較簡單,本質就是stm32最小系統板 + PAW3395驅動電路 + 按鍵和滾輪電路+3D外殼的適配。
原理圖
PCB圖
軟件設計原理
總體架構使用類RTOS操作系統 的架構
PAW3395使用spi協議 驅動
使用STM32CbueMX自動生成初始HID協議
自定義HID報文發送函數,聲明一個HID報文發送任務,每1ms更新一次位移數據 并向電腦發送報文
滾輪數據更新的原理?
本章主要解決:滾輪不靈敏or滾輪一直往上/下滾動的問題
在CubeMX中使用TIM2的編碼器模式,默認配置如下:
想理解滾輪數據更新的原理,首先要搞清楚,在HID協議中,滾輪的各項數據:
滾輪數據為0x80時,代表滾輪未移動
0xff,為向上移動一個單位
0x01,為向下移動一個單位
其他數值為向上或向下移動好幾個單位,移動距離太大,我們把握不住,該怎么解決?
我是這么處理的:
只要判斷滾輪移動就以一個單位處理,及0xff或0x01;
其他情況為滾輪未移動,及0x80。
但如果滾了一次后編碼器就會長時間保持一個值造成重復判斷,造成一直向上/下滾的情況,這就引出來一個新問題:什么時候將編碼器的值清零?
很簡單,判斷完就清零,將判斷出來的數值暫存在 wheel_num 中,通過上面剛自定義的報文發送函數 myMouse_update() 每1ms發送給電腦。
每1ms發送給電腦是最佳選擇嗎?
1ms要做的事情太多了,既要spi讀鼠標位移值,又要發送HID報文給電腦,還要判斷滾輪數據,容易時序紊亂。所以最終我測試出每5ms判斷一次,會更合理,也符合實際使用,因此最終代碼如下:
//更新滾輪數據void Mouse_wheel_Updata(void){ if((int16_t)__HAL_TIM_GET_COUNTER(&htim2) > 0)// 返回16位數據,如果需要負值要強制數據類型轉換 wheel_num = 0xFF; else if((int16_t)__HAL_TIM_GET_COUNTER(&htim2) < 0) wheel_num = 0x01; else wheel_num = 0x80; //清除編碼器計數 TIM2->CNT=0; // x表示第幾個定時器,例如TIM8->CNT=0;}
成本說明
鼠標成本:200元以內。
后期可以控制在:50元以內。
開源參考資料:
https://oshwhub.com/lidongze/shu-biao-zhong-ji-ban
評論