工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

フォトレジスターによる心拍数の検出

コンポーネントと消耗品

>
Digilent OpenScope MZ
× 1
Arduino UNO
× 1
Texas Instruments General Purpose Quad Op-Amp
× 1
TexasInstruments高速シングルコンパレータ
× 1
マルチターン精密ポテンショメータ-10kオーム(25ターン)
× 2
シングルターンポテンショメータ-100kオーム
マルチターンポテンショメータを入手できれば、調整が簡単になります。
× 1
シングルターンポテンショメータ-10kオーム
× 1
コンデンサ100µF
× 1
コンデンサ100nF
× 1
抵抗10kオーム
または単一の20k
× 2
抵抗4.75kオーム
× 1
抵抗82kオーム
100kポテンショメータのうち2つを入手して、1つを82kに設定することもできます。
× 1

アプリとオンラインサービス

>
Arduino IDE
Digilent WaveForms Live

このプロジェクトについて

はじめに

このプロジェクトは、 CapitanoRedによって投稿されたYouTube動画に触発されました 、著者がオシロスコープに表示するフォトレジスタベースの心拍数モニターを作成しました。彼らのビデオを見た後、私はプロジェクトを複製し、心拍数を計算して表示するためにArduinoを追加したいと思いました。そうすれば、心拍数を読み取りながら、オシロスコープで波形を確認できます。

心臓が収縮して体の周りに血液を押し出すと、血圧の瞬間的な変動が検出されます。これが私たちの鼓動を感じることができる理由です。皮膚と肉が十分に薄い体の領域では、これらのパルスは、通過する光のわずかな変化で検出できます。私たちの目は、光が私たちの体を通過するのを見るのに十分な感度ではありませんが、変動は言うまでもなく、フォトレジスターにはこのレベルの感度があります。

フォトレジスターは、それに当たる光の強度に応じて抵抗を変化させます。照明強度の微妙な変化に対して抵抗の変動は非常に小さい場合がありますが、2つのオペアンプICを使用して増幅することができます。

動作原理

下の図は、このプロジェクトで使用された回路とブレッドボードの概略図を示しています。

<図> <図>

フォトレジスターは、20kΩの抵抗を備えた分圧器内にあります。これは、抵抗の光の量が増えると、分圧器の電圧も上がることを意味します。最初のオペアンプ(上の画像の「Amp1」)は、分圧器のフィルターとして機能し、信号から高周波ノイズを除去します。 2番目のオペアンプ(「Amp2」)は反転増幅器として機能し、フィルターを通過する信号を最大化するように設定されています。 3番目のオペアンプ(「Amp3」)は、信号を2.5Vに集中させる仮想接地を設定します。これにより、オペアンプは0Vから5Vまでの最大信号振幅を提供できるようになります。フィルタリングおよび増幅された後、信号は次のようになります。

<図>

Arduinoで心拍数を測定できるようにするには、信号がコンパレータ(回路図の「Cmp」)を通過する必要があります。コンパレータは、高信号または低信号のいずれかを出力するように設計された特殊なオペアンプです。正の入力の電圧が負の入力よりも大きい場合、コンパレータはHighを出力し、正の入力の電圧が負の入力よりも小さい場合、コンパレータはLowを出力します。最も基本的な構成では、コンパレータはしきい値検出器として機能し、測定された電圧がそのしきい値を上回ったり下回ったりしたときに信号を送ります。コンパレータはハイ(5V)またはロー(0V)のいずれかを出力するため、Arduinoのデジタルピンとのインターフェースに最適です。

<図>

オペアンプからの信号の画像を詳しく見ると、電圧が下がる前に2次パルスがあることがわかります(これは二極ノッチと呼ばれます)。さらに、信号にはかなりの量のノイズがあります。これらの2つの事実は、基本的なコンパレータ構成ではパルスを適切に検出できないことを意味します。ハートビートごとに1つの方形パルスを生成する代わりに、コンパレータは複数のパルスを生成します。これは、ノイズによって信号がアップスイングとダウンスイングでしきい値を数回超えるため、およびしきい値が設定されている場所によっては、場合によっては二股ノッチ中に発生するためです。これにより、Arduinoは実際に存在するよりもはるかに多くのパルスをカウントします。

ノイズの多い信号は、ヒステリシスを使用して処理できます。 このドキュメント テキサスインスツルメンツによるは、ヒステリシスを伴う信号調整のトピックに関する優れた議論を提示し、信号ノイズがコンパレータの性能にどのように影響するか、およびこれらの問題に対処する方法を示しています。このプロジェクトの非対称コンパレータを設計するために、それらの回路図と導出された方程式(それぞれドキュメントの5ページと7ページ)を使用しました。全体的な考え方は、出力からのフィードバックループが正の入力の電圧を変更するということです。つまり、低から高へのしきい値は、高から低へのしきい値とは異なります。これが心臓の脈拍の文脈で意味することは、コンパレータが上向きのあるポイントでトリガーし、次に下向きの別のポイントで、できれば二股のノッチの後にトリガーするように設定できることです。このようにして、Arduinoは、以下に示すように、心拍ごとに1つの方形パルスを確認します。

<図>

フォトレジスターの準備

クリアヒートシュリンクなど、フォトレジスターに何らかのクリアカバーを使用することを強くお勧めします。少なくとも、リードが皮膚に触れないように、リードが完全に覆われていることを確認してください。身体によって生成される電圧は、フォトレジスタが脈拍を検出したときに生成する範囲内に十分収まっているため、皮膚に接触すると結果が歪む可能性があります。

<図>

心拍数モニターの調整

回路図(R7)のポテンショメータの場合、シングルターンポテンショメータを使用して調整し、飽和状態になることなくオペアンプのゲインを最大化します。ポテンショメータの片側を約375Ωに設定し、フィルタ( "Amp1")をこの側に接続することから始めます。このゲインの量は、WaveFormsLiveで表示できる十分なパルスを生成するはずです。次のセクション(「WaveFormsLiveでのパルスの表示」)の手順に従い、パルスを正常に表示した後、必要に応じてゲインを変更できます。ポテンショメータを回してパルス振幅を大きくし、フィルタ側の抵抗を小さくします。振幅がすでに大きすぎてクリッピングが発生している場合は、フィルター側の抵抗を大きくします。次の画像のキャプションを読んで、望ましい信号がどのように見えるかを判断してください。

<図> <図> <図> <図> <図> <図> <図>

コンパレータのしきい値を正確に設定するために、抵抗R3とR4にマルチターンポテンショメータを使用することをお勧めします。抵抗R5は、正確に測定されている限り、10〜100kΩの範囲の任意の抵抗にすることができます。添付ファイルセクションのスプレッドシートを使用して、R5の測定値としきい値電圧に基づいて、R3とR4を設定する値を決定できます。しきい値「Vl」と「Vh」は、オシロスコープを通して見えるパルスに基づいて変更する必要があります(「コンパレータしきい値の設定」のセクションを参照)。

抵抗R8とR9は、1つのポテンショメータに置き換えることができ、中央のピンはオペアンプの正の入力に接続されています。このようにして、一致する抵抗を見つけることなく、仮想接地を簡単に調整できます。出力を2.5Vに調整しながら、電圧計またはOpenScopeを使用します。

WaveFormsLiveでのパルスの表示

WaveForms Liveで心拍を表示するには、メニューのいくつかの設定を変更する必要があります。デフォルトでは、出力が引き伸ばされて解釈が困難になるか、更新速度が非常に遅くなり、フォトレジスターのグリップを調整してクリアなパルスを生成することが困難になります。

OpenScopeオシロスコープのチャネル2(青い線)を「Amp2」の出力に接続し、アース線がブレッドボードのアースに接続されていることを確認します。 WaveFormsLiveの変更時間 「1s」とトリガー メニューで OFF を押します ボタン。両方の Osc Ch 1 および Osc Ch2 メニューセットオフセット 2.5Vまで、サンプルの隣 ロックアイコンをクリックし、使用可能になるフィールドに「1000」と入力します。これにより、信号は解釈しやすいタイムスケールで表示されますが、デフォルトよりも頻繁に更新が発生します。画面は約4秒ごとに更新されます。それでも遅すぎる場合は、サンプルを増やすことができます 値ですが、信号のスニペットが短くなります(「2000」は、一度に約1つのハートビートをキャプチャします)。

実行を押します ボタンを押して、フォトレジスターを指でパルスします。一貫した結果を得るには、最善の方法を見つける必要があります。システムは圧力の変化に非常に敏感であるため、指を非常に静止させる方法を見つける必要があります。脈をとるのに最適な場所は人差し指の最初の関節でした。自分自身を訓練するのに少し時間がかかりますが、最終的には最良の方法を見つけるでしょう。脈拍が小さすぎる場合は、前のセクションの最初の段落(「心拍数モニターの調整」)の指示に従ってポテンショメーターを調整してください。

<図>

コンパレータのしきい値の設定

信号がオシロスコープに表示されたら、コンパレータがArduinoをトリガーして信号を送るしきい値を設定する必要があります。代表的な波形を取得し、キャプチャを停止して、波形をディスプレイに表示し続けます。画面の下部にあるカーソルを押します ボタン。 タイプの下 [電圧]を選択し、両方のカーソルチャネルを設定します 「Osc2」へ。 2本の水平の破線がディスプレイに表示されます。左側の三角形をドラッグして移動します。パルスのピークに近いポイントにラインの1つを設定し、二股ノッチの下のポイントにもう1つのラインを設定します。画面の下部を見て、括弧内に示されている2つの電圧を記録します。最後に添付されているスプレッドシートに、これらの値をしきい値電圧「Vl」および「Vh」として入力します。小さい方の値は「Vl」、大きい方の値は「Vh」になります。これらの値と選択した抵抗R5の値に基づいて、スプレッドシートが計算するポテンショメータのR3とR4の値を設定します。

<図>

コンパレータを設定すると、「フォトレジスタの準備」の前の信号に似た信号の出力を開始する必要があります。

Arduinoコード

Arduinoコードは、周波数カウンターと1分あたりの心拍数で心拍数を計算する方法で構成されています。周波数カウンタは、コンパレータからのパルスの幅を考慮し、200ミリ秒未満または800ミリ秒を超えるものをすべて拒否します。これにより、フォトレジスターが測定に使用されておらず、コンパレーターが2つの状態の間でハイ、ロー、または急速に切り替わる可能性がある場合に、誤ったデータが表示されるのを防ぐことができます。このコードは、偶発的な動きによって引き起こされた信号ノイズが原因で失われたパルスを除外するために、過去15秒間の心拍数の移動平均を維持します。

将来の改善

このプロジェクトの主な欠点は、パルスが使用間で同じ振幅になるようにフォトレジスターを保持することが難しいことです。センサーはパルス検出を周囲光に依存しているため、1日を通して光レベルを変更すると、異なる結果が生じる可能性があります。曇りの日にはコンパレータのしきい値が広すぎ、明るい日には二股のノッチが非常に顕著になり、誤ったパルス検出を引き起こす可能性があることに気づきました。さらに、部屋の動きによって引き起こされる微妙な光の変化でさえ、フォトレジスターによって検出可能です。一貫性の問題は、いくつかの異なる方法で対処できます。

センサーシステムは、一貫した光を提供するためにLEDを含むことができます。これは、診療所で使用される心臓モニタリングクリップや携帯電話で見られる心拍数モニターに似ています。フォトレジスターを反対側にして、赤いLEDを指先に当ててみました。結果は心強いものだったので、良いエンクロージャーを作ることができれば、これはおそらく実行可能なオプションです。

ソフトウェア側では、潜在的な解決策は、Arduinoで自動レンジングアルゴリズムを使用することです。それはパルスを検出し、それらの山と谷を見つけます。ただし、これでは心拍数の測定を実行するのに十分ではありません。適切な周波数カウンターには割り込みが必要です。割り込みがなければ、Arduinoのプロセッサは入力ピンをチェックしてパルスを見逃す以外に何か他のことをしている可能性があります。割り込みはデジタルピンでのみ利用可能であるため、オートレンジを実装する最良の方法は、デジタルポテンショメータを使用することです。 Arduinoは、アナログピンを使用してパルスが現れる範囲を見つけ、コンパレータのしきい値を決定し、デジタルポテンショメータを介してそれらを適用し、コンパレータからのデジタル信号を使用して周波数カウントを実行します。

コード

  • コンパレータcalcs.xlsx
  • Arduino心拍数カウンター
コンパレータcalcs.xlsx Arduino
このExcelスプレッドシートは、R3とR4の値を計算して、コンパレータの非対称しきい値を設定します。 R5列を測定された抵抗値に変更できます。 VlとVhは、心拍数からきれいな脈拍を得るのに必要なしきい値に変更する必要があります。
プレビューなし(ダウンロードのみ)。
Arduino心拍数カウンター Arduino
このコードは、コンパレータから送信されたパルスに基づいて心拍数を計算します。 setup(){attachInterrupt(digitalPinToInterrupt(INT0)、intrruption、CHANGE);カウンター=0; timeCount =0;頻度=0;低=false; Serial.begin(9600); total =15;} void loop(){timeCount =millis(); while(millis()-timeCount <5000){周波数=カウンター; } if(頻度> 3){合計+ =頻度;合計-=freqAvg; freqAvg =合計/ 3; } showHR(); counter =0;} void intrruption(){if(digitalRead(3)==0){fallDetect();低=真; } else if(digitalRead(3)==1){widthCheck(); }} void fallDetect(){pulseStart =millis();} void widthCheck(){long pulseEnd =millis(); if((pulseEnd-pulseStart> 200)&&(pulseEnd-pulseStart <800)&&low){counter ++;低=false; }} void showHR(){Serial.print( "心拍数="); Serial.println(freqAvg * 12); }

回路図

hr_monitor_tnffXlVQQV.fzz

製造プロセス

  1. 外部除細動器
  2. 人工心臓
  3. 人工心臓弁
  4. EKGマシン
  5. ペースメーカー
  6. ラズベリーパイで雷を検出する
  7. Windows 10 IoT Core –心拍数パルスの読み取り
  8. リモート心拍数モニター
  9. 単一の原子核の磁性を検出する
  10. 衣類モニターの心拍数に統合されたセンサー
  11. 心臓の健康はオイルフリーの圧縮空気から始まる