はじめに
M5StickS3を購入しました。
これはMCUチップと色々な周辺機器を搭載している、配線なしで使える開発ボードです。
試しにSwitchBotを操作するリモコンを作ってみました。
ソースコードは下記リポジトリにあります。
https://github.com/bmountain/switchbot
実装
アプリケーションの概要と嵌まりどころに関するメモを記載します。
開発環境
ESP-IDF v5.3.5を使用しました。
画面の制御に使用したM5Unified v0.2.17がESP-IDF v6.0.1に対応していないため、古いバージョンを選びました。1
制御フロー
シーケンス図を示します。
ボタンを押下すると、ボタンが画面タスクとBLEタスクに押下イベントを通知します。
画面タスクは送信画面を表示し、BLEタスクからの通知を待ちます。
その間BLEタスクはSwitchBotにコマンドを送信し、通知を待ちます。
通知を受信したBLEタスクは画面タスクに成功を通知し、画面タスクは成功画面を表示します。
ボタン
ボタンの押下検出の実装は、ESP-IDFのAPIを使用してハンドラーを登録する方針を取りました。
ポイントはGPIOピンの設定でした。
M5StickS3にはボタンAとボタンBがあります。
ボタンAはGPIO11、ボタンBはGPIO12と接続しており、いずれのピンにもプルアップ抵抗がついています。
このことはM5Unifiedのソースから分かりました。2
例えばボタンAであれば次のようにGPIOを設定します:
const int gpioNum = 11;
gpio_config_t config{
.pin_bit_mask = 1ULL << gpioNum, // GPIO番号を指定
.mode = GPIO_MODE_INPUT, // 入力として使用
.pull_up_en = GPIO_PULLUP_ENABLE, // プルアップ抵抗あり
.pull_down_en = GPIO_PULLDOWN_DISABLE, // プルダウン抵抗なし
.intr_type = GPIO_INTR_NEGEDGE}; // 立下りエッジを検出
gpio_config(&config);
gpio_isr_handler_add(gpioNum, buttonHandler, this); // ハンドラー登録
起動後にこの処理を実行し、ボタン押下時のハンドラーとして、画面タスクとBLEタスクへの通知を登録しています。
なお、M5UnifiedのAPIならもっと簡単にボタン押下を検出できます。
そのかわり、ハンドラーの登録に対応していない3のでポーリングで実装することになります。
BLE
BLEによる通信のポイントは、UUIDとコマンドの設定でした。
コマンドの送信には
- コミュニケーションサービスのUUID
- コマンド送信用のキャラクタリスティックのUUID
- 通知受信用のキャラクタリスティックのUUID
- コマンドとして送信するバイト列
が必要です。
いずれもBot BLE open APIの、"BLE Communication Data Message Basic Format"の欄に記載されています。
UUID・コマンドの具体的な値はソースに記載しています。4
終わりに
初めてのマイコンでした。
小さいのに色々できて面白いです。
