気圧センサによる簡易SASチェッカー
呼吸の検出方法
防塵マスクのようなハードマスクで鼻と口を覆って呼吸の吸排気を検出する方法を考えました。
まずはじめに、ハードマスクに吸気弁と排気弁をつけてそこに小さな磁石と磁気センサーまたは反射板とフォトリフレクタ―を付ける方法を検討しました。
しかし小型で確実に動作する機構の製作は難しそうでした。
他に何か良いセンサがないかと探しているうちに気圧センサが使えそうだと気づきました。
高感度の気圧センサであればハードマスク内に取付けるだけで良さそうです。
いつものように秋月電子通商で探して、実装が簡単で高感度な「LPS25HBを使ったDIP化キット」を購入しました。
センサ関連の資料も秋月のサイトからダウンロードしました。
まずはじめに、ハードマスクに吸気弁と排気弁をつけてそこに小さな磁石と磁気センサーまたは反射板とフォトリフレクタ―を付ける方法を検討しました。
しかし小型で確実に動作する機構の製作は難しそうでした。
他に何か良いセンサがないかと探しているうちに気圧センサが使えそうだと気づきました。
高感度の気圧センサであればハードマスク内に取付けるだけで良さそうです。
いつものように秋月電子通商で探して、実装が簡単で高感度な「LPS25HBを使ったDIP化キット」を購入しました。
センサ関連の資料も秋月のサイトからダウンロードしました。
【LPS25HBを使った気圧センサキット】
【LPS25HBキットの回路】
【LPS25HBキットのピン配置】
テスト結果と使用感等
電源ON(電池挿入)から1分間だけ、呼吸にともなう気圧の上昇から下降、または下降から上昇の変化点を検出してLEDが点滅するようにしました。
鏡を見ながらの覚醒時テストでは問題なく動作しました。
次に就寝時テストを3晩行なって起床後に記録データを確認しました。
すると呼吸停止の最大値が255秒(=計測の最大値、死んでる?!)で測定は失敗でした。
無意識にマスクを外したり、ずれたりしたようです。
装着感の改善や呼吸をより楽にする改善は可能ですが、この方式はとりあえず終了にして別方式を試すことにしました。
以下は試作の記録です。
鏡を見ながらの覚醒時テストでは問題なく動作しました。
次に就寝時テストを3晩行なって起床後に記録データを確認しました。
すると呼吸停止の最大値が255秒(=計測の最大値、死んでる?!)で測定は失敗でした。
無意識にマスクを外したり、ずれたりしたようです。
装着感の改善や呼吸をより楽にする改善は可能ですが、この方式はとりあえず終了にして別方式を試すことにしました。
以下は試作の記録です。
回路
電池はコイン電池CR2032、PICマイコンは表面実装型の小型パッケージを選びました。
スイッチや液晶表示も無しにしてマスクに取付しやすいサイズにしました。
低消費電力化のためPICマイコンのクロックは1MHzと低めの設定です。
電池電圧3Vで呼吸測定中の電流は0.69mAでした。
CR2032の電池容量を200mAhとすると200/0.69≒290時間の駆動時間になります。
電源ON(電池挿入)で記録を開始し、測定終了後にUSB-Serialインターフェイスで記録データをPCへ転送します。
回路関連の資料を以下に添付します。
回路図 APNEA_P_circuit.pdf
裏面マスク(ポジ) POS_APNEA_P-B_Cu.pdf
裏面マスク(ネガ) NEG_APNEA_P-B_Cu.pdf
表面部品配置図 APNEA_P-F_Silkscreen.pdf
裏面部品配置図 APNEA_P-B_Silkscreen.pdf
ドリルマップ APNEA_P-PTH-drl_map.pdf
部品表 APNEA_P_Parts.pdf
スイッチや液晶表示も無しにしてマスクに取付しやすいサイズにしました。
低消費電力化のためPICマイコンのクロックは1MHzと低めの設定です。
電池電圧3Vで呼吸測定中の電流は0.69mAでした。
CR2032の電池容量を200mAhとすると200/0.69≒290時間の駆動時間になります。
電源ON(電池挿入)で記録を開始し、測定終了後にUSB-Serialインターフェイスで記録データをPCへ転送します。
回路関連の資料を以下に添付します。
回路図 APNEA_P_circuit.pdf
裏面マスク(ポジ) POS_APNEA_P-B_Cu.pdf
裏面マスク(ネガ) NEG_APNEA_P-B_Cu.pdf
表面部品配置図 APNEA_P-F_Silkscreen.pdf
裏面部品配置図 APNEA_P-B_Silkscreen.pdf
ドリルマップ APNEA_P-PTH-drl_map.pdf
部品表 APNEA_P_Parts.pdf
【APNEA_P回路】
気圧センサーはSPIまたはI2Cのインターフェイスが選択できます。
今回はSPIを使ったので回路図中のR2とR3は実装していません。
基板とセンサキット間の接続ではSDIとSDOがクロス接続(SDI--SDO)になるので注意が必要です。
マスクと基板ケース
ハードマスクと基板ケースは3Dプリンタで製作しました。
ハードマスクの顔に当たる曲線は単純形状のマスクから自分の顔の3Dモデルを引き算して作成しました。
手順は
スマホで顔を多方向から撮影-->無料のフォトグラメトリソフトMeshroomで3Dモデル作成-->Meshmixerで細かい凹凸等を修正-->3Dプリンタ用スライサーでサイズ調整-->Fusion360に読み込んでマスクモデルとの論理演算
3Dプリント用データ
ハードマスク PRESSURE_MASK.stl
基板用スペーサ PRESSURE_MASK_S.stl
配線穴プラグ PRESSURE_MASK_P.stl
基板ケース(上蓋)APNEA_P_BOX_T.stl
組立て手順は以下の通り。
・ハードマスクに基板用スペーサーを接着剤で貼り付けて2か所の穴をM3タップ加工
・10mm長のM3なべねじ2本でハードマスク、基板、基板ケース(上蓋)を固定
・気圧センサに引出し配線と2.54mmピッチ6ピン用ソケットをハンダ付け
・気圧センサを薄手ポリ袋(スーパーでもらえるやつ)を切ってかぶせてグルーガンで封印し湿気対策
・気圧センサの配線とソケットをハードマスクの顎側の細長い引出し穴から出して基板と接続
・配線引出し穴に配線穴プラグをはめ、グルーガンで隙間を埋めて空気漏れを防ぐ ・マスクにゴムひもを取り付ける
・マスクの顔に触れる部分にクッションテープをグルーガンで貼り付け
ハードマスクの顔に当たる曲線は単純形状のマスクから自分の顔の3Dモデルを引き算して作成しました。
手順は
スマホで顔を多方向から撮影-->無料のフォトグラメトリソフトMeshroomで3Dモデル作成-->Meshmixerで細かい凹凸等を修正-->3Dプリンタ用スライサーでサイズ調整-->Fusion360に読み込んでマスクモデルとの論理演算
3Dプリント用データ
ハードマスク PRESSURE_MASK.stl
基板用スペーサ PRESSURE_MASK_S.stl
配線穴プラグ PRESSURE_MASK_P.stl
基板ケース(上蓋)APNEA_P_BOX_T.stl
組立て手順は以下の通り。
・ハードマスクに基板用スペーサーを接着剤で貼り付けて2か所の穴をM3タップ加工
・10mm長のM3なべねじ2本でハードマスク、基板、基板ケース(上蓋)を固定
・気圧センサに引出し配線と2.54mmピッチ6ピン用ソケットをハンダ付け
・気圧センサを薄手ポリ袋(スーパーでもらえるやつ)を切ってかぶせてグルーガンで封印し湿気対策
・気圧センサの配線とソケットをハードマスクの顎側の細長い引出し穴から出して基板と接続
・配線引出し穴に配線穴プラグをはめ、グルーガンで隙間を埋めて空気漏れを防ぐ ・マスクにゴムひもを取り付ける
・マスクの顔に触れる部分にクッションテープをグルーガンで貼り付け
クッションテープは戸当たり音防止用の厚さ3mm、幅10mmを使いましたがもっと厚めで軟らかいものにすべきでした。
就寝時のゆっくりした呼吸でも気圧変化が判定できるように吸排気穴は顎側の直径9mmのみとしました。
覚醒時のテストでは流路抵抗で少し呼吸がしずらいですし、非常にゆっくりとした呼吸では逆に観測に充分な気圧変化が得られない可能性があります。
吸気と排気を分けて大き目の穴+薄いプラ板などのバネ板で吸排気弁を付加すると改善できると思うのですが、今回そこまではやりませんでした。
ソフトウェア
PIC16F1829用ソースコード(MPLAB X ide プロジェクトファイル)をZip圧縮したものと
コンパイル済みの書き込み用データを添付します。
APNEA_P.X.zip
APNEA_P.X.production.hex
(プログラム書き込みについては「PICマイコンと開発ツール」のページやWeb情報を参照)
コンパイル済みの書き込み用データを添付します。
APNEA_P.X.zip
APNEA_P.X.production.hex
(プログラム書き込みについては「PICマイコンと開発ツール」のページやWeb情報を参照)
測定方法と機能
電源を入れる(=電池を入れる)と測定が始まります。
電源を入れた時点から10分間のみ呼吸を検出した瞬間にLEDが点滅します。
10秒以上呼吸が停止した場合、停止秒数と呼吸を再開した時刻を記録します。
記録件数は300件まで、停止秒数は255秒以上は255秒と記録されます。
データ転送手順は以下の通り。
下記のpythonプログラムをダウンロード(右クリックでリンク先を保存)してPCの作業フォルダに置きます。
APNEA_P.py
SASチェッカーとPCをUSB-Serial変換基板を介して接続します。
PC側でPythonプログラムファイルを置いたフォルダでコマンドウインドウを開き
python APNEA_P.
で起動します。
すると以下の1文字コマンドリストが表示されます。
s : stop measurement
w : write result to file
r : run (itialization and measurement start)
k : read and set sensitivity
p : continuous display of pressure readings
m : continuous display of breath-holding period
v : read battery voltage
[Enter]: end mesurement or end program
電源を入れた時点から10分間のみ呼吸を検出した瞬間にLEDが点滅します。
10秒以上呼吸が停止した場合、停止秒数と呼吸を再開した時刻を記録します。
記録件数は300件まで、停止秒数は255秒以上は255秒と記録されます。
PC間通信と機能
測定結果はUSB-Serial変換インターフェースでPCへ転送できます。
またPCからの操作で検出テストや電池電圧確認、感度変更等ができます。
PCとの接続にはUSB-Serialの変換基板とUSBケーブル、UART接続用コネクタ付き配線を使います。
USB-Serial変換基板は信号レベルが3.3Vのもの、または5V/3.3Vが切り替えられるものを3.3Vの設定で使います。
私はFT232RQ USBシリアル変換モジュールキット(秋月電子通商注文番号109951)を使用しDIPスイッチ切替で3.3Vの設定にして使っています。
FT234X 超小型USBシリアル変換モジュール (秋月電子通商注文番号 108461)なら信号レベルが3.3Vでそのまま使えます。
変換基板とSASチェッカー間は両端に2.54mmピッチソケットを付けた3線コードを作って接続します。
接続時の注意として変換基板側のTx端子はSASチェッカー側のRx端子へ、変換基板側のRx端子はSASチェッカー側のTx端子へ接続します。
またPCからの操作で検出テストや電池電圧確認、感度変更等ができます。
PCとの接続にはUSB-Serialの変換基板とUSBケーブル、UART接続用コネクタ付き配線を使います。
USB-Serial変換基板は信号レベルが3.3Vのもの、または5V/3.3Vが切り替えられるものを3.3Vの設定で使います。
私はFT232RQ USBシリアル変換モジュールキット(秋月電子通商注文番号109951)を使用しDIPスイッチ切替で3.3Vの設定にして使っています。
FT234X 超小型USBシリアル変換モジュール (秋月電子通商注文番号 108461)なら信号レベルが3.3Vでそのまま使えます。
変換基板とSASチェッカー間は両端に2.54mmピッチソケットを付けた3線コードを作って接続します。
接続時の注意として変換基板側のTx端子はSASチェッカー側のRx端子へ、変換基板側のRx端子はSASチェッカー側のTx端子へ接続します。
データ転送手順は以下の通り。
下記のpythonプログラムをダウンロード(右クリックでリンク先を保存)してPCの作業フォルダに置きます。
APNEA_P.py
SASチェッカーとPCをUSB-Serial変換基板を介して接続します。
PC側でPythonプログラムファイルを置いたフォルダでコマンドウインドウを開き
python APNEA_P.
で起動します。
すると以下の1文字コマンドリストが表示されます。
s : stop measurement
w : write result to file
r : run (itialization and measurement start)
k : read and set sensitivity
p : continuous display of pressure readings
m : continuous display of breath-holding period
v : read battery voltage
[Enter]: end mesurement or end program
s[改行]と打つと測定が停止し、結果がコマンドウィンドウに表示されます。
w[改行]と打つと出力ファイル名を効いてくるのでファイル名(*.txtまたは*.csv)を入力すると測定結果がそのファイルに出力されます。
r[改行]と打つと測定結果が消去されて測定を開始します。
k[改行]で感度の確認または変更ができます。
数値を入力すると感度変更でき、改行のみだと変更なしで値の確認ができます。
感度は1~255で指定でき、気圧の増減反転を検出するのに感度の8倍の値をしきい値としています。
ですので小さい値ほど小さい気圧変化で呼吸ありと判定しますが小さすぎると誤検出が増えます。
p[改行]で0.5秒ごとに気圧の測定値を表示し、改行で表示が止まります。
m[改行]で呼吸停止秒数(気圧変化なしの期間)を表示し、改行で表示が止まります。
v[改行]で電池電圧を表示します。
pythonプログラムを終了するには改行します。
w[改行]と打つと出力ファイル名を効いてくるのでファイル名(*.txtまたは*.csv)を入力すると測定結果がそのファイルに出力されます。
r[改行]と打つと測定結果が消去されて測定を開始します。
k[改行]で感度の確認または変更ができます。
数値を入力すると感度変更でき、改行のみだと変更なしで値の確認ができます。
感度は1~255で指定でき、気圧の増減反転を検出するのに感度の8倍の値をしきい値としています。
ですので小さい値ほど小さい気圧変化で呼吸ありと判定しますが小さすぎると誤検出が増えます。
p[改行]で0.5秒ごとに気圧の測定値を表示し、改行で表示が止まります。
m[改行]で呼吸停止秒数(気圧変化なしの期間)を表示し、改行で表示が止まります。
v[改行]で電池電圧を表示します。
pythonプログラムを終了するには改行します。