やりたいこと
BLEデバイスでPowerPointのスライドショーを操作したい。OSはWindows限定でよい。単に操作するだけならBLE HIDデバイスでキー入力(F5, ESC, ←, →など)を送ればよいが、同時にスライドショーの状態(実行中か、総スライド数、現在のスライド番号、ノートテキストなど) を取得したい。
背景
WiFi経由でPowerPointのスライドショーを操作する方法については以前に実証ずみ。
しかし、プレゼン会場はたいていの場合アウェイであり、会場のWiFiに依存する方法には不安がある。これを回避するためにテザリングをするのも不便である。かといって、デバイスをWiFiのアクセスポイントにする方法では、PCをデバイスに接続している間はインターネットに接続できなくなってしまう。そこで今回は、BLEデバイスでPowerPointのスライドショーを操作する方法を検討する。
1. PC側 (Python)
ライブラリのインストール
pip install bleak pip install pywin32
bleak と pythoncom の相性問題
bleak と pythoncom は相性が悪く、以下のようなエラーが発生する。
Connection Error: Thread is configured for Windows GUI but callbacks are not working. Suspect unwanted side effects from importing 'pythoncom'.
これを回避するためには、bleak を import する前に下記を実行する。
import sys sys.coinit_flags = 0 # MTA (Multi Threaded Apartment) モードに設定
設計
- BLEの接続待ち、Notifyコールバック、Writeなどはメインスレッドで非同期で実行する。
- PowerPointのCOM操作は、別のスレッドで実行する。
- 両者のやりとりはキューを介しておこなう。
- BLEデバイスへの接続はMACアドレス決め打ちでよしとする。
コード
2. BLEデバイス側
使用するデバイスと開発環境
- デバイス : XIAO nRF52840
- 開発環境 : PlatformIO / Arduinoフレームワーク
- デバイス指定 : seeed-xiao-mbed-nrf52840 (※seeed-xiao-afruitnrf52-nrf52840でないことに注意)
- 依存ライブラリ : ArduinoBLE
- platformio.ini は下記の通り
[env:seeed-xiao-mbed-nrf52840]
platform = https://github.com/Seeed-Studio/platform-seeedboards.git
board = seeed-xiao-mbed-nrf52840
framework = arduino
lib_deps =
arduino-libraries/ArduinoBLE@^1.4.1