【電子工作】加速度センサーで鍵の施錠状態をモニターする
はじめに
私の大学では、サークル室の鍵の施錠状態は部室まで行くor庶務課の出納帳を見に行くことでしか確認できない。そのため授業終わりに直接部室へ行ったり、帰り際に誰かいたら寄ろうかな?というときに気軽に確認することができず不便に感じていた。
そこで今回製作したのが、センサーと連動するWebアプリでモニタリングシステムである。本記事では、マイコンでの加速度センサーの使い方に絞って解説する。
Webアプリと連動させるために、Firebase Realtime Databaseを使用している。本記事では割愛しているが、こちらの記事で解説しているので気になる方はぜひ。
dbの状態をリアルタイム表示するWebアプリは仕様を投げてほぼAIにコーディングしてもらったので特に解説できることはあまりない…。
材料
使用機材(開発環境)
- MacBook Air M4(Sequoia15.5)
- Arduino IDE(v2.3.6)
XIAO ESP32S3 について
小型で高性能なマイコンボード。
ピン配置は以下のようになっており、価格も安くとにかく使いやすい。TypeCポートで接続できるのも嬉しい。

seeed studio より
今回使用するのは加速度センサーの動作電源用の3.3Vピン、センサー出力値の読み取り用のA0ピンの2つ。
3軸加速度センサーモジュール KXR94-2050について
秋月電子で販売されている非常に使い勝手の良いモジュール。

データシートを参考に、各ピンをマイコンと以下のように接続する。
①Vdd - マイコンの3.3Vピンに接続
②Enable - Vddと短絡
③GND - マイコンのGND
④Vmux - どこにも接続しない
⑤Self Test - GNDと短絡
⑥Out X, ⑦Out Y - 今回は使用しない
⑧Out Z - マイコンのADCピンに接続(今回はA0)
Out X,Y,Zピンの出力について
電源電圧Vccの電圧によって1g(地球上では下向きに1gの加速度が生じている)あたりの電圧変化および0g時の出力電圧が異なる。
データシートより、今回は3.3Vでの動作なので1gあたりの出力振幅は660mV、0g時の出力電圧は1.65Vである。
なお、測定レンジは±2gであり、各軸の方向は以下の通りである。

センサー値の読み取りを実装
まず、アナログ入力するピン(A0)を定義する。
#define SENSOR_PIN A0
デジタル機能を使用する場合、ピン番号の接頭辞として「D」を使用する必要がある(例:D4、D5)。逆に、ピンのアナログ機能を使用する場合は、接頭辞として「A」を使用する必要がある。(seeed studio wiki より)
setUp()内にアナログ入力の解像度を指定し、A/D変換で得られた整数値を電圧(V)に換算するためのスケーリング係数ADC_RESを定義する。なおESP32のアナログ入力の測定値は最大で1.1Vである。
analogReadResolution(12);
const float ADC_RES = 1.1 / 4095.0;
次に、loop()内での読み取り処理は以下のように記述する。
int raw = analogRead(SENSOR_PIN);
float voltage = raw * ADC_RES;
これでピンに入力された電圧を取得することができた。
次に、しきい電圧を設定する。この値は実際の環境に合わせてシリアル出力等で適切な設定値を見つけるのがラク。
#define THRESHOLD_VOLTAGE 0.35
最後にセンサーの値を処理する。
if (voltage >= THRESHOLD_VOLTAGE && lastState < 5) lastState++;
if (voltage < THRESHOLD_VOLTAGE && lastState > 0) lastState--;
if (lastState == 5 || lastState == 0) {
currentState = lastState;
if (currentState != preState) {
String msg = (currentState == 5)
? "🔓 解錠されました! OPEN✨"
: "🔒 施錠されました! CLOSE🔐";
// ここでサーバーにデータを送信したり、様々な処理を入れられる
Serial.println(msg);
preState = currentState;
}
}
delay(400);
0.4秒ごとにセンサーの値を取得し、5連続でしきい電圧を跨ぐ観測がされたときに状態変化として処理するようなロジックにした。5回という猶予を設けているのは、ノイズや瞬間的な変動による誤検知を防止するためである。
preStateがもともとの状態、currentStateが現在の状態、lastStateが毎回のセンサー値によってすぐに変化する値となっている。
ミニブレッドボードに配線して、設置
マイコンと加速度センサーをジャンパ線をうまく使いながらミニブレッドボード上にうまく配線する。
こんな感じで設置した。これで問題なく数ヶ月稼働している。

おわりに
いつでもWebアプリで鍵の施錠状態を確認できることで、キャンパスライフがとても便利になった。
現在は光センサーもつけて2部屋の状況をわかりやすく見れるようにしている。

このプロジェクトで使用した全てのコードは以下に掲載している。
マイコンのコード↓ Webアプリ(Next.js)のコード↓
Discussion