前回、オールインワンのマイコンボードM5StickC Plus(下図)を使って作り始めた、メッセージボックスを完成させたいと思います。
残りの設計を進めて行きましょう。
さてさて、システム(ハードウェア)としては、もう一つ、箱の開閉を検知するセンサが必要です。
箱の開閉を機械的に検知するのではなく、間接的に周囲の明るさで検知しようと思います。以下の記事でオルゴールを作った時に使ったのと同じ手法です。
「#19-2 オルゴール化328duino」
上の記事と同様、今回も、周囲の明るさを検知するのにCdSセルを使います。CdSセルは、周囲明度によって抵抗値が変化する素子です。こちらの制御方法を復習してみてください。
回路図としては、以下図の様になります(使い回し)。
上図は、オルゴール化328duinoの時に使った回路図の使い回しなので、以下表の様に読み替えてご覧ください。
読み替え: | ATmega328 | → | ESP32 |
Vcc=2.7〜5[V] | → | Vdd=3.3V | |
D15 | → | G25 | |
A0 | → | G36 | |
Rpu=20k〜50k[Ω] | → | Rpu=45kΩ(TYP) |
M5StickC Plusは折角のオールインワンなので、なるべく外付け回路を削減して使いたいと思います。そこで、M5StickC Plusボード上でショートされている、G36/G25端子を使います(下図)。
プルアップ抵抗値Rpuと、CdSセルの抵抗値の分圧がAD変換器から読み出されます。M5StickC PlusのanalogRead()関数の場合、読み出し値は0〜4,095[LSB]の12ビットデータです。以下表のような関係にあります。
箱(蓋)の状態 | 開いた | ⇔ | 閉じた |
周囲明度 | 明るい | ⇔ | 暗い |
CdSセル抵抗値 | 小さい | ⇔ | 大きい |
CdSセル分圧電位 | 低い | ⇔ | 高い |
AD変換器読み出し値 | 小さい | ⇔ | 大きい |
周囲明度の判定で、CdSセルの閾値電圧を決めなくてはなりません。抵抗分圧の相手はESP32の内蔵プルアップ抵抗Rpuなので、個体差があります。即ち、各自が測定して適切な閾値を設定できる必要があります。
const int cds_THSH=2048; // cds: threshold 0~4095 [LSB]
これに対応するため、シリアルモニタから受け付けるデバッグ用のコマンド【cds】に、CdSセルの電圧値をシリアルモニタに表示する機能を持たせてあります。
ソフトウェアの詳細設計に移りましょう。
メッセージボックスの動作としては以下となります。
基本的にはCdSセルで明るさを検知して動く、だけですので、スイッチ操作などのU/Iは必要ありません。ですが、周囲明度によって動作が自動的に切り替わるため、明るい場所で箱内に設置しようとすると、勝手に明るさを検知してメッセージ再生が始まってしまいます。
そこで、メッセージ再生を中断したり、箱内に設置する準備を容易にしたり、等と言ったU/Iを定義しておく必要があります。
メッセージボックスのU/I:
ソフトウェアの動作には、いくつかの状態が必要となるので、次節の通り、ステートマシン(有限状態機械)を形成して制御します。
変数mbx_stateを使って、loop()関数内で状態遷移しながら制御します。
各状態(mbx_state)と、その動作:
上図の様に状態遷移図を描いておくと、理解し易いです。
以下に、完成したプログラム(一式)をリンクしておきます。M5StickC Plus開発環境の立ち上げは、こちらを参照してください。
完成プログラム: | m5cp_message_box.ino |
サンプルMML: | mml_happy_bd.h |
サンプルビットマップ#1: | bmap_happy_bd_1.h |
サンプルビットマップ#2: | bmap_happy_bd_2.h |
すべてのヘッダファイルは、プログラム本体(m5cp_message_box.ino)と同じディレクトリに配置してください。
※コンパイルには、M5cp-PSライブラリが必要となります。リンクを辿ってインストールしておいてください。
コンパイルしてM5StickC Plusに書き込むと、シリアルモニタから以下のコマンドを受け付けています。
シリアルモニタコマンド仕様:
全て、デバッグやプログラム動作調整用のコマンドなので、メッセージボックスとしてはシリアルモニタ無しで自立できます。
今回は、M5StickC Plusに周囲明度を検知するためのCdSセル(下図)を接続してください。
CdSセルには、2本の足が出ています。極性は無いので、2本の足をM5StickC Plus拡張I/OポートのG36/G25端子とGND端子に差し込んでください(下図)。
以下図に実験中の様子を示します。CdSセルが、光を検知したい方向に向く🌻よう、少し曲げてあります。
では、実験を進めてみましょう。
実験サンプル:
メッセージボックスとして動作している様子を動画に収めてありますので、以下、ご参照ください。
M5StickC Plus自体が、メッセージボックスと共に「プレゼント」と、ならない場合は、相手にメッセージを見てもらった後で、「M5StickC Plusは回収しま〜す。ハイ返して返して〜」って事になるのは、ご愛敬です(1^^;)。