臨床工学技士が自作パルスオキシメーターを完全自作しました。
記事は2回に分ける事にして今回は原理とハードウェアの説明、次回はソフトウェアの説明をしまーす。
自作すると市販のパルスオキシメーターのありがたさを実感できる他、測定原理や苦労を体感できたり妙な達成感を味わえます。
おおよそ2千円程度ですべてそろうので電子工作好きな臨床工学技士さん、学生さん、その他ご興味がある人はぜひ作成してみてください。。
ことのはじまり
コロナのせいで何もかもがクルって困ってます。
そんな中で時間だけが余っている今日この頃、コロナで需要が増えたそうなパルスオキシメーターを自作しようと考えました。
とりあえず、完成したHand made PulseOximeter 〜自作パルスオキシメーター〜をご覧ください↓
CEのkazurockが完全オリジナルで作ったパルスオキシメータです(笑)
パルスオキシメーターについて
パルスオキシメーターはコニカミノルタのホームページに書いてあるのを読んでもらえば全てを理解できますが、ざっくり言うと赤色LEDと赤外LEDを使い組織を透過した光の脈波の波高値や透過度の比から動脈の酸素飽和度を計算する事で値を得られます。
計算式に関してはarduinoで使用できるパルスオキシメーターのセンサーであるMAX30102なるものがあるのですが、そのライブラリより計算式を参考にさせてもらいました。
またMAX30102なるものはアマゾンで売られていて簡単にパルスオキシメーターを実験できるセンサとして色々な人が記事にあげています。例えば↓
[ESP8266][MAX30102] MAX30102でパルスオキシメーターを作る
上のサイトはとても参考になります。。
上図がSPO2の全てを物語っております。
ちなみにMAX30102も実際に動かしてみましたが、オリジナルのライブラリではマトモな測定はできません。というかぜんぜん使えません。
ですのでライブラリに記載されている計算式のみ拝借させてもらいました。
↓これです。
R=(Red_AC/Red_DC)/(IR_AC/IR_DC)
SPO2%=-45.060R^2+30.354R+94.845
波形のAC成分やDC成分をどのように測定するか?ですが、さきほど紹介したサイトでも行っているようにDC成分は移動平均ライブラリを使ってDC成分を算出する事にしました。
またAC成分は波形の最高値と最低値から算出します。
具体的にはパルス一拍づつ検知するプログラムにて脈波を検出しその時の赤外光での波形、近赤外光での波形からAC成分及びDC成分を算出し上記計算式に当てはめて算出するだけです。
ごくごくシンプルです。
自作パルスオキシメータのハードウェアについて
ハードウェアの制御について
今回のハードウェアの参考にしたのはここです。
下図がおおまかな制御図になりまーす。
赤色・赤外LEDを発光
↓
フォトダイオードでそれぞれの発光時の波形を読み取る
↓
オペアンプで微量な電流を増幅し電圧に変換する
↓
変換した電圧をADS1115で16bit アナログ/デジタル変換する
↓
arduinoでデジタル値として読み取る
↓
デジタル値(透過率)を60%〜90%になるようにLEDの電圧をデジタル/アナログ変換で電圧調節
↓
LEDの電圧を調節しても範囲外になる場合はアナログ/デジタル変換器のゲインを調節する。
↓
値が範囲内になったら、脈波を読み取って波高(AC成分)と移動平均値(DC成分)を計算してその値から脈拍数とspo2を算出します。
ざっくりしてますが上記のような制御をするように決定しました。
制御のフローチャート
フローチャートも書いてみました。↓
使用したハードウェア
arduino ESP8266
arduinoIDEにてプログラムを書き込むのがESP8266(左側)です。 ただ、使えるIOpinが少ないです。
他にもESP8266 Wroom02とかESP32とかでも代用可能ですしarduino unoなどのボードを用いても作れます。
ESP8266系ならプログラムを変えなくても普通に動くと思います。
Arduino Unoとかだとプログラム上で使用するI/Oピンを変更しなければならないと思います。
16bitA/Dコンバーター ADS1115
アマゾンで2個で940円でした。なので一つあたり470円です。
16ビットのA/Dコンバーターです。arduinoでライブラリがあります。
私が使ったライブラリはADS1X15を使用しました。
I2C接続でarduinoに接続してデータのやりとりができます。I2Cがわからなければこちらが使用方法含めてわかりやすいと思います。
他のサイトなどでは他のライブラリが使われる方が多いのですが、ゲインの設定やA/D変換のデータレートを変更できるのでこちらを使いました。
16ビットとなっていますが、正確にはマイナス電圧もA/D変換する仕様になっているので、プラス電圧だけなら15bitで32768段階で電圧をデジタル値に変換してくれます。
単純にオペアンプからの出力がMAX3.3vとすると0.1mvの分解能があります。
すばらしいです。
A/D変換でデータレートを128SPS(デフォルト)に設定した場合変換時間は1/128secで約7.8msecかかります。
最大で860SPSのスピードでA/D変換できるので、1/860で1.16msecで変換できます。
さらに、ADS1115はここのサイトでもわかるようによりノイズが少なく変換できる差動入力ができます。
情報もたくさんあるし、ライブラリもあるしすぐ動かせます。
使用方法や結線についてはやはり、ここのサイトが非常にわかりやすいです。
プログラム上のライブラリの使用法はプログラム説明時にでも詳細を述べます。
12bitD/Aコンバーター MCP4725
このD/Aコンバーターも有名らしくアマゾンで売ってます。ただし、MCP4725のブレークアウト品といって本家の基盤をコピー(脱獄)しているものらしいです。
ですから品番はGY-4725となっています。
もちろんarduinoでライブラリもたくさん存在しています。
私が使用しているのはAdafruit_MCP4725の本家ライブラリを使用しています。
こちらのDACはデジタル値を電圧に変換して出力してくれます。
これが12bitでD/A変換してくれるので、12bitだと4096段階ですので、MAXで3.3vだと一段階で0.8mvづつ電圧を出力できます。これはLEDの光強度をかなり細かくコントロールできます。
ライブラリの使い方や結線の詳細はまたもやこのサイトがわかりやすく、大変参考になります。
フォトダイオード S2506-2
とくにこれじゃないとだめだというものではないです。
960nmあたりの感度がよかったのでこのSi-フォトダイオードにしました。
他にもフォトトランジスタなど出力電圧が高いものもありますが、市販のパルスオキシメーターのほとんどが、フォトダイオードを使用しているので反応時間や感度の問題でそのようになっているのでしょう。ですので、私もこのフォトダイオードを使用しています。
オペアンプ NJM2732D
どのオペアンプを選べばよいか迷いましたが、低ノイズでしかも反応速度の早いものが良さそうです。
秋月で買う時にそのような事柄を考えずに選んでしまい、買った中でも良さそうなこのNJM2732Dを使用しました。
他のオペアンプも普通に使えると思います。
その時は高速に反応する為にスルーレートが高いもの、やノイズ特性が優れているもの、あと単電源で動くものが回路的に楽になるので良いかと思います。
赤色LED
なんでもOK 今回は5mmのOSR7CA5111Aを使用 秋月電子で10個で150円なり。一つあたり15円です。
赤外LED
なんでもOK 今回は5mmのOSI5FU5111C-40を使用 秋月で5個で100円です。1つ20円です。
LEDをスイッチングするトランジスタ
なんでも今回は2SC1815Aを使用してます。
まぁとくにスイッチングするだけなのでMOSFETなどでもOKですし、他のトランジスタでも大丈です。
抵抗
LEDの電流制御に10Ω×2 トランジスタの電流制御に1kΩ×2 オペアンプの増幅回路に1MΩ×1
回路について
回路図
とりあえずこれまでに説明したハードウェア14点を下図の回路図どおりに組み立てればハードは完成です。
他の部品を使用したとしても接続が変わるのはおそらく、ESP8266のIOpinの接続部のみです。
あとは変更はないでしょう。
ESP8266をarduino Unoなどに変更する場合にはソフトウェア上でのIOpinの宣言を変更するだけで使用可能です。詳細はプログラムの説明時に書き記します。
回路図事態はむちゃくちゃ簡単です。
LEDは赤色、赤外LEDのアノード側をMCP4725の出力につないでいます。
↓がわかりやすいように図で表した実配線図になります。
ハード設計で大変だったところ
フォトダイオードで光を検出するオペアンプの回路ですが、ネットで調べるとたくさんでてきます。
私も右へならえでたとえばフォトダイオード・アンプ回路などを読み漁りました。
ほとんどの説明でオペアンプの復帰還回路で低容量のコンデンサが組み込まれています。
上図では復帰還回路に10MΩとCfというコンデンサが書かれています。
抵抗は増幅率を決定し、今回私ののハード構成では1MΩを選択しています。
復帰還にあるコンデンサはフォトダイオードの容量に合わせて設定しろと、サイトのどの説明にも書かれています。
今回のパルスオキシメータは数msecごとに赤色LEDと赤外LEDを切り替えて組織を透過する光を検出します。
数msecごとに素早く切り替えて読み取るのですが、オペアンプの復帰還にコンデンサを挟んでいるとオペアンプの出力が次の出力までに十分に下がらず、違うLED光の時に正確にオペアンプが出力しないという問題が生じていました。
最初は似たような値の波形がいつも出力されるのでA/D変換がうまくいっていないのかなど、かなり悩まされました。だいたい3週間くらいわからなかった・・・
コンデンサを取り除く事で素早い切り替えができ出力も安定しました。
ただノイズが増えますのでA/D変換の時間及び回数や平均、ソフトウェア上でローパスフィルタを施すなどいろいろ対処しています。
指センサの設計
設計なんて大それた事はしてないです。
ただ、洗濯バサミみないた形状にセンサを乗せているだけです。
一応もっとセンサや指に外来光?であるLED以外の光が当たらないような設計にすればもっと精度の高いセンサになると思います。
・・・が、今回はサクッと作れる簡単なセンサになってます。
材料は↓これだけでLED2つとフォトダイオードと指に固定する器具だけです。
センサからの信号線は合計で5本必要ですのでより線ケーブルがあれば最高ですが、なければ一本ずつの電線を結線して引き出しても問題ありません。
センサの指固定器具は3Dプリンターで作ってますが、どんな材料でも作れると思います。
100均のスポンジとかなんでも指にセンサを固定できればなんでもOKなんです。!!
要は2種類のLED光が指を透過してその透過光が反対側でフォトダイオードセンサにて読み取れればいいんですから。
回路図的にはセンサ部は↓のようになります。
赤色LEDと赤外LEDのコモンアノード、赤色LEDのカソード、赤外LEDのカソード、フォトダイオードのアノード、カソードのそれぞれ5本を配線します。
写真ではLEDを30度の角度で固定できるようにしています。
赤色LEDと赤外LEDのアノード(足が長い方)をアノードコモン、いわいる接続します。回路図をみればわかります。
フォトダイオードも下図のように固定。注意点はフォトダイオードのほうはノイズが乗りやすいので指が端子に触れないような固定にします。
私の場合、簡単にセンサからの端子上に緑のビニールテープを巻きました。
なんかブサイクですね。もう少し時間ができればしっかりとした設計でセンサ部を作ろうかなと思います。
上図は実際に指に挟んだ状態、長時間ではすぐに外れてしまいそうです。
固定はなんと輪ゴムです。
もちろん計測できるかどうかを実験するためのプローブですのでこのような設計になっています。
日本光電社製プローブのハッキング??
一応全てを一から自作してパルスオキシメーターを作成しますが、やはりメーカー製とくれらべてどの程度の精度があるのかなど調べたにところですので、世界で初めてパルスオキシメーターを作成した日本光電社製の指プローブの構造をしらべて、自作ハードウェアでも同作するようにハッキングします。
日本光電社製指プローブのセンサとLEDについて
まず、見た目からですが写真から判断するのにほぼ確定なのは光受光センサにはフォトダイオードが使用されている事に間違いないでしょう。
LEDに関してもワンチップで2つの光が出力できるものである事がわかります。
プローブの接続部形状について
プローブの接続部の形状ですが写真からわかるように9pinのオスになります。
9pinと言えばシリアル通信ケーブルです。
写真には残してませんが、シリアルのメスケーブルと接続すると見事にピッタリハマりました。
シリアルケーブルは安価なので、加工すればこのセンサを接続する事が可能です。
プローブの接続部結線について
日本光電のプローブがシリアルケーブルと接続できるとわかったので、どのpinにLEDやフォトセンサのアノードとカソードが接続されているのか探りました。
テスターのダイオードチェック機能で素子のアノード、カソードを探し、アノードと思わしきpinに低電流をながしその出力を観察する事でようやく日本光電のプローブをハックする事ができました。
上図がそれです。プローブのセンサーは非常にシンプルです。
小児用のディスポプローブも調べた結果、他のプローブもこの結線で統一されているようです。
これで自作パルスオキシメータで日本光電プローブも使用可能になりました。
ちなみにマシモのフィンガープローブに関しても調べてみたんですが、マシモは下図の写真のように赤色LEDと赤外LEDのアノードとカソードが逆に取り付けてあり、極性を切り替える事で発光LEDを点灯・消灯するようです。
そもそも、マシモのセンサの接続部はシリアル接続とは合わないので使えませんが・・・
あとは有名どころでいうとネルコアのパルスオキシメーターのプローブですが、時間がなくて調べてません。
また調べて詳細がわかりしだいご報告しようかな。
最後に
ハードウェアを組み立てればもうほぼ完成したのも同然です。
次回はarduino IDEによるプログラムの解説をいたしまーす。