hi,大家好。歡迎來到大熊實驗室。上篇文章說了硬體部分,那這篇文章主要講解軟體部分如何實現無線鍵盤。
在上篇文章說我說過了鍵盤轉無線模塊的硬體設計,那這次就來說說軟體部分。ESP32軟體的開發並沒有使用樂鑫原廠的SDK來開發,原因有這麼幾個:
第一:每個晶片都有自己的一套開發環境,我的電腦上安裝的東西實在太多了。正好樂鑫官方對Arduino有了很好的支持。
第二:使用arduino開發的話沒有什麼學習成本,同時有很多通用的庫可以使用,省時省力。
其實關於ESP32作為藍牙HID設備部分,官方的代碼裡面是有相關庫的,只是我們平時沒仔細去看,目錄層級比較深可能不好找,具體層級我貼出來。
那麼,說了這麼多。我們到底要怎麼去實現第一步,將ESP32作為藍牙鍵盤設備呢。其實可以直接用官方的庫,但是有些麻煩,於是為了方便大家使用我其實去基於官方庫封裝了另一個庫。這個庫作用也很鍵盤,屏蔽掉多餘的操作,只留下了這次項目需要的幾個接口。
啟動藍牙HID上報電量信息上報HID報文接收HID報文下發給鍵盤
藍牙部分其實沒有什麼好說的,都是非常固定的東西。主要開始將ch9350報文部分吧。
作為ESP32讀取USB鍵盤信息的中間晶片,說實話CH9350做的並不好,國產晶片真的是有各種各樣的問題(預告一下,下一個版本我會使用CH579F做一個更小的轉換模塊)。首先,CH9350有很多個工作模式,這幾個模式中最終我使用了模式2,這點如果小夥伴們去按照硬體打板的話要注意了。至於各個模式的區別除了模式0/1和其他模式區別很大,剩下的幾個模式沒發現有特別大的區別,這個文檔中也是有描述。
說一下我為什麼選擇模式2,當ch9350工作在模式0/1時,下位機的ch9350不不斷發送請求幀直到上位機相應的停止發送命令。
其實如果我們不對鍵盤進行控制的話,直接發送請求停止上報的數據幀也沒什麼。但是實際上我們是需要控制鍵盤的,比如鍵盤上有大小寫鎖定顯示燈,如果我們不控制鍵盤那麼這個燈你就永遠控制不了。但是,我們的數據是在循環中讀取的,而CH9350的狀態進行切換時會不斷發送請求幀,這就導致了代碼實現上要考慮太多種情況,非常麻煩。關鍵一點是,CH9350本身就不太穩定,所以為了不考慮處理這些問題,我就直接忽略掉狀態0/1了。
究竟是怎麼從CH9350讀取數據的呢?
我利用了ESP32的串口2,因為串口1是用來燒錄用的。
在初始化系統的時候,將藍牙回調傳入。回調作用是當鍵盤大小寫等鎖定時我們的ESP32能夠接收到,當接收到以後我們直接去下發報文給CH9350讓它去控制鍵盤亮鎖定燈,這裡需要注意,CH9350有時候狀態切換很快,有時候狀態切換很慢。
具體下發給CH9350的鍵盤鎖定報文,官方給的PDF文檔我看得雲裡霧裡,但是幸好論壇裡有人問過官方人員得到的回答是:
也就是說下發給CH9350的報文要有11個字節,同時狀態的實際內容要在第8個字節,這也就是我代碼裡為什麼這麼寫的原因
然後我用4層if判斷去讀取真實鍵盤數據並發送,篇幅原因不展開了。直接貼源碼