心拍数は、人の健康状態を監視する上で最も重要なパラメータです。ウェアラブルデバイスの現代では、心拍数、血圧、足音、消費カロリーなどを測定できるデバイスがたくさんあります。これらのデバイスには、脈拍数を感知するための脈拍センサーが内蔵されています。今日は、PICマイクロコントローラーを備えた脈拍センサーを使用して1分あたりの心拍数と心拍数間隔をカウントします。これらの値はさらに16x2文字のLCDに表示されます。このプロジェクトでは、PIC16F877APICマイクロコントローラーを使用します。脈拍センサーは、患者監視システム用にArduinoと既に接続されています。
必要なコンポーネント
- PIC16F877Aマイクロコントローラー
- 20MHzクリスタル
- 33pFコンデンサ2個
- 4.7k抵抗1個
- 16x2文字LCD
- LCDのコントラスト制御用の10Kポット
- SEN-11574パルスセンサー
- ベルクロストラップ
- 5V電源アダプター
- ブレッドボードとフックアップワイヤー
パルスセンサーSEN-11574
心拍数を測定するには、脈拍センサーが必要です。ここでは、オンラインストアまたはオフラインストアで簡単に入手できるSEN-11574パルスセンサーを選択しました。メーカーから提供されたサンプルコードがあるため、このセンサーを使用しましたが、これはArduinoコードです。そのコードをPICマイクロコントローラー用に変換しました。
センサーは非常に小さく、耳たぶ全体または指先の心拍を読み取るのに最適です。丸いPCB側から直径0.625インチ、厚さ0.125インチです。
このセンサーはアナログ信号を提供し、センサーは3Vまたは5Vで駆動でき、センサーの消費電流は4 mAであり、モバイルアプリケーションに最適です。センサーには、24インチの長さのフックアップケーブルと最後にベルグオスヘッダーが付いた3本のワイヤーが付属しています。また、センサーにはベルクロフィンガーストラップが付属しており、指先で装着できます。
パルスセンサーの回路図もメーカーから提供されており、sparkfun.comからも入手できます。
センサーの回路図は、光学式心拍数センサー、ノイズキャンセリングRC回路、またはフィルターで構成されており、回路図で確認できます。R2、C2、C1、C3およびオペアンプMCP6001は、信頼性の高い増幅アナログ出力に使用されます。
心拍数モニタリング用のセンサーは他にほとんどありませんが、SEN-11574パルスセンサーはエレクトロニクスプロジェクトで広く使用されています。
PICマイクロコントローラーとインターフェースするパルスセンサーの回路図
ここでは、マイクロコントローラユニットの2番目のピンにパルスセンサーを接続しました。センサーはアナログデータを提供するため、必要な計算を行ってアナログデータをデジタル信号に変換する必要があります。
20Mhzの水晶発振器は、2つのセラミック33pFコンデンサを使用してマイクロコントローラユニットの2つのOSCピンに接続されています。LCDは、マイクロコントローラのRBポート間に接続されています。
心拍数モニターのPIC16F877Aコードの説明
コードは初心者にとっては少し複雑です。製造元はSEN-11574センサーのサンプルコードを提供しましたが、Arduinoプラットフォーム用に作成されました。マイクロチップPIC16F877Aの計算を変換する必要があります。完全なコードは、このプロジェクトの最後にデモンストレーションビデオで提供されます。また、サポートするCファイルはここからダウンロードできます。
コードフローは比較的単純で、 スイッチ ケースを使用して手順を実行しました。メーカーによると、2ミリ秒ごとにセンサーからデータを取得する必要があります。そのため、2ミリ秒ごとに関数を起動するタイマー割り込みサービスルーチンを使用しました。
switch ステートメントのコードフローは次のようになります。
ケース1:ADCを読み取る
ケース2:心拍数とIBIを計算する
ケース3:LCDにハートビートとIBIを表示する
ケース4:アイドル(何もしない)
タイマー割り込み関数内で、プログラムの状態をケース1に変更します。2ミリ秒ごとにADCを読み取ります。
そのため、 main 関数では、プログラムの状態とすべての スイッチ ケースを定義しました。
void main(){ system_init(); main_state = READ_ADC; while(1){ switch(main_state){ case READ_ADC: { adc_value = ADC_Read(0); // 0はチャネル番号です main_state = CALCULATE_HEART_BEAT; ブレーク; } case CALCULATE_HEART_BEAT: { calculate_heart_beat(adc_value); main_state = SHOW_HEART_BEAT; ブレーク; } case SHOW_HEART_BEAT: { if(QS == true){//ハートビートが見つかりました // BPMとIBIが決定され ました// Arduinoがハートビートを見つけたときに定量化された自己 "QS" true QS = false; //次回のためにQuantifiedSelfフラグをリセットします //0.9はより良いデータを取得するために使用されます。実際には使用しないでください BPM = BPM * 0.9; IBI = IBI / 0.9; lcd_com(0x80); lcd_puts( "BPM:-"); lcd_print_number(BPM); lcd_com(0xC0); lcd_puts( "IBI:-"); lcd_print_number(IBI); } } main_state = IDLE; ブレーク; ケースアイドル: { ブレーク; } デフォルト: { } } } }
PIC16F877Aの2つのハードウェア周辺機器であるTimer0とADCを使用しています。
timer0.cファイル内で、
TMR0 =(uint8_t)(tmr0_mask&(256-(((2 * _XTAL_FREQ)/(256 * 4))/ 1000)));
この計算は、2ミリ秒のタイマー割り込みを提供します。計算式は
// TimerCountMax-(((delay(ms)* Focs(hz))/(PreScale_Val * 4))/ 1000)
timer_isr 関数を見ると、それは-
void timer_isr(){ main_state = READ_ADC; }
この関数では、プログラムの状態は2msごとにREAD_ADCに変更されます。
次に、 CALCULATE_HEART_BEAT 関数がArduinoサンプルコードから取得されます。
voidcalculate_heart_beat(int adc_value){ シグナル= adc_value; sampleCounter + = 2; //この変数を使用してmSで時間を追跡します intN = sampleCounter --lastBeatTime; //ノイズを回避するために、最後のビートからの時間を監視します //脈波のピークとトラフを見つけます if(Signal <thresh && N>(IBI / 5)* 3){// 3/5を待つことによってジクロティックノイズを回避します最後のIBIの if(Signal <T){// Tはトラフ T = Signal; //脈波の最低点を追跡する } } …………。 ………………………..
さらに、完全なコードを以下に示し、コメントで十分に説明します。この心拍センサーデータは、クラウドにさらにアップロードして、どこからでもインターネット経由で監視できるため、IoTベースの心拍監視システムになります。詳細については、リンクをたどってください。
このPICパルスセンサープロジェクトのサポートCファイルをここからダウンロードします。