M5StickC PlusとSwitchBot ボットでエントランスを自動解錠

Advent Calendar 2022, C++, IoT

この記事は最終更新日から1年以上が経過しています。

この記事はレコチョク Advent Calendar 2022の1日目の記事となります。

株式会社レコチョクでAndroidアプリ開発をしている木村です。
普段は音楽に関するサービス開発を行なっていますが、今回は簡単な音解析でちょっとしたライフハックをしてみたのでまとめてみました。

背景

  • 自分が住んでいるマンションではエントランスで鍵を使ってオートロックを解錠する必要がある
  • 毎回物理鍵を鞄から取り出すのがめんどくさいので楽して解錠したい

解決方法

今回は3つのIoTデバイスを使ってこの問題を解決してみようと思います

1. M5StickC Plus

さまざまなセンサーが内蔵されたIoTツールキットです。
今回はWiFiとマイクを中心に利用します。

2. SwitchBot ボット

switchbotbotsuto-switchbot-howaito-1ge-985390 小.jpeg

SwitchBot社で開発しているスマートスイッチロボットです。
APIが公開されているので簡単に外部から操作できます。

今回は宅内のインターフォンの解錠ボタンを押すために利用します。
こんな感じで設置してみました。

3. SwitchBot ハブミニ

100000001005830801_10204_003 小.jpeg

SwitchBot ボットを外部ネットワークから操作する際に必要な中継機として利用します。
ボットとはBluetooth接続します。

目指す姿

今回は以下の流れで自動解錠する仕組みを実装していきます。

  1. 部屋番号を入力して自宅のインターフォンを呼び出す
  2. M5StickC Plusでインターフォン呼び出しを検出する
  3. SwitchBot APIを使ってボットを動かす
  4. エントランスが解錠される

open_entrance.drawio (2).png

前提

今回はあまり慣れていない作業が中心だったので実装方法に拙い部分があるかと思いますが温かい目でみていただけると嬉しいです。

  • M5StickC Plus初心者
    • 今回のためにデバイスを購入
    • Arduino IDEを触るのは初めて
  • C++初心者
    • ふんわり触ったことがある程度

作業環境

  • Macbook Pro 14-inch 2021
    • チップセット : M1 Pro
    • メモリ : 32GB
  • Arduino IDE 2.0.1

環境構築

まずはArduino IDEの環境構築です。
基本的には以下の記事を参考にして進めていきました。

https://zenn.dev/kenken82/articles/d8537fde03e90e

途中いくつかはまったポイントがあったのでその部分だけ解説します。

Arduino IDEでM5StickC Plusを認識しない

IDEの環境が整った後に端末を接続してもIDE上で認識されませんでした。
以下のサイトからUSBドライバーをダウンロードして解決しました。

https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads

ビルド時にPythonのコマンド実行エラー

ビルド時にエラーが発生しました。

以下の記事を参考にしてIDEが参照している python コマンドの設定を python3 に変更することで解決しました

https://zenn.dev/takiser/articles/ff009862ddf74d#python3%E3%82%92%E4%BD%BF%E3%81%86%E3%82%88%E3%81%86%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B

HelloWorldがちゃんと表示されない

デバイスを認識してビルドができるようになったのでHelloWorldのサンプルプロジェクトをビルドしたところ、ちゃんとインストールできているっぽいのに画面にちゃんと文字が表示されませんでした。
IDEにインストールしたライブラリが M5StickC Plusではなく、 M5StickCのものを参照していたことが原因でした。
M5StickCに比べ M5StickC Plusの方がディスプレイサイズが大きくなっていたため、描画時のサイズ指定部分で影響が出ていたようです。

Arduino IDEのボードマネージャーURLの設定を以下のように変え、 include Libraryから M5StickC Plusを選択したことで解決しました。

画面に文字を表示する

ビルドできるようになったのでまずはじめの一歩ということでディスプレイに文字の出力を試してみました。

とっても簡単に出力できました。
文字サイズや描画位置は調整できます。

ボタン押下を検出する

デバッグをするのに本体のボタンを使えると楽なので試してみました。

本体のリセットも簡単に実装できます。

Wi-Fiに接続する

Wi-Fiアクセスポイント名とパスワードを指定するだけでM5StickC Plusから簡単にWi-Fiへ接続することができます

実際に動かしてみました。一瞬でWi-Fiにつながります。

https://www.youtube.com/embed/RlQx1yAE4iU

SwitchBot APIをコールする

次にネットワーク経由でSwitchBotボットを操作していきます。

ボットのDeviceIDを調べる

ボットを操作するにはDeviceIDが必要となります。

SwitchBot APIのリクエストをこなうためにAPIトークンを取得します。
こちらの記事を参考にしました。

https://dev.classmethod.jp/articles/switchbot-control-by-api/

curlでDevices APIを叩きます。

以下のようなレスポンスが返って来れば成功です。

スクリーンショット 2022-11-16 3.27.15.png

deviceTypeBotになっているデバイスの deviceIdを覚えておきます

ボットにコマンドを送る

 先ほど取得した deviceIdを指定してcurlでCommand APIを叩きます。
ボットの押下コマンドは pressを指定する必要があります。

以下のようなレスポンスが返って来れば実際にボットが動作するはずです。

スクリーンショット 2022-11-16 3.44.40.png

M5StickC PlusからAPIリクエストを行う

実際にM5StickC Plusするために以下のような実装を行いました。

前述したボタン押下のイベントからAPIリクエストのメソッドを呼ぶことで簡単に確認できました。

マイクで環境音を取得する

次はマイクを使って周りの音を拾っていきます。
前処理としてi2sの初期化を行います。

続いてマイクの信号を読み取ります。

せっかくディスプレイがあるので取得したマイクの信号データを画面常に波形で表示します

音を拾うとこんな感じで表示されるようになります

PXL_20221115_191041562.jpg

チャイム音を検出する

実際にチャイムがなった事を検出するために今回は以下のアプローチを行いました

  • FFT(高速フーリエ変換)を利用してマイクの音データを分析する
  • チャイム音を録音してみて特徴のある周波数帯を調べる
  • チャイム音の周波数帯で一定以上の音量を一定期間検出できたらチャイムとして判定する
  • チャイムがなってから解錠するまでの速度を重視して検出の精度は低めに設定する

先ほど取得した音の信号を周波数帯毎に分解するためにFFTを行います。

チャイム音のデータにFFTをかけ、一定以上の音量が出る周波数帯をログ出力してみました

上記ログ出力結果より下記周波数帯に特徴があることがわかりました

  • 625.00Hz
  • 781.25Hz

そのため、これらの周波数帯で一定時間、一定以上の音量を検出したらチャイムとして検出するとし、
チャイムが検出されたらSwitchBot APIをリクエストする処理を実装しました

完成

以上の実装で目的としていたエントランスの自動解錠を実現できました!

https://www.youtube.com/embed/YlbwYKmUt7c

ここで無事終わり。としたかったのですが大きな問題があります。

勘の良い方なら既にお気づきかと思いますが、今回実装した仕組みをそのまま運用すると特定の部屋番号を入力するだけで誰でもマンションのエントランスを突破できるようになります😂

今回はマンションのセキュリティホールを作りました! とは言いたくないですし、管理会社に訴えられるのは嫌なのでこのまま運用するのは見送ります😇

脱セキュリティーホールするためにはこの仕組みを外部から一時的に有効化する手段を実装する必要がありそうです。
ただ、当初やりたいことは実現できたので一旦今回はここで終わりにしたいと思います。

今回実装したソースコードはGitHubにもあげているのでよかったらみてみてください

https://github.com/misoca12/AutoEntranceOpener/blob/master/AutoEntranceOpener.ino

参考

Aruduino IDE環境構築関連

https://zenn.dev/kenken82/articles/d8537fde03e90e

https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads

https://zenn.dev/takiser/articles/ff009862ddf74d#python3%E3%82%92%E4%BD%BF%E3%81%86%E3%82%88%E3%81%86%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B

SwitchBot API関連

https://github.com/OpenWonderLabs/SwitchBotAPI/blob/main/README-v1.0.md

https://dev.classmethod.jp/articles/switchbot-control-by-api/

音解析関連

https://ambidata.io/samples/m5stack/sound/

https://homemadegarbage.com/m5stickc02

https://pages.switch-science.com/letsiot/vibration/


最後まで読んでいただきありがとうございました。
明日のレコチョク Advent Calendar 2022は2日目 【Unity2d】半日でオンライン格闘ゲーム(超簡易版)を作ってみた となります。お楽しみに!