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

ECGを使用した心拍インジケーター

コンポーネントと消耗品

uECGデバイス
× 1
Arduino Nano R3
× 1
Adafruit NeoPixelリング:WS2812 5050 RGB LED
× 1
リチウムイオン電池1000mAh
× 1

必要なツールとマシン

>
はんだごて(汎用)

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

何年もの間、私は自分の心拍に合わせて点滅するLEDで何かを作りたかっただけです(そして、完全に静止しているときだけでなく、あちこちで拍をスキップしているときだけではありません)。それは驚くほど難しいことが判明しました、私は何年も試みて失敗しました。しかし、もうありません!

実際、すべての重労働はuECGによって行われます。これはオープンソースでArduinoに適した出力ピンを備えた小型のウェアラブルECGデバイスです(このピンは心拍ごとにハイ/ローになります)。これらのピン状態の処理は、ECG信号の処理よりもはるかに簡単であり、私はそれを最大限に活用しようとしました。
UPD:無線リンクを介してデータを受信するこのプロジェクトの2回目の反復を確認することをお勧めします。

1。回路図
ここではデジタル信号のみを扱っているので、とても簡単です。しかし、ウェアラブルとして、ほとんどの接続がはんだ付けされていると、はるかに信頼性が高くなります(そして小さくなります)。簡単なテストでは必要ありませんが、激しい活動中に着用する場合は、それを強くお勧めします。
回路図は次のようになります:

<図>
  • LEDリングのDIピンはピンD11(コードで構成可能)に接続されます
  • uECGデバイスのDRVピンはピンD3に接続されます(これも構成可能)
  • バッテリーの+はArduino5VおよびLEDリング5V入力に接続されます
  • バッテリー-ArduinoGND、リングGND、uECGのGNDに接続します

私はLiPoバッテリーを5V入力として直接使用しました-間違いなく、Vinに接続すると、確実に動作しません(Vinの電圧レギュレーターは電圧降下を引き起こし、ここでは絶対に余裕がありません)。重要なのは、入力電圧が3.4ボルトを下回らない限り、Arduinoは安定しているということです。 LiPoバッテリーは、完全に充電されると4.2ボルトで始まり、残りの充電が15%未満の場合にのみ3.4ボルトになります。したがって、200 mAhを超えるバッテリーを使用すると、適切な動作時間を得ることができます。それ以外は、バッテリーはいくつかのコネクターを介して接続する必要があることに注意してください:)回路図からバッテリーを切り離して、たまに充電したいからです。

2。コード
プログラムは単純な方法で動作します。プログラムは常にD3ピンを読み取り、変更が検出されると、その変更の時間を20要素の配列にプッシュします。最初の要素と最後の要素の差を20で割ったものが、ビートあたりの平均時間(ミリ秒単位)です。したがって、1分(60000ミリ秒)をその数値で割ると、BPM値が得られます。配列内の要素の数を調整できます。要素の数が少ないと応答は速くなりますが、結果の安定性は低下します(ビート検出で問題が発生すると、計算されたBPMが大幅に増加します)。要素の数が多いほどデータは安定しますが、BPMが速く変化すると応答が遅くなります。

次に、BPMはカラー(BPMが低から高に変わるときは青->緑->黄->ピンク->赤)とLEDの数にマッピングされます:80 BPMの場合は8セグメントがオン、110-11の場合など。 (スケールもコードで調整可能です。)

  #include  
#ifdef __AVR __
#include
#endif
// LEDリングのDIピン
#define PIN 11
//リング内のピクセル数
#define NUMPIXELS 16
// uECGを接続するための入力ピン
int in_pin =3;
Adafruit_NeoPixelピクセル=Adafruit_NeoPixel(NUMPIXELS、PIN、NEO_GRB + NEO_KHZ800);
void setup(){
pixel.begin(); //これにより、NeoPixelライブラリが初期化されます。
pinMode(in_pin、INPUT); //ピンを入力モードに設定します
digitalWrite(in_pin、1); //プルアップを有効にする:これは重要です。uECGには内部プルアップがありません
}
//最後の20個のハートビートを保存してBPMを平均します
//より高い値で信頼性が向上しますが、
//ただし、BPMが変更されると出力の変更を確認するのに時間がかかります
#define BEAT_HIST 20
long beats [BEAT_HIST];
void push_beat(long ms)//配列内のすべてのビートをシフトし、現在のビートを挿入します
{
for(int x =0; x {
beats [x] =beats [x + 1];
}
beats [BEAT_HIST-1] =ms;
}
int get_bpm()//最初のビートと最後のビートの時間差を使用
{
long dt =beats [BEAT_HIST-1] --beats [0];
long bpm =BEAT_HIST * 60000 / dt;
return bpm;
}
long last_pix_upd =0; //前回ピクセルを更新した日時を追跡する
int prev_in_state =0; //入力ピンの前の状態:状態の変化のみを処理したい
void loop()
{
long ms =millis();
int in_state =digitalRead(in_pin ); //ビートが検出されなかった場合は1、ビートは0
if(in_state ==1 &&prev_in_state ==0)//変更のみに反応
{
push_beat(ms);
}
prev_in_state =in_state;
if(ms --last_pix_upd> 10)//ピクセルをあまり頻繁に更新しない
{
int r、g、b;
last_pix_upd =ms;
int bpm =get_bpm();
int max_bright =120; //最大輝度の値、最大255。ただし、常に最大であるとは限りません:)
float dd =20; //色調間のBPMの変化(青->緑->黄->ピンク->赤)
フロートt1 =90、t2、t3、t4; // t1-「ベース」BPM、t1より低い場合は青になります
t2 =t1 + dd;
t3 =t2 + dd;
t4 =t3 + dd;
/ /現在のt1 ... t4の範囲に応じて色を変更するためのコード
if(bpm else if(bpm else if(bpm else if(bpm else {r =max_bright; g =0; b =0; }
if(in_state)//ビートがない場合は1/4の強度なので、ビートのみが強調表示されます
{
r * =0.25;
g * =0.25;
b * =0.25;
}
int on_pixels =(bpm + 5)/ 10; //使用されるLEDの数:60 BPMの場合、6つのLEDがオンになり、120〜12の場合など
for(int i =0; i {
if( i else pixel.setPixelColor(i、pixels.Color(0,0,0)); //他のすべてのLEDをオフにします
}
pixels.show();
}
}

3。ウェアラブルとしての組み立て
Arduinoをリングの内側に配置すると便利です。サイズとほぼ完全に一致します。バッテリーも近くに収まります。 uECGは胸に配置されることを忘れないでください。そのため、コネクタ付きのワイヤが必要です。最初にワイヤを配置し、次に他のコンポーネントと一緒にシャツを着て、コネクタを接続します。そうでなければ、それを着るのは本当に不便でしょう-私を信じて、私は試しました))

<図> <図> <図>

基本的にはこれで完了です。すべてが正しく行われた場合、すべてのコネクタを接続してから30秒以内に点滅が始まり、BPMが示されます。

4。フィールドテスト
ウォーキングやランニング中にテストしたところ、ランニング中にバッテリーがECGセンサーの真上で跳ね返り、読み取り値が歪むことがわかりました。少し動かしてみると、uECGとArduinoを接続するワイヤーが短すぎて、ステップごとにECGセンサーが引っ張られ、読み取り値が再び歪んでいることがわかりました。全体的に、私は歩いたり立ったりしているときだけ信頼できるビートを得ましたが、走っていませんでした-それでも私はそれを改善すると思います。センサー自体は、別のシャツで使用した場合、実行中もBPMを正しく表示しました(アプリで確認)。

また、胸のLEDはかっこよく見えるかもしれませんが、実際には役に立たないことがわかります。脈拍をチェックするために見下ろすのは本当に不便です。次のイテレーションでは、代わりにビートを示すある種のリストブレスレットを作成すると思います。

P.S. uECGプロジェクトに興味がある場合は、そのハッカデイページを確認できます。技術的な詳細、PCB設計、ディスカッション、プロジェクトログがたくさんあります

コード

  • uECG_pixel_ring.ino
uECG_pixel_ring.ino Arduino
 #include  #ifdef __AVR__ #include  #endif // LEDリングのDIピン#definePIN 11 //リングのピクセル数#defineNUMPIXELS 16 // input uECGintを接続するためのピンin_pin =3; Adafruit_NeoPixelピクセル=Adafruit_NeoPixel(NUMPIXELS、PIN、NEO_GRB + NEO_KHZ800); void setup(){pixels.begin(); //これによりNeoPixelライブラリが初期化されます。 pinMode(in_pin、INPUT); //ピンを入力モードに設定digitalWrite(in_pin、1); //プルアップを有効にする:これは重要です。uECGには内部プルアップがありません} //最後の20ハートビートを保存して、BPMを平均します//値が高いほど、信頼性が高くなります//しかし、より多くの時間がかかりますBPMが変更されたときに出力が変化するのを確認する時間#defineBEAT_HIST 20long beats [BEAT_HIST]; void push_beat(long ms)//配列内のすべてのビートをシフトし、現在のビートを挿入します{for(int x =0; x  10)//ピクセルをあまり頻繁に更新しない{int r、g、b; last_pix_upd =ms; int bpm =get_bpm(); int max_bright =120; //最大輝度の値、最大255。ただし、常に最大であるとは限りません:) float dd =20; //色調間のBPMの変化(青->緑->黄->ピンク->赤)float t1 =90、t2、t3、t4; // t1-「ベース」BPM、t1より低い場合は青になりますt2 =t1 + dd; t3 =t2 + dd; t4 =t3 + dd; //現在のt1 ... t4の範囲に応じて色を変更するためのコードif(bpm  

回路図


製造プロセス

  1. 外部除細動器
  2. 麺棒
  3. 人工心臓
  4. 人工心臓弁
  5. ボウリングピン
  6. RaspberryPiを使用したモーションセンサー
  7. RaspberryPiを使用して自宅の温度を監視します
  8. リモート心拍数モニター
  9. システムは、スマートスピーカーを使用して心臓リズムの非接触モニタリングを可能にします
  10. 電子タトゥーは、長期間の中断のない心臓モニタリングを可能にします
  11. ナックルジョ​​イントを理解する