こちらの記事について、内容・翻訳・視点・長さなど、皆様のご意見をお送りください。今後の記事製作の参考にしたいと思います。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
こちらの記事の感想をお聞かせください。
1. 開発背景
昨今、新型コロナウイルス感染拡大の防止として、リモートワークやオンライン授業が推進され、自宅で過ごす時間が多くなりました。これにより、通勤・通学が不要になり、自由な時間が増える一方で、プライベートな時間と仕事や学習の時間のメリハリをつけることが難しいという問題があります。特に、朝なかなかベッドから出られなかったり、活動時間中に昼寝をしてしまったりすると、大きなタイムロスになってしまいます。
そこで、我々はベッドでの睡眠を邪魔して作業に専念させるためのIoTシステムを作成しました。焦電型赤外線センサによってベッドにいる人を感知し、指定した時間内であればアラームを鳴らしてベッドからの脱出を促します。
2. システム概要
本システム「Dont' use bed」は、システムが作動する時間を設定するAndroidアプリと、焦電型赤外線センサとスピーカーを接続したRaspberry Piによって構成されます。
図の濃い青色の矢印は一度だけ実行される処理、黄色の矢印は定期的に行われる処理、薄い青色はRaspberry Piに接続される機器の処理を示しています。
システムの流れとしては、まずスマホアプリで作業に集中する時間を設定してRaspberry Piに送信します。Raspbery Pi側は、設定した時間になると焦電型赤外線センサを用いてベッドの監視を始めます。センサが人を検知した場合、その時間だけスピーカーを鳴らします。
また、Androidアプリでは定期的にテキストファイルを介してシステムが稼働しているかどうかを確認します。時間設定後にアプリを再起動しても状態を維持するために、ファイルから設定時間の確認も行います。
3. 実装
3.1 Androidアプリ
アプリを起動すると、以下の図の左側のような画面が表示されます。
まず開始時刻という一番上のボタンを押すと図の中央に示した時刻を設定するためのコンポーネントが表示され、これを用いてシステムの開始時刻を設定します。同様に真ん中のボタンを押すと、終了時刻を設定することができます。最後に一番下の送信というボタンを押すことで設定した時間をラズパイに送信できます。
設定の送信については、ボタンが押された時にラズパイのPHPファイルに開始時刻、終了時刻を引数としてHTTPアクセスを行うことで実現しています。
また、アプリでは10秒ごとに現在稼働しているプロセス数を取得できるURLにアクセスし、その値を元にプロセスが起動しているかどうかを確認しています。
アクセスしたときにプロセスが既に稼働していた場合、新たにプロセスが実行されることを防ぐために3つのボタンをロックします。アクセスしたときにプロセスが終了していた場合はボタンのロックを解除します。
3.2 Raspberry Pi
AndroidアプリからRaspberry Piへのリクエストは、Apache webサーバー上のPHPスクリプトで処理します。
(a) 設定時刻の送信リクエスト、 (b) 設定済み時刻の取得リクエスト、 (c) 稼働状況の取得リクエストの3種類それぞれに対し、URLを用意します。このうち (a) のURLへアクセスされた場合、GETパラメータで受け取った設定時刻をテキストファイルへ保存してから、人を検知するPythonスクリプト(後述)を起動します。 (b) のURLにアクセスされたときはテキストファイルの内容を返し、(c) のURLではPythonスクリプトの起動数を ps aux コマンドで調べ、返します。
人の検知を行うPythonスクリプトは、起動され設定時刻になるとRaspberry Pi の “GPIO4” 端子に繋がれた焦電型赤外線センサモジュール (SE-10) の出力に応じて、アラームをスピーカーから鳴らしたり止めたりします。回路は次の図に示すようになっており、GPIO4への入力は人を検知しているときにLOW、それ以外のときにHIGHになるようになっています。
以下の設置風景の写真のように、センサモジュールはベッドの方を向くように取り付けます。これにより、ベッドに人がいるかどうかを検知することができます。実際には、検知範囲内に人がいてもセンサの出力 (LOW/HIGH) は非常に短い間隔で切り替わることがあります。このとき、センサの出力とアラームを完全に同期させると、アラームも短い間隔で鳴ったり鳴り止んだりするようになってしまいます。これを避けるため、一度アラームが鳴り始めたら、数秒間その状態を維持するようにしています。