iT邦幫忙

2024 iThome 鐵人賽

DAY 30
1
Python

使用 WiFiBoy Python 玩學機來學物聯網應用 系列 第 30

30. 藍芽簡報器實作

  • 分享至 

  • xImage
  •  

藍芽 HID 裝置

要製作一個藍牙 HID(Human Interface Device)裝置,要了解其基本原理和必要步驟。HID 裝置是指可以直接與電腦或其他設備進行交談的裝置,例如鍵盤、滑鼠、搖桿等。這些裝置通過藍牙連接,並模擬傳統的輸入設備的行為。

  • 基本原理:
  1. 藍牙協議:

    藍牙 HID 裝置使用 HID 協議進行通信。HID 協議是藍牙的標準之一,用於傳輸輸入設備的數據,如按下按鈕、滑鼠移動等。

  2. HID report descriptor:

    這是一種用於描述 HID 裝置功能的數據結構。它告訴主機如何解讀裝置發送的數據。例如,鍵盤的 HID 描述符包含了按鍵的數值和狀態。

  3. 藍牙配對:

    在使用藍牙連接之前,裝置需要與主機(如電腦或手機)進行配對。這過程中會進行身份驗證,確保安全連接。

開發步驟

  1. 選擇硬體

選擇一個支援藍牙的微控制器或開發板。例如,ESP32 或是 Raspberry Pi Pico W。

  1. 開發韌體:

    • 使用支援藍牙 HID 的開發工具和函式庫來編寫韌體。許多微控制器提供了藍牙 HID 的函式庫或範例程式。
    • 設定 HID 報告描述符,定義你的裝置如何模擬輸入。例如要製作一個鍵盤,你需要設定按鍵的 HID 描述符。
  2. 實現藍牙配對和連接:

    • 編寫程式碼處理藍牙配對過程,讓裝置可以與主機進行配對和連接。
    • 使用藍牙模組提供的 API 來管理連接狀態,發送和接收數據。
  3. 測試和除錯:

    • 在實際裝置上進行測試,確保它能夠正確地模擬 HID 裝置的行為。
    • 使用配對設備(如電腦或手機)來測試輸入是否正常。

MicroPython 藍芽 HID 範例程式

我們使用 https://github.com/Heerkog/MicroPythonBLEHID 這個專案來製作藍芽簡報筆。

首先我們先下載這個專案,將 hid_services.py 這個驅動程式放到玩學機 flash 底下的 lib 目錄中,這樣就可以在其他程式裡呼叫這個函式庫。

我們來看看這個函式庫的說明,摘要如下:

系統需求:

  1. 支援藍芽的 ESP32 晶片
  2. 有512 kB 或更多的 SRAM
  3. MicroPython v1.18 以上的版本

這個函式庫讓你可以在 MicroPython 上使用藍牙低功耗(BLE)來實作人機介面裝置(HID),如鍵盤、滑鼠和搖桿。它提供基本的類別和範例程式,讓你可以輕鬆地開始開發自己的 HID 裝置。範例包含鍵盤、滑鼠和搖桿的基本操作。

函式庫有主要五個大分類:

  1. HumanInterfaceDevice:HID 服務類別,負責設置 BLE 和廣播。
  2. Joystick:實作搖桿服務的子類別。
  3. Mouse:實作滑鼠服務的子類別。
  4. Keyboard:實作鍵盤服務的子類別。
  5. Advertiser:從 MicroPython 藍牙範例中繼承,用於內部處理廣播功能。

程式碼

# 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()

手機設定

  1. 開啟藍芽設定頁面

  1. 找到可配對的裝置 OK:ESP32

  1. 開啟要使用的簡報檔案

操作影片

參考資料

  1. 人體學介面裝置 Human interface device,縮寫HID
  2. MicroPython Human Interface Device library

上一篇
29. 自製天氣小時鐘
系列文
使用 WiFiBoy Python 玩學機來學物聯網應用 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言