静電容量センサによる簡易SASチェッカー
呼吸の検出方法
睡眠時無呼吸症候群の簡易チェックのために呼吸の有無を検出する方法を考えたとき、一番最初に思い浮かんだのは静電容量センサを使う方法でした。
おなかと背中に広めの電極を貼り付けてコンデンサを形成し、その静電容量を測定すれば呼吸に伴う電極間の距離変化を検出できるだろうと考えました。
平行平板コンデンサの容量は距離に反比例するので、たとえば体の厚みを20cm、呼吸に伴う変動幅を1cmとすれば5%程度の変化で容易に観測できそうです。
そこで3Dプリントした150*200*2mmの枠に網目が細かくて軟らかいステンレス網を貼り付けてテストしました。
すると呼吸に伴い確かに静電容量は変化するのですが、驚いたことに予想とは逆の変化になりました。
息を吸って電極間距離が離れたときの方が静電容量が増えたのです。
また電極を肌の上に直に装着した場合と肌着の上から装着した場合でそれぞれ1.5nFと0.14nF程度と大きな違いがありました。(デジタルテスターで計測)
おなかと背中に広めの電極を貼り付けてコンデンサを形成し、その静電容量を測定すれば呼吸に伴う電極間の距離変化を検出できるだろうと考えました。
平行平板コンデンサの容量は距離に反比例するので、たとえば体の厚みを20cm、呼吸に伴う変動幅を1cmとすれば5%程度の変化で容易に観測できそうです。
そこで3Dプリントした150*200*2mmの枠に網目が細かくて軟らかいステンレス網を貼り付けてテストしました。
すると呼吸に伴い確かに静電容量は変化するのですが、驚いたことに予想とは逆の変化になりました。
息を吸って電極間距離が離れたときの方が静電容量が増えたのです。
また電極を肌の上に直に装着した場合と肌着の上から装着した場合でそれぞれ1.5nFと0.14nF程度と大きな違いがありました。(デジタルテスターで計測)
【初期案の電極装着断面図】
【初期案の試作電極】
【初期案の試作電極】
上記の結果は人体と空気や布の誘電率が大きく異なり、静電容量は電極間誘電率に比例するためだと気づきました。
空気や布の比誘電率は真空に近く、ほぼ1です。
それに対し人体の誘電率は低周波数帯域では数百~数千と非常に大きくなるそうです。
そのため息を吸ったときに電極間静電容量が増えた原因は、薄くて弾力がある電極がゴムひもで引っ張られて肌に密着する面積(図の赤丸の部分)が増えたためと思われます。
【息を吸った時の電極の状態】
以上の事から、電極構造を変えることにしました。
図のようにゴムひもを伸縮しないベルトに変えて、ベルトで引っ張られることで電極が曲がって容量が大きく変わる構造を採用しました。
図のようにゴムひもを伸縮しないベルトに変えて、ベルトで引っ張られることで電極が曲がって容量が大きく変わる構造を採用しました。
【採用した電極の構造】
この時別案として、呼吸に伴う腹囲変化を機械的スイッチで検出する事も一瞬考えました。
しかしスイッチでは出力がアナログ値ではなくON/OFFのデジタル値となります。
腹囲の相対的な増減変化の検出は出来ず、判定基準が1点に固定されます。
そのため就寝中の体の動きでベルトの引き具合がわずかでも変わると検出不能となる懸念があり採用しませんでした。
しかしスイッチでは出力がアナログ値ではなくON/OFFのデジタル値となります。
腹囲の相対的な増減変化の検出は出来ず、判定基準が1点に固定されます。
そのため就寝中の体の動きでベルトの引き具合がわずかでも変わると検出不能となる懸念があり採用しませんでした。
PICマイコンチップの静電容量センサ機能
PICマイコンのいくつかのチップにはタッチスイッチを実現するための容量検出機能がついています。
この機能はハードウェアだけでなくソフトウェアも組み合わせる必要があるためか ソフト開発ツール MPLAB X ideの便利機能MCCに初期状態では表示されません。
ライブラリにmTouchモジュールをインストールすると選択できるようになります。
しかしこのライブラリは私には使い方がよくわからず使用しませんでした。
この機能はハードウェアだけでなくソフトウェアも組み合わせる必要があるためか ソフト開発ツール MPLAB X ideの便利機能MCCに初期状態では表示されません。
ライブラリにmTouchモジュールをインストールすると選択できるようになります。
しかしこのライブラリは私には使い方がよくわからず使用しませんでした。
ですが今回選択したPIC16F1829のデータシートの27章Capacitive Sensing Module(CPS)を読むと簡単に使うことができました。
CPSモジュールは外部パッド容量によって変化する発振器で、その出力をタイマーTMR1のクロックに接続します。
その設定はMCCのTMR1のクロック選択でCap Sensを選択することで簡単に行なえます。
CPSモジュールは外部パッド容量によって変化する発振器で、その出力をタイマーTMR1のクロックに接続します。
その設定はMCCのTMR1のクロック選択でCap Sensを選択することで簡単に行なえます。
【CPSの発振器】
静電容量を計測するには周期的に一定間隔でTMR1のカウント値を読み出し、その後カウント値をリセットして次の計測をスタートさせます。
今回の場合TMR6を使って10msec毎に割り込みを発生させ、割り込みルーチン内で100msec毎に上記の処理を行なっています。
あとCPSモジュールを起動するために下記の2つのレジスタを初期化しています。
CPSCON0=0x8C // 発振用駆動電流=18μAを選択し起動
CPSCON1=0x03 // 容量測定端子に3pinを指定
詳細が知りたい場合はPICマイコンのデータシートや後述で添付のソースコード、MCC設定を参照してください。
【MPLAB X ideのTMR1 MCC設定】
回路
PICマイコンはCPSモジュール付きで計測結果を記憶するRAM容量が8bitPICマイコンの中で比較的大きいPIC16F1829を使いました。
回路関連の資料を以下に添付します。
回路図 APNEA_C_circuit.pdf
裏面マスク(ポジ) POS_APNEA_C-B_Cu.pdf
裏面マスク(ネガ) NEG_APNEA_C-B_Cu.pdf
表面部品配置図 APNEA_C-F_Silkscreen.pdf
裏面部品配置図 APNEA_C-B_Silkscreen.pdf
裏面ジャンパ配線図 APNEA_C_jumper.pdf
ドリルマップ APNEA_C-PTH-drl_map.pdf
部品表 APNEA_C_Parts.pdf
回路関連の資料を以下に添付します。
回路図 APNEA_C_circuit.pdf
裏面マスク(ポジ) POS_APNEA_C-B_Cu.pdf
裏面マスク(ネガ) NEG_APNEA_C-B_Cu.pdf
表面部品配置図 APNEA_C-F_Silkscreen.pdf
裏面部品配置図 APNEA_C-B_Silkscreen.pdf
裏面ジャンパ配線図 APNEA_C_jumper.pdf
ドリルマップ APNEA_C-PTH-drl_map.pdf
部品表 APNEA_C_Parts.pdf
【APNEA_C回路】
3ピンと5ピンのピンヘッダはピン先がケースの上面からはみ出さないように、黒いプラ部品をピンの中央に来るようずらしてからハンダ付けしています。
ハンダ付け後にプラ部品を抜き取り、ソケットを挿したときに充分接触するようにしました。
回路設計、パターン設計はKiCADを使い、基板は片面銅張基板+感光フィルムで自作しました。
ケースと電極
ケースは3Dプリンタで製作しました。使ったフィラメントはABSです。
3Dプリント用データ
上蓋 APNEA_C_BOX_1.stl
本体 APNEA_C_BOX_2.stl
バネ板右 APNEA_C_BOX_3.stl
バネ板左 APNEA_C_BOX_4.stl
2D設計データ(JW-CAD用) APNEA_C_BOX.jww
2D設計データ(部品別)pdf APNEA_C_BOX.pdf
3Dプリント後にM3タップ加工を上蓋は基板取り付け用の4箇所、本体は16箇所、バネ板は各1か所に行ないました。
電極は50mm幅のステンレステープ、絶縁シートとして50mm幅の薄手の荷造りテープを使いました。
テープは本体とバネ板に貼り付ける前に端子部の切り欠き加工と貼り付けを以下のように行ないました。
1.適当な台紙にテープを長めに貼り付けて加工台にする
2.その上に後ではがしやすいように端を1cm程折り返したテープを重ね貼り
3.さらにその上にAPNEA_C_BOX.pdf 4ページ目の型紙を印刷、切り抜きしたものをスティックのりで軽く固定
4.カッターナイフや穴あけパンチで切り抜き
5.テープを加工台からはがす
6.本体にステンレステープを貼り付け、その上に絶縁用テープを貼り、はみ出た余分な部分をカット
7.バネ板の平らな下面側にステンレステープを貼り付け、はみ出た余分な部分をカット
本体横の穴に合わせて直径13mmの圧電サウンダ―を瞬間接着剤で貼り付けました。
基板と接続するために配線と2.54mmピッチの2pinピンヘッダをハンダ付けしています。
配線途中に1KΩの保護抵抗を入れていますがこれは入れなくても問題ないと思います。
本体下面には装着時に安定するようにキッチンスポンジを斜めにカットしたものを貼り付けています。
電池ボックスも両面テープで本体に取付け、リード線には2.54mmピッチの2pinソケットをハンダ付けして基板と接続しています。
ステンレステープ電極からはM3ネジで配線を引出し、2.54mmピッチ2pinのソケットをハンダ付けして基板と接続しています。
上蓋は8本のM3長さ10mm皿ねじ、基板固定とバネ板の電極接続用にはM3長さ5mmなべネジ、その他はM3長さ10mmのなべネジを使いました。
バネ板には布で作ったベルトを縫いつけました。
左右のベルト端には腹囲に合わせて長さを調整して固定するためにマジックテープをつけています。
3Dプリント用データ
上蓋 APNEA_C_BOX_1.stl
本体 APNEA_C_BOX_2.stl
バネ板右 APNEA_C_BOX_3.stl
バネ板左 APNEA_C_BOX_4.stl
2D設計データ(JW-CAD用) APNEA_C_BOX.jww
2D設計データ(部品別)pdf APNEA_C_BOX.pdf
3Dプリント後にM3タップ加工を上蓋は基板取り付け用の4箇所、本体は16箇所、バネ板は各1か所に行ないました。
電極は50mm幅のステンレステープ、絶縁シートとして50mm幅の薄手の荷造りテープを使いました。
テープは本体とバネ板に貼り付ける前に端子部の切り欠き加工と貼り付けを以下のように行ないました。
1.適当な台紙にテープを長めに貼り付けて加工台にする
2.その上に後ではがしやすいように端を1cm程折り返したテープを重ね貼り
3.さらにその上にAPNEA_C_BOX.pdf 4ページ目の型紙を印刷、切り抜きしたものをスティックのりで軽く固定
4.カッターナイフや穴あけパンチで切り抜き
5.テープを加工台からはがす
6.本体にステンレステープを貼り付け、その上に絶縁用テープを貼り、はみ出た余分な部分をカット
7.バネ板の平らな下面側にステンレステープを貼り付け、はみ出た余分な部分をカット
本体横の穴に合わせて直径13mmの圧電サウンダ―を瞬間接着剤で貼り付けました。
基板と接続するために配線と2.54mmピッチの2pinピンヘッダをハンダ付けしています。
配線途中に1KΩの保護抵抗を入れていますがこれは入れなくても問題ないと思います。
本体下面には装着時に安定するようにキッチンスポンジを斜めにカットしたものを貼り付けています。
電池ボックスも両面テープで本体に取付け、リード線には2.54mmピッチの2pinソケットをハンダ付けして基板と接続しています。
ステンレステープ電極からはM3ネジで配線を引出し、2.54mmピッチ2pinのソケットをハンダ付けして基板と接続しています。
上蓋は8本のM3長さ10mm皿ねじ、基板固定とバネ板の電極接続用にはM3長さ5mmなべネジ、その他はM3長さ10mmのなべネジを使いました。
バネ板には布で作ったベルトを縫いつけました。
左右のベルト端には腹囲に合わせて長さを調整して固定するためにマジックテープをつけています。
ソフトウェア
PIC16F1829用ソースコード(MPLAB X ide プロジェクトファイル)をZip圧縮したものと
コンパイル済みの書き込み用データを添付します。
APNEA_C.X.zip
APNEA_C.X.production.hex
(プログラム書き込みについては「PICマイコンと開発ツール」のページやWeb情報を参照)
コンパイル済みの書き込み用データを添付します。
APNEA_C.X.zip
APNEA_C.X.production.hex
(プログラム書き込みについては「PICマイコンと開発ツール」のページやWeb情報を参照)
操作方法と機能
電源を入れる(=電池を入れる)と測定が始まります。
電源をいれた時点、またはいずれかのスイッチを押した時点から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_C.py
SASチェッカーの測定終了後、MODEスイッチを何回か押してUART Txを表示させます。
SASチェッカーとPCをUSB-Serial変換基板を介して接続します。
PC側でPythonプログラムファイルを置いたフォルダでコマンドウインドウを開き
python APNEA_C.py 出力ファイル名.txt
と入力して待機状態にします。
SASチェッカー側で↑(UP)スイッチ、または↓(DOWN)スイッチを押します。
テスト結果と使用感等
覚醒時の装着テストでわざと息を止めたりしたテストで問題なく動作しました。
消費電流は液晶バックライトが点灯している最初の1分間が9.5mA
それ以降の液晶バックライトが消灯して測定しているときが2.1mAでした。
MODEスイッチを押してSLEEP状態にすると0.17mAでした。
単3電池容量を少な目の1000mA/hとしても測定可能時間は1000/2.1≒476hで充分です。
就寝テストも3夜行ない、それらしい測定結果が得られました。
10秒以上の呼吸停止検出はありましたが低頻度で、無呼吸症候群の判定基準には引っかかりませんでした。
ですが就寝時長時間測定の検出精度検証は不十分です。
別方式のSASチェッカーが出来たら同時測定した結果を比較したいと思っています。
あとこのSASチェッカーのサイズは大きく、いろいろ改善の余地があると感じました。
ですが一応測定が出来たので別センサ方式の製作に移行することにしました。
消費電流は液晶バックライトが点灯している最初の1分間が9.5mA
それ以降の液晶バックライトが消灯して測定しているときが2.1mAでした。
MODEスイッチを押してSLEEP状態にすると0.17mAでした。
単3電池容量を少な目の1000mA/hとしても測定可能時間は1000/2.1≒476hで充分です。
就寝テストも3夜行ない、それらしい測定結果が得られました。
10秒以上の呼吸停止検出はありましたが低頻度で、無呼吸症候群の判定基準には引っかかりませんでした。
ですが就寝時長時間測定の検出精度検証は不十分です。
別方式のSASチェッカーが出来たら同時測定した結果を比較したいと思っています。
あとこのSASチェッカーのサイズは大きく、いろいろ改善の余地があると感じました。
ですが一応測定が出来たので別センサ方式の製作に移行することにしました。