chakokuのブログ(rev4)

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

M5 Stick C PlusでBLEを動かしてみる

M5 StickCだからどうということはなく、ESP32のBLEを動かすのと等しいのだが、、最後にBLEを使った時は、MicroPythonのBLEライブラリはサブセットのためWindowsとはペアリングできなかったと記憶している。iOSなら大丈夫だったはず。。過去に試作したMIDI-Keyboardのサンプルを再度動かしてみる

import bluetooth
from ble_advertising import advertising_payload

_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)

MIDI_SRV_UUID = bluetooth.UUID('03B80E5A-EDE8-4B33-A751-6CE34EC4C700')
MIDI_CHR_UUID = bluetooth.UUID('7772E5DB-3868-4112-A1A9-F2669D106BF3')

payload = advertising_payload(
    #name="BLE MIDI 0.01",
    #services=[bluetooth.UUID(0x181A)],
    services=[MIDI_SRV_UUID],
)
BLE_MIDI_CHR = (MIDI_CHR_UUID, bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY)
BLE_MIDI_SERVICE = (MIDI_SRV_UUID, (BLE_MIDI_CHR,))
SERVICES = (BLE_MIDI_SERVICE, )

interval_us=500000
    
def bt_irq(event, data):
    # Track connections so we can send notifications.
    if event == _IRQ_CENTRAL_CONNECT:
        conn_handle, _, _ = data
        print("New connection", conn_handle)
    elif event == _IRQ_CENTRAL_DISCONNECT:
        conn_handle, _, _ = data
        print("Disconnected", conn_handle)
        # Start advertising again to allow a new connection.
        bt.gap_advertise(interval_us, adv_data=payload)        
    elif event == _IRQ_GATTS_WRITE:
        conn_handle, value_handle = data

bt = bluetooth.BLE()
bt.irq(bt_irq)
bt.active(1)
((midi,),) = bt.gatts_register_services(SERVICES)
print("start advertise")
bt.gap_advertise(interval_us, adv_data=payload)

print(payload)
#print(decode_name(payload))
#print(decode_services(payload))

iOS側でBLE開発ツール(LightBlue)でBLEを接続した。以下のようにBLE MIDI Keyboardとして認識されている。


このサンプルは、M5 Stick CをBLE MIDI Keyboardとして動かした例なので、これらのService UUID/Characteristic UUIDをMIDI Keyboardとして実装すれば、カメラのシャッターボタンとして使えるはず(音量Up/Downのキー操作でシャッターが押せるとメモがあった)。BLEのシャッターボタン実装のサンプルがGitにあるはずなので、それを参考に実装すれば動くと思われる。

Bluetoothキーボードから音量アップキー「KEY_MEDIA_VOLUME_UP」を送信することで、シャッター操作が行われるらしい
(https://wak-tech.com/archives/1796)

MicroPythonを使ってBLE接続のHIDを実装して、Keyboardの自動入力のサンプルを掲載してれている記事があるので、
この処理を参考に、VOLUME_UPのキーを送信できるようにすればシャッターが切れるはず。

■参考URL
まず見るべきGitHubのソース
micropython/examples/bluetooth at master · micropython/micropython · GitHub

https://gitee.com/walkline/esp32-ble/blob/master/ble/ble_hid.py
https://github.com/Heerkog/MicroPythonBLEHID/blob/master/examples/simple/keyboard_example.py