要製作一個藍牙 HID(Human Interface Device)裝置,要了解其基本原理和必要步驟。HID 裝置是指可以直接與電腦或其他設備進行交談的裝置,例如鍵盤、滑鼠、搖桿等。這些裝置通過藍牙連接,並模擬傳統的輸入設備的行為。
藍牙協議:
藍牙 HID 裝置使用 HID 協議進行通信。HID 協議是藍牙的標準之一,用於傳輸輸入設備的數據,如按下按鈕、滑鼠移動等。
HID report descriptor:
這是一種用於描述 HID 裝置功能的數據結構。它告訴主機如何解讀裝置發送的數據。例如,鍵盤的 HID 描述符包含了按鍵的數值和狀態。
藍牙配對:
在使用藍牙連接之前,裝置需要與主機(如電腦或手機)進行配對。這過程中會進行身份驗證,確保安全連接。
選擇一個支援藍牙的微控制器或開發板。例如,ESP32 或是 Raspberry Pi Pico W。
開發韌體:
實現藍牙配對和連接:
測試和除錯:
我們使用 https://github.com/Heerkog/MicroPythonBLEHID 這個專案來製作藍芽簡報筆。
首先我們先下載這個專案,將 hid_services.py 這個驅動程式放到玩學機 flash 底下的 lib 目錄中,這樣就可以在其他程式裡呼叫這個函式庫。
我們來看看這個函式庫的說明,摘要如下:
系統需求:
這個函式庫讓你可以在 MicroPython 上使用藍牙低功耗(BLE)來實作人機介面裝置(HID),如鍵盤、滑鼠和搖桿。它提供基本的類別和範例程式,讓你可以輕鬆地開始開發自己的 HID 裝置。範例包含鍵盤、滑鼠和搖桿的基本操作。
函式庫有主要五個大分類:
# OK-Presenter -- OK:ESP32 BLE-HID Example
# (C) 2023 WiFiBoy Computing Laboratory Taiwan
#
# upload and rename to main.py to run this at boot time
# please also upload hid_services.py to flash disk before running
#
# get hid_services.py from https://github.com/Heerkog/MicroPythonBLEHID
from hid_services import Keyboard
_key_list = {
1: 0x11, # Button_A: forward
2: 0x13, # Button_B: backward
4: 0x05, # Button_Right: blank screen
8: 0x29, # Button_Left: stop presentation
16: 0x4d, # Button_Down: end last slide
32: 0x4a, # Button_Up: home first slide
64: 0x3e, # Button_MENU: start presentation (F5)
}
class HIDDevice:
def __init__(self):
self.keyboard = Keyboard("OK:ESP32")
self.keyboard.set_state_change_callback(self.keyboard_state_callback)
self.keyboard.start_advertising()
self.keyboard.set_bonding(True)
self.keyboard.set_le_secure(True)
self.keyboard.start()
def keyboard_state_callback(self): return
def keyboard_event_callback(self, bytes): return
def press_key(self, key):
self.keyboard.set_keys(key)
self.keyboard.notify_hid_report()
time.sleep(0.01)
self.keyboard.set_keys(0x00)
self.keyboard.notify_hid_report()
def ok_key(self):
key = wb.getkey()
if key!=0:
if self.keyboard.get_state() is Keyboard.DEVICE_CONNECTED:
self.press_key(_key_list[key])
else: print('not connected')
while wb.getkey()==key: pass
def start(self):
while True:
if self.keyboard.get_state() is Keyboard.DEVICE_IDLE:
self.keyboard.start_advertising()
self.ok_key()
time.sleep(0.1)
if __name__ == "__main__":
okpresenter = HIDDevice()
okpresenter.start()