加速度センサによる簡易SASチェッカー
呼吸の検出方法
スマホに入っているようなMEMSの加速度センサは小型、低消費電力で高感度のようです。
充分な感度があれば、加速度センサを腹部に装着して呼吸の有無を検出できるはずです。
ですがかなり微小な加速度変化を検出する必要があり、さすがに無理だろうと思いつつ、どの程度の感度があるか知りたくて作ってみました。
衝撃や移動の計測が手軽にできると防犯関連やゲームなどSASチェッカー以外にもいろいろ応用できそうですし。
いつものように秋月電子通商で探して、[129428]3軸加速度センサーモジュール AE-ADXL367を購入しました。
センサ関連の資料も秋月のサイトからダウンロードしました。
充分な感度があれば、加速度センサを腹部に装着して呼吸の有無を検出できるはずです。
ですがかなり微小な加速度変化を検出する必要があり、さすがに無理だろうと思いつつ、どの程度の感度があるか知りたくて作ってみました。
衝撃や移動の計測が手軽にできると防犯関連やゲームなどSASチェッカー以外にもいろいろ応用できそうですし。
いつものように秋月電子通商で探して、[129428]3軸加速度センサーモジュール AE-ADXL367を購入しました。
センサ関連の資料も秋月のサイトからダウンロードしました。
テスト結果
初期のソフトで試したところ、装置を机に置いて20~30cm離れた場所を軽く爪で叩くと検知できました。
しかし呼吸に伴う腹部の動きでは加速度変化が非常に小さくなるようで感度不足でした。
ソフトで単純に加速度変化の検出感度を高めて行くと(変化の検出判定値を小さくしてゆくと)、ノイズなのか心臓の鼓動の影響なのかわかりませんが息を止めていても誤検出しました。
そこでセンサチップの測定モードを変えたり、呼吸以外のノイズを抑制するソフト的な信号処理を追加して感度アップを試みました。
すると覚醒時の腹部装着テストで呼吸を検出できるようになりました。
かなりゆっくりとした浅い呼吸でも検出できます。
MEMSの感度恐るべし!。びっくりです。
以下は試作の記録です。
しかし呼吸に伴う腹部の動きでは加速度変化が非常に小さくなるようで感度不足でした。
ソフトで単純に加速度変化の検出感度を高めて行くと(変化の検出判定値を小さくしてゆくと)、ノイズなのか心臓の鼓動の影響なのかわかりませんが息を止めていても誤検出しました。
そこでセンサチップの測定モードを変えたり、呼吸以外のノイズを抑制するソフト的な信号処理を追加して感度アップを試みました。
すると覚醒時の腹部装着テストで呼吸を検出できるようになりました。
かなりゆっくりとした浅い呼吸でも検出できます。
MEMSの感度恐るべし!。びっくりです。
以下は試作の記録です。
回路
回路は静電容量センサー方式の回路を小修整して作成しました。
加速度センサーとマイコンチップ間インターフェイスはSPIとI2Cが使えますが、接続ピン数が少ないI2を選択しました。
電源ON(電池挿入)で記録を開始し、測定終了後にスイッチと液晶ディスプレイで測定結果を確認できます。
またUSB-Serialインターフェイスで記録データをPCへ転送できます。
14ピンのPIC18325を使ったので必要ピン数削減のため、PICマイコンへのプログラム書き込みとUART(シリアル通信)、圧電ブザー駆動を同一ピンに割りつけています。
そのため、圧電ブザーへの接続の途中に1KΩ抵抗を入れる事が必須になっています。
加速度センサーとマイコンチップ間インターフェイスはSPIとI2Cが使えますが、接続ピン数が少ないI2を選択しました。
電源ON(電池挿入)で記録を開始し、測定終了後にスイッチと液晶ディスプレイで測定結果を確認できます。
またUSB-Serialインターフェイスで記録データをPCへ転送できます。
14ピンのPIC18325を使ったので必要ピン数削減のため、PICマイコンへのプログラム書き込みとUART(シリアル通信)、圧電ブザー駆動を同一ピンに割りつけています。
そのため、圧電ブザーへの接続の途中に1KΩ抵抗を入れる事が必須になっています。
【APNEA_P回路】
回路関連の資料を以下に添付します。
回路図 APNEA_A_circuit.pdf
裏面マスク(ポジ) POS_APNEA_A-B_Cu.pdf
裏面マスク(ネガ) NEG_APNEA_A-B_Cu.pdf
表面部品配置図 APNEA_A-F_Silkscreen.pdf
裏面部品配置図 APNEA_A-B_Silkscreen.pdf
ドリルマップ APNEA_A-PTH-drl_map.pdf
部品表 APNEA_A_Parts.pdf
【APNEA_P基板サイズ】
圧電ブザーはケース裏に瞬間接着剤で貼り付け、2ピンソケットを付けました。
極性は気にする必要はありません。
基板側はピンヘッダの端子裏から配線を引出してその先に1KΩ抵抗(必須)と2ピンヘッダをつけてブザーと接続しています。
加速度センサモジュール基板はメイン基板の裏側にピンヘッダ経由ではんだづけしました。
基板側面と表面
ケース
ケースは3Dプリンタで製作しました。
体に装着するにはケース底面のフランジ部をテープで固定するかゴムひもを使います。
幅2cmのゴムひも用フックも3Dプリントしました。
3Dプリント用データ
ケース(上) APNEA_A_BOX_T.stl
ケース(下) APNEA_A_BOX_B.stl
フック APNEA_A_BOX_F.stl
体に装着するにはケース底面のフランジ部をテープで固定するかゴムひもを使います。
幅2cmのゴムひも用フックも3Dプリントしました。
3Dプリント用データ
ケース(上) APNEA_A_BOX_T.stl
ケース(下) APNEA_A_BOX_B.stl
フック APNEA_A_BOX_F.stl
単4×2本用電池ボックスは両面テープで貼り付け、リード線に2ピンソケットをハンダ付けして基板と接続しました。
ケース上面の8か所の穴にM3タップ加工し、M3なべネジで基板をとりつけ、ケース下面から皿ねじでケース上下を固定しました。
ソフトウェア
PIC16F18325用ソースコード(MPLAB X ide プロジェクトファイル)をZip圧縮したものと
コンパイル済みの書き込み用データを添付します。
APNEA_A.X.zip
APNEA_A.X.production.hex
(プログラム書き込みについては「PICマイコンと開発ツール」のページやWeb情報を参照)
当初、感度が不足していました。
細かい(周波数が高い)振動に敏感なためか、感度を上げるとノイズを誤検出してうまく測定できませんでした。
そこで加速度センサチップの設定をウルトラローノイズモード+センサチップ内蔵ローパスフィルタを一番周波数の低いモードにしました。
(ultralow noise mode, low pass filter ODR=12.5Hz)
さらにPICマイコンにセンサ出力を取り込んでからの後処理としてデジタルフィルタ処理を追加しました。
IIR2次ローパスフィルタでカット周波数1Hzのフィルタ処理サブルーチンをAIに作成してもらいました。
--> main.c内のapply_iir_filter()
浮動小数点処理でPICマイコンのシステムクロックが遅いと間に合わないので16MHzにしています。
なおセンサは3軸の加速度を検出できますが、Z軸(基板に垂直方向)の出力のみを使用しています。
コンパイル済みの書き込み用データを添付します。
APNEA_A.X.zip
APNEA_A.X.production.hex
(プログラム書き込みについては「PICマイコンと開発ツール」のページやWeb情報を参照)
当初、感度が不足していました。
細かい(周波数が高い)振動に敏感なためか、感度を上げるとノイズを誤検出してうまく測定できませんでした。
そこで加速度センサチップの設定をウルトラローノイズモード+センサチップ内蔵ローパスフィルタを一番周波数の低いモードにしました。
(ultralow noise mode, low pass filter ODR=12.5Hz)
さらにPICマイコンにセンサ出力を取り込んでからの後処理としてデジタルフィルタ処理を追加しました。
IIR2次ローパスフィルタでカット周波数1Hzのフィルタ処理サブルーチンをAIに作成してもらいました。
--> main.c内のapply_iir_filter()
浮動小数点処理でPICマイコンのシステムクロックが遅いと間に合わないので16MHzにしています。
なおセンサは3軸の加速度を検出できますが、Z軸(基板に垂直方向)の出力のみを使用しています。
操作方法と機能
電源を入れる(=電池を入れる)と測定が始まります。
電源をいれた時点、またはいずれかのスイッチを押した時点から1分間のみ液晶のバックライトが点灯します。
またその1分間のみ、スイッチを押した瞬間と、呼吸に伴う腹部の動きの加速度変化を検出した時に圧電サウンダからピッという音がでます。
10秒以上の呼吸停止を検出すると呼吸再開時点の時刻と停止秒数を記録します。
記録できる10秒以上停止のデータの数は最大250個です。
また呼吸停止期間の記録できる秒数の最大値は255秒です。
呼吸停止秒数で255秒が記録されている場合、測定が失敗していると判断できます。
スタートボタンを押すと初期化後に測定を開始します。その際もし過去の測定結果があると消去されます。
電源をいれた時点、またはいずれかのスイッチを押した時点から1分間のみ液晶のバックライトが点灯します。
またその1分間のみ、スイッチを押した瞬間と、呼吸に伴う腹部の動きの加速度変化を検出した時に圧電サウンダからピッという音がでます。
10秒以上の呼吸停止を検出すると呼吸再開時点の時刻と停止秒数を記録します。
記録できる10秒以上停止のデータの数は最大250個です。
また呼吸停止期間の記録できる秒数の最大値は255秒です。
呼吸停止秒数で255秒が記録されている場合、測定が失敗していると判断できます。
スタートボタンを押すと初期化後に測定を開始します。その際もし過去の測定結果があると消去されます。
スイッチ操作と機能をまとめた図を添付します。
PCへのデータ転送
測定結果はUSB-Serial変換経由で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との接続には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_A.py
SASチェッカーの測定終了後、MODEスイッチを何回か押してUART Txを表示させます。
SASチェッカーとPCをUSB-Serial変換基板を介して接続します。
PC側でPythonプログラムファイルを置いたフォルダでコマンドウインドウを開き
python APNEA_A.py 出力ファイル名.txt
と入力して待機状態にします。
SASチェッカー側で↑(UP)スイッチ、または↓(DOWN)スイッチを押します。
消費電流等
消費電流は液晶バックライトが点灯している最初の1分間が11.0mA
それ以降の液晶バックライトが消灯して測定しているときが2.41mAでした。
MODEスイッチを押してSLEEP状態にすると0.75mAでした。
SLEEPでの電流値が大き目ですが原因はわかっていません。
静電容量センサー方式のSASチェッカーよりかなり小型になりました。
また微妙なベルト張力の調整も不要なので装着が簡単です。
それ以降の液晶バックライトが消灯して測定しているときが2.41mAでした。
MODEスイッチを押してSLEEP状態にすると0.75mAでした。
SLEEPでの電流値が大き目ですが原因はわかっていません。
静電容量センサー方式のSASチェッカーよりかなり小型になりました。
また微妙なベルト張力の調整も不要なので装着が簡単です。