この睡眠センサは、呼吸の時の鼻の空気の流れを計測する装置です。時間的な空気の流れを計測・記録することで、睡眠時無呼吸などの病気の発見や、睡眠の質の簡易的な評価に役立ちます。呼吸の波は1Hz以下なので、その計測のためには、入手性が比較的悪く高価な圧電フィルムや、歪みゲージによる圧力センサ等が必要となりますが、その代わりに、安価で入手容易なエレクトレットコンデンサマイクを低周波の圧力センサとして利用することで、誰でも手軽に鼻の空気の流れを計測することができるようになります。また、このシステムでは、XBeeによる無線モジュールでデータを送信することで、可搬性に優れた計測が可能となりました。
センサの仕様を表1に、全体像を図1に示します。
表1 センサの仕様
| 電源 | 1.5V乾電池 4本 |
| 稼働時間 | 2日(50時間)前後 |
| 圧力 | ±50Pa前後 |
| センサ応答周波数 | 3Hz前後 |
| データ出力 | 無線でリアルタイム |
| サンプリング | 20Hz前後 |
図1 計測システム例
鼻の空気の流れを感知するチューブは、鼻カニューラとしてインターネット通販などで、一般に入手可能です。チューブは、センサボックスの接合部を通して、エレクトレットコンデンサマイクと接続しました。
エレクトレットコンデンサマイクは、WM-61A相当とされているXCM6035-2022-354Rを使用しました。
左右のクロストークを抑えるため、エレクトレットコンデンサマイクからの信号のプリアンプ段は、カレントミラーを使用したトランスインピーダンスアンプとし、マイクからの高周波の信号の抑制及び消費電力の抑制を目的として、オペアンプのGB積は500kHz以下で、回路の簡素化を目的として、オフセットの調整が不要になるよう、入力オフセット電圧の低い高精度品種を選定しました。
本制作例では、マイクプリアンプ段ではLT1078を、XBeeのADCプリアンプ段には入出力Rail-to-RailのMAX492を使用しましたが、上記条件を考慮すれば、他の品種も使用可能でしょう。
XBee Series 2のADCの入力は0Vから1.2Vまでなので、定電流でダイオードを駆動し生成した約0.6Vを中点電圧として、ADCプリアンプ段で電圧を変換し、XBeeのADCに入力しました。
作例を図2に示します。
図2 制作した睡眠センサ
電源は単三乾電池直列4本で、表1の仕様の2日(50時間弱)程度の稼働を可能にするには、無線モジュールの消費電力を考慮する必要があります。Panasonicのページに、乾電池の消費電流対稼働時間のグラフが掲載されており、単三乾電池の場合、グラフから読み取ると、40mA以下のモジュールを使う必要があります(図3)。なお、降圧にスイッチングレギュレータを使用すると、効率が高くなるので、もう少し条件は緩くなります。無線データ送信モジュールをいくつか調べてみたところ、表2の通り、WiFiを使用したモジュールはどれも消費電力が40mAの倍以上あり、今回の使用には適しませんでした。Bluetooth LEは消費電力が少なく、今回の使用には適しているのですが、Windows 8以下では対応しておらず、Windows 10でも安定しない場合があるため、今回は、Processing (Java)用のAPIライブラリのあるXBee S2を使用することとしました。XBeeは、一旦Coordinator及びPAN IDを設定すると、その後は電源を入れるだけで自動的にネットワーク探索・接続するので、その後の使用が非常に容易です。
図3 電池稼働時間
表2 無線モジュールの消費電力
| モジュール | 規格 | 消費電流 | 備考 | |
| XBee S2 | ZigBee | 送信 33mA 受信 28mA | ○ | Java用SDKあり |
| TWE-Lite (TWE-001L) | IEEE802.15.4 | 送信 17mA 受信 15mA | ○ | Java用SDKが未整備 |
| XBee S6 (WiFi) | WiFi | 送信 309mA 受信 100mA | × | |
| ESP8266 (ESP-WROOM-02) | WiFi | 平均 80mA | × | |
| ESP32 (ESP-WROOM-32) | WiFi + Bluetooth LE | WiFi送信 160-260mA | × | |
| nRF51822 | Bluetooth LE | 送信時 16mA | ○ | 要Windows 8.1以降 |
| RN4020 | Bluetooth LE | 送信時 16mA | ○ | 同上 |
エレクトレットコンデンサマイクの増幅回路としては、ポータブルでの使用が多いため、両電源よりは、乾電池等による単電源での回路で使われることが多く、その中でオペアンプを使用した回路としては、(1)反転増幅回路(図4)(2)非反転増幅回路(図5)が広く使われているようです。
これらの回路の問題点として、エレクトレットコンデンサマイクが電源に数kΩの負荷抵抗を通して直接つながっていることと、中点が抵抗2本とコンデンサでバイアスされていることから、この回路のまま単一の電源で複数のチャンネルを稼働させた場合、クロストークが問題になることが多い点が挙げられます。もう一つの問題点として、これらの回路では100dBSPL程度以上の音圧では電圧が飽和してしまい、正常に測れなくなってしまうという点があります。本センサでは、複数の気圧の差を検出する必要があるため、できる限りクロストークの低い回路構成とする必要があります。加えて、高い圧力まで計測できる回路が必要です。
図4 反転増幅回路の例
図5 非反転増幅回路の例
これらの問題点を解決する方法として一つ考えられるのは、チャンネル毎に定電圧回路を入れてクロストークを減らす方法です。試しに3.3VレギュレータのNJM2863で両チャンネルに電圧を供給する回路としたところ、クロストークは減少しました。但し、電池駆動の場合、定電圧回路にシリーズレギュレータを使用した場合、消費電力が問題になることがあると考えられます。また、もう一つの問題点である高音圧時の計測では、高音圧印加後や静止時の出力電圧がふらついて安定しにくいという問題が生じました。原因としては、電源電圧の設計値が2V程度の低い電圧になっているために、コンデンサマイクからの信号が大信号時に飽和しバイアス電圧が変動してしまうことが挙げられます。この大信号時の問題を解決するために、コンデンサマイクの端子を切断してソースとグランドを切り離し、本来のソース接地回路からドレイン接地回路(ソースフォロワ)に変更して使用する方法が、一部の国内及び海外のオーディオ自作家から発表されていますが、この方法は1mm以下の精度のかなり難しい工作を必要とするため、これ以外の方法をとることとしました。
負荷抵抗を定電流負荷に置き換えることで、バイアス電圧となる動作点をコントロールし、より高い電圧でエレクトレットコンデンサマイクをバイアスできるようになります。また、出力インピーダンスは上がりますが、増幅率は上がるという利点があります。このバイアス方法の場合、オペアンプによるI/V変換を使用するか(図6)、非反転増幅回路で増幅する方法(図7)が挙げられます。定電流の定数については、エレクトレットコンデンサマイクに使用されているFETが明示されていない場合は(WM-61Aは2SK3372(最大Idss: 460μA)を使用しているという未確定情報あり)、エレクトレットコンデンサマイクのデータシートに示されている最大消費電流(0.5mA程度が多い)を基に決める必要がある他、動作点によって出力が電源電圧かグランドに張り付いてしまうので、手動またはサーボ等のフィードバックによる電流量の調整が必要となります。
サーボ付きI/V変換は、LT1677のデータシートの回路例に掲載されており、概要は図8のような回路です。非反転増幅回路の場合は、図9のように、サーボ回路から負荷抵抗を通してエレクトレットコンデンサマイクに供給するとよいでしょう。今回は、データシートにて実績のあるI/V変換の回路を採用しました。
図6 定電流によるバイアス及びオペアンプによるIV変換
図7 定電流によるバイアス及び非反転増幅回路
図8 サーボ付きIV変換
図9 サーボ付き非反転増幅回路
乾電池2本(3V)ですと、無線モジュールに3.3V電源を供給するためのDC-DCコンバータが昇圧になり、効率が低いか十分な電流が得にくい品種が多くなってしまうことや、単電源またはrail-to-railオペアンプによる回路の設計の容易さ、電池ケースの種類から、乾電池4本による回路としました。
WM-61A相当と言われているXCM6035-2022-354Rの感度は-35dBVで、1Pa (94dB SPL)時の電圧は、10^(-35/20)=17.8mVrms、規定の抵抗が2.2kΩなので、電流は17.8mV/2.2kΩ=8.1μArms/Paとなります。マイク本体の最大音圧は規定されていませんが、チューブ内圧力計測では音圧としては比較的高い圧力まで測定するので、128dBSPL (50Pa)として、この時のI/V変換後のpeak-to-peak電圧値が1.5V乾電池4本分の6Vに収まるようにするには、I/V抵抗は6V/(50*8.1μ*2*sqrt(2)Ap-p)=5.2kΩで、余裕を持って少し小さめの値として、E系列から4.7kΩを選定しました。
呼吸の回数は一分間に10回から20回程度と幅がありますが、この周波数より少し下の範囲を中心として計測できる範囲を決めることになります。この範囲は実際に何種類かを試して良い値を探して決めました。最終的に、トランスインピーダンスアンプのLPFは3.4Hz (4.7kΩ、10μF)とし、DCサーボ(HPF)は0.07Hz (2.2MΩ、1μF)としました。
基準電圧としては、シャントレギュレータのTL431が比較的有名で、今回はすぐに入手できたことからこれを採用しましたが、省電力という面からは他の品種を考慮することがあります。TL431はデータシート上、最大値で1mA以上の電流を流す必要があります。電圧降下による1.5V乾電池4本直列電圧の最悪値を4Vとして、4V-2.5V=1.5Vで1mA以上流れるためには1.5kΩ以下となり、少し小さめの1kΩとしましたが、消費電力の面からはあまり良くありません。乾電池駆動で稼働時間を少しでも延ばすためには、省電力のNJM2825 (最小電流 0.7?A)やLT1389 (最小電流0.7?A)の使用を考慮しても良いでしょう。但し、出力電流が限られてくるので、負荷抵抗を決定する時に、オペアンプの入力バイアス電流の上限には注意が必要となります。もっとも、入力バイアス電流が1?A以上のオペアンプ品種は比較的少数なので、選定に困ることは少ないでしょう。
XBee Series 1ではVref (ADC用のリファレンス電圧)を設定できましたが、Series 2以降では最大入力電圧が1.2V固定となっています。型番にProのついているProgrammable moduleでは、無線SoCとは別に搭載されているHCS08のADC用にVrefを設定できますが、ProではないモジュールではVrefを設定できません。最大1.2Vの入力において、中点(0.6V)を設定するためには、ダイオードのVF(順方向降下電圧)が0.6Vに近い電圧であることから、 FETか定電流ダイオードでダイオードを定電流駆動させる方法が考えられ、回路の簡易さから今回はこの方法を採用しました。定電流用のFETを、比較的入手容易な2SK117(GR)とした場合、最大で6mA近く流れるので、消費電力の割に絶対的な精度や温度特性が良くないという欠点があります。消費電力が問題になる場合は、Idssの低い品種を選ぶ方が良いでしょう。また、温度特性や電圧精度が必要な時は、出力電流に注意し、TL431の出力を分圧して使うと良いでしょう。
電圧精度は要求しないので、120kΩと12kΩで分圧してXBeeのADCに直接入力する方法としました。消費電流は約45μAで、無線モジュールに比べればずっと少なく、電池稼働時間上問題になることはありませんが、XBeeのADCの入力インピーダンスは10kΩとなっており、電池電圧等の直流に近い値以外を読む場合は、誤差が問題になるので注意が必要です。
図10 オペアンプ検索結果
図11に全体の回路図を示します。
図11 全体の回路図
エレクトレットコンデンサマイクの周波数応答の表では、一般的に下限が50Hz程度までしか掲載されておらず不明なので(図12)、50Hzより下の周波数の応答を測ってみます。本センサで扱う気圧は数百Paという微圧のため、一般的な気圧計で測ることは困難です。今回の測定では、長野計器 小型デジタル微差圧計(GC30) GC30-101-C9N380 (±100Pa) (図13; *長野計器 製品情報より)を使用して、本回路でエレクトレットコンデンサマイクがどの程度の圧力を感知可能か測定してみました。
測定に際して、正弦波で微圧を生成する校正用の機器は、探した範囲では見つかりませんでした。そこで、耳挿入型のイヤホンを製作する要領で、ノートパソコンやポータブル機器等に使われる超小型のダイナミックスピーカーにPISCO LC-0425-M5 / 日東工器 MC-05PMカプラをつなげて使用することにしました(図14)。
デジタル微差圧計(GC30)は、サンプリングレートが20Hzで、時定数の設定でアンチエイリアシングフィルタを入れない設定の場合は、DC近辺から10Hzまでは殆ど平坦な特性でした(図15)。
エレクトレットコンデンサマイクの測定では、トランスインピーダンスアンプの10μFのコンデンサを除いて、LPFを省いた場合、DCサーボの0.07Hzより高い周波数である10Hz付近をカットオフ周波数とする6dB/octのHPFの応答となり、トランスインピーダンスアンプで3.4Hz のLPFを設定した場合、約5HzのBPFの応答となりました(図16)。なお、周波数応答から、今回使用した微圧発生器のマイクロスピーカの共振周波数は2kHz付近と考えられます。エレクトレットコンデンサマイクの振動膜かその周囲が密閉されていないために、DCまでの応答がないと考えられました。低周波騒音の簡易的な計測はできますが、インフラサウンドの計測までは難しい周波数応答です。
図12 WM-61Aの周波数応答
図13 長野計器 小型デジタル微差圧計(GC30)
図14 微圧発生器
図15 微圧発生器の周波数応答
図16 エレクトレットコンデンサマイクの周波数応答
今回の用途である気圧の簡易的な計測には問題ありませんが、大信号の時は、Id- Vgsの二乗特性の通り、二次歪みがかなり見られます。この問題を解決する方法としては、前掲の、エレクトレットコンデンサマイクを改造してドレイン接地回路にする方法以外に、カスコードのような回路を使って二乗特性を打ち消す方法が海外で提案されています(図 17)。定電流に使用するJFETをうまく選定すれば低い歪みで大信号まで対応することができますが、この回路のゲインやオフセット電圧はVpoやIdssに強く依存するため、JFETの選定及び選別が必須となります。
図17 コネクタ
ケースはタカチ電機工業 LM-140Cを使用しました。回路はユニバーサル基板を使用し、1.5V電池4本から3.3Vへの電圧コンバータには秋月電子通商のLXDC55使用DCDCコンバータキット(3.3V)を使用しました。 普通のストローを8mmに切ってエレクトレットコンデンサマイクをはめ込み、内径3mm外径6mmのシリコンチューブ9mmで、ミニフィッティング隔壁コネクター(VFB226/VFBL10)と接続し、鼻につなげるカニューラは、左右鼻の部分で一旦切ってから中を接着剤で充填してから再度繋げ、左右を分離しました(図 18)。 XBee親機側には、Processingを用いた表示及び記録プログラムを作成し、ファイルに結果を逐次記録できるようにしました。Processing用のプログラムは、文献に記載のホームページより入手可能です。
図18 コネクタ
センサ子機側は、電源をオンにするだけで、親機を検索し始め、自動的に接続します。親機側でProcessingによる計測プログラムを開始し、子機を登録して記録を開始できます。気流の計測データは、一定期間画面に表示するとともに、テキストファイルにも保存されるので、計測後に結果を処理することができます(図19)。
図19 Processingによる計測インターフェース
<polak> mauke: so how does that "translate" into eng
<merlyn> "eng"?
<mauke> I spe eng goo
<rindolf> mauke: I spe eng wel
<rindolf> I spe goo eng
<sts> just a short question. besides personal preference is there
any difference if you use if(! or unless(?
<rindolf> sts: no.
<rindolf> sts: they do the same thing.
<Botje> sts: pfft. Real Men(tm) use unless(!...)
<rindolf> Botje: heh.
<sts> lol unless(! makes sense. thanks Botje, i'll rather use this
one. =D
<LeoNerd> For me it's a readability thing - I express what seems more
likely
<rindolf> Botje: File::HomeDir used to have a triple or quadruple
negative in one of its test files.
<Botje> unless(! $str !~ /(?!foo)/)
<rindolf> Botje: heh
<merlyn> whoa
<merlyn> unless (!) makes no sense to me at all
<Botje> of course not.
<sts> Botje: wow!
<Botje> it's still cool to confuse people with :]
<LeoNerd> Heh.. Should just use !!! in there anywa y:)
<merlyn> it's 7 characters too many
<xand> some people don't understand double negatives
<merlyn> I don't want no complaints!
<Botje> xand: you mean don't not understnad?
<LeoNerd> We don't know nobody who don't want no double-negatives
<sts> Botje: what does (?!foo) do?
<nanonyme> lol
<xand> Botje: don't not misunderstand
<mauke> Botje: that always executes the block
<merlyn> there's an argument that can be successfully made that "I
don't want no complaints" doesn't necessarily work logically
<Botje> xand: oh, I don't not think I didn't not misunderstand you.
<Botje> mauke: I know. it just looks cool.
<mauke> and you want !($str !~ /.../)
<xand> don't you?#
<merlyn> so it might actually mean what people think they're meaning
-- N-uple negative on Freenode's #perl
-- #perl, Freenode
"Okay, I think that I can now return to my country and my village. By the way,
how many forbidden books do you have?"
"Oh,", one of them said to me, " their number grows up geometrically. When I
checked two weeks ago, their number was 2,148,763. A week ago there were
4,278,109 forbidden writings. Now there must be about 8,600,000."
"You are wrong.", I said to him.
"I beg your pardon?"
"There are now exactly 8,517,559 or 8,517,560 forbidden books."
"Why is it so important?"
"Why, it means that meanwhile you have 82,440 or 82,441 extra books you can
read at bedtime if you can't fall asleep!"
"The Enemy and how I Helped to Fight It"
Shlomi Fish
-- Shlomi Fish
-- Shlomi Fish's Aphorisms Collection ( http://www.shlomifish.org/humour.html )