chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

CircuitPython + Atom S3でTeams会議用 Mute On/Off SWを作る

結論:いろいろあったが、CircuitPythonでTeams会議用のMute On/Off SWを作ることができた。これでMute解除するつもりで退出してしまったり、マウスカーソル探してオロオロすることが減るはず。
外観は以下(Atom S3を利用)

ソースは以下(LEDはデバッグ用) USBライブラリが充実しているCircuitPythonを利用

import time
import digitalio
import board
import usb_hid


print("--------- start ---------")

from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard import Keycode

button = digitalio.DigitalInOut(board.BTN)
button.switch_to_input(pull=digitalio.Pull.UP)

led =  digitalio.DigitalInOut(board.D8)
led.direction = digitalio.Direction.OUTPUT

led_value = False
led.value = led_value

count = 30
print("--------- boot loop ---------")
while True:
        print(f"count down...{count}")
        count -= 1
        if count == 0:
            break
        led.value = led_value
        led_value = not led_value
        time.sleep(0.3)


prev_value = 'pushed'
print("--------- switch to KBD Mode ---------")
print("trans to kbd mode")
keyboard = Keyboard(usb_hid.devices)
print("trans to kbd mode done")
while True:
    if button.value:  # open
       led_value = not led_value
       led.value = led_value
       prev_value = 'open'
    else:             # pushed 
       if prev_value == 'open':
           print("pushed")
           keyboard.press(Keycode.CONTROL, Keycode.SHIFT, Keycode.M) 
           time.sleep(0.1)
           keyboard.release_all()
           led.value = True
       prev_value = 'pushed' 
    time.sleep(0.1)

ポイントとしては、、(1)Windows(10)側の認識が遅いせいか、CircuitPython側で、早々に keyboard = Keyboard(usb_hid.devices) を実行するとデバイスの認識がおかしくなる。だから、time.sleepで10秒待たせている。
(2)TeamsのMute On/Offは、[Ctrl] + [Shift] + [M] なので、これらのキーを一度に押したのと同等になるキーイベントを発生させている。

■追記(2023/8/15)
実際にTeams会議で使ってみた。Teamsアプリの画面がアクティブ(一番上)になっている時は正しく動作するのだが、会議中に内職して別のアプリの画面がアクティブになっている状態でSW操作すると、キー入力イベントが、Teams会議のアプリには届かず、別アプリに飛んでしまう。この結果、何かわけのわからない操作をしている状況に陥る。(∴ 機能としてはかなり不足)