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

心拍数モニター(ECGを使用したウェアラブルおよびワイヤレス)

コンポーネントと消耗品

uECGデバイス
実際にBPMを測定する場合。 nRF24互換プロトコルを介してデータを送信できます
× 1
Arduino Nano R3
× 1
nRF24モジュール(汎用)
どのモジュールでもここで機能します。 uECGからBPMデータを受信するために必要です
× 1
Adafruit NeoPixelリング:WS2812 5050 RGB LED
× 1
LiPoバッテリー
200mAh以上の容量のバッテリー
× 1

必要なツールとマシン

>
はんだごて(汎用)

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

これは私の心臓モニタリングプロジェクトの2回目の反復であり、前のプロジェクトは胸部の心拍を示しており、ワイヤーを介してuECGに接続されていました。見た目はかっこいいですが、まったく実用的ではありません。現在オンになっているLEDの数が正確にわからず、通常の視野から外れており、uECGデバイスに配線で接続するとセンサー自体に多くの問題が発生します。 、したがって、実行すると基本的に機能しません。

このバージョンは、これらすべての問題を解決します。手首に装着しているため、道路を見ながら見ることができます。また、ワイヤレスであるため、測定値の歪みがなく、ランニングに効果的で、心臓の負荷を追跡できます。

<図>

1.コンポーネント

前のプロジェクトと同じように、すべてのハードワークはuECGによって実行されます。つまり、データを測定し、オンボードでBPMを計算します。また、ダイレクトリンクモードに切り替えると、一般的なnRF24チップと互換性のある無線プロトコルを介して、このすべての情報(ここでは使用していない高解像度のECGデータと一緒に)が送信されます。したがって、2番目に重要なコンポーネントはnRF24モジュールです。また、Arduino Nanoは、小さなLEDリングの下にぴったり収まるサイズなので、コントローラーとして使用しています(ただし、ここでは実際には何でも同じように機能します)。

2.回路図

nRF24モジュールの接続は簡単ではありません。すべてのSPIワイヤ(MISO、MOSI、SCK、CS)、チップイネーブルワイヤ、および電源を接続する必要があります。また、適度に小さいサイズにする場合は、すべてのピンヘッダーを取り外し、ワイヤーをパッドに直接はんだ付けする必要があります。したがって、nRFだけを接続するには、7本のワイヤと14個のはんだ付けポイントが必要です。幸いなことに、他のすべては単純です。LEDリングには1本のデータワイヤーと2本の電源線が必要で、さらに2本の電源線がバッテリーコネクタに接続されます。

<図>

接続リストは次のとおりです。
nRF24ピン1(GND)-ArduinoのGND
nRF24ピン2(Vcc)-Arduinoの3.3v
nRF24ピン3(チップイネーブル)-ArduinoのD9
nRF24ピン4(SPI:CS)-ArduinoのD8
nRF24ピン5(SPI:SCK)-ArduinoのD13
nRF24ピン6(SPI:MOSI)-ArduinoのD11
nRF24ピン7( SPI:MISO)-ArduinoのD12
LEDリング電源-Arduinoの5V
LEDリングGND-ArduinoのGND
LEDリングDI-ArduinoのD5
バッテリープラス(赤)-Arduinoの5V
バッテリーネガティブ(黒)-ArduinoのGND
(バッテリーにはコネクタが必要なため、取り外して充電できることに注意してください)

重要な注意:MOSI、MISO、SCKワイヤを他のArduinoピンに接続することはできません。 SPIハードウェアはD11、D12、D13にあり、そこに接続されていないと機能しません。他のすべてのピンは変更できます(プログラムで対応する変更を行う場合)。

3.プログラム

ここでのソフトウェアに関する唯一の複雑なことは、RFチャネル構成です。 uECGとnRF24がパイプアドレスに異なるビット順序を使用することに気付く前に、私はそれを機能させるためにかなりの時間を費やしました。それを修正すると、すべてがすぐに機能し始めました:)基本的に、着信パケットを読み取り、5番目のバイトをBPMとして使用し、それをフィルタリングします(RFチャネルはノイズが多いため、正しい読み取りではなくランダムな値を取得することがあります。互換性の理由から、ハードウェアCRCは無効になっています)。その後、BPMは色とアクティブピクセル数に変換され、それだけです。

  #include  
#ifdef __AVR __
#include
#endif
#include
#include
#include
#include
int rf_cen =9; // nRF24チップイネーブルピン
int rf_cs =8; // nRF24CSピン
RF24 rf(rf_cen、rf_cs);
//パイプアドレス-uECG側にハードコードされています
uint8_t pipe_rx [8] ={0x0E、0xE6、0x0D、0xA7、0 、0、0、0};
// ArduinoのどのピンがNeoPixelsに接続されていますか?
#define PIN 5
// Arduinoに接続されているNeoPixelの数は?
#define NUMPIXELS 16
Adafruit_NeoPixel pixel =Adafruit_NeoPixel(NUMPIXELS、PIN、NEO_GRB + NEO_KHZ800);
uint8_t swapbits(uint8_t a){// uECGパイプアドレスはスワップされたビットの順序を使用します
// 1バイトのビット順序を逆にします
uint8_t v =0;
if(a&0x80)v | =0x01;
if(a&0x40)v | =0x02;
if(a&0x20)v | =0x04;
if(a&0x10)v | =0x08;
if(a&0x08)v | =0x10;
if(a& 0x04)v | =0x20;
if(a&0x02)v | =0x40;
if(a&0x01)v | =0x80;
return v;
}
void setup(){
pixels.begin(); //これによりNeoPixelライブラリが初期化されます。
for(int i =0; i pixel.setPixelColor(i、pixels.Color(1,1,1));
}
pixel.show();
// nRF24は比較的遅いSPIを必要とし、おそらく2MHzでも動作します
SPI.begin();
SPI.setBitOrder(MSBFIRST );
SPI.beginTransaction(SPISettings(1000000、MSBFIRST、SPI_MODE0));
for(int x =0; x <8; x ++)// nRF24とuECGのパイプアドレスのビット順序は異なります
pipe_rx [x] =swapbits(pipe_rx [x]);
//無線パラメータを設定します
rf.begin();
rf.setDataRate(RF24_1MBPS);
rf.setAddressWidth(4);
rf.setChannel(22);
rf.setRetries(0、0);
rf.setAutoAck(0);
rf.disableDynamicPayloads( );
rf.setPayloadSize(32);
rf.openReadingPipe(0、pipe_rx);
rf.setCRCLength(RF24_CRC_DISABLED);
rf.disableCRC();
rf.startListening(); // uECGデータをリッスンします
// uECGは生データモードに切り替える必要があることに注意してください(長ボタンを押す)
//互換性のあるパケットを送信するには、デフォルトでBLEモードでデータを送信します
// nRF24では受信できません
}
long last_pix_upd =0;
byte in_pack [32];
int rf_bpm =0;
int bpm_hist [5]; // CRCを無効にしたため、受信データをフィルタリングする必要があります
void loop()
{
if(rf.available())
{
rf.read( in_pack、32);
int bb =in_pack [5]; // BPMはパケットの5番目のバイトにあります
//詳細なパケット構造はuECGドキュメントにあります
//互換性の理由からCRCがないため、フィルタリングする必要があります
//着信データ、無線チャネルはノイズが多い可能性があります。最後の5つを比較します
//受信したBPM値を比較し、5つすべてが同じである場合にのみ1つを使用します。
// uECGは1秒あたり約100パケットを送信するため、発生しません
//データ表示の顕著な遅延
for(int n =0; n <5-1; n ++)// bpm履歴配列を1シフトします
bpm_hist [n] =bpm_hist [n + 1];
bpm_hist [4] =bb; //新しいbpm値を追加します
for(int n =0; n <5; n ++)//すべてが等しいかどうかを確認します
if(bpm_hist [n]!=bb)bb =-1;
if(bb> 0)//はいの場合-新しく受信したBPMとして保存します
rf_bpm =bb;
}
long ms =millis();
if( ms --last_pix_upd> 10)//ピクセルをあまり頻繁に更新しない
{
int r、g、b;
last_pix_upd =ms;
int bpm =rf_bpm;
int max_bright =160; //最大輝度の値、最大255。ただし、常に最大であるとは限りません:)
float dd =25; //色調間の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; }
int on_pixels =(bpm-80)/ 8; //実行を目的としているため、
// 80 BPM未満のものは表示しません。このようにすると、
//高負荷領域でより敏感になります
for(int i =0; i {
//ピクセルは特別な理由なしに最後から最初に設定されますが、
//最初から最後に設定しても同じように機能します
if(i else pixel.setPixelColor(NUMPIXELS-i-1、pixels.Color(0、 0,0)); //他のすべてのLEDをオフにします
}
pixels.show();
}
}

4.リストバンドアセンブリ

すべてのワイヤーがはんだ付けされると、プログラムがフラッシュされ、uECGデータが受信されたことを確認します。すべてをまとめるときが来ました。

<図> <図>

私はそれをすべて一緒に保持するための非常に簡単な方法を選択しました-サーマルグルー。パーツ自体はすでにほぼフィットしているので(ナノは外輪サイズにフィットし、nRF24モジュールは内リングサイズにフィットし、バッテリーはどのパーツにもフィットしませんが、どういうわけか邪魔になりません-それがどのように機能するかはわかりませんが、私はただ接着しましたそこにあり、どういうわけかそれは本当に大丈夫でした:)それから私は手元にあるランダムなリストバンド(はんだ付けステーションパックから残った、はんだ付け中に接地するために使用されるバンド)にそれを縫いました、そしてそれはそれです!

<図>

5.テスト

テストのために、私は実行に行きました、そしてそれは1つの驚きを除いてうまくいきました。私は、192 BPMですべてのLEDがオンになるような設定を使用しました。これは、すべての推奨事項により、このような心拍数が私のパラメーターに対して高すぎるためです。驚いたのは、気付かずにほんの数分のランニングでそれを超えたことです。センサーエラーの可能性もあると思いましたが、停止してもすぐには下がらず、ゆっくりとリラックスしました(動きが少ないときはセンサーの信頼性は100%です)。したがって、しばらくの間、私は健康的なしきい値(少なくとも私の年齢/体重の標準的な成人にとって健康的であると思われるもの)をはるかに超えてトレーニングしていることがわかります。おもしろいです。私は子供の頃から(アマチュアの)スポーツに夢中になっていますが、10代の頃は心臓に問題があり、時間の経過とともに消えていくようでした。しかし、経験から、速い散歩よりも高い負荷は私にとって本当に難しいことを知っていますが、それでも私はトレーニングを続けました-そしてそれは時間の経過とともに私の限界を増やし、今では自分自身が非常に健康であると考えるようになりました。そして今、私は質問があります-思春期の心臓の問題のために私のBPMは通常よりもちょうど高いですか、それとも私はそれを認識せずに本当に強く押しすぎていますか?とにかく、私はそれを使って何かをしなければなりません-モニターの最大BPMを増やすか、それほど集中的にトレーニングしないでください。 :)

P.S.驚くべきことに、uECGはEMGセンサーとして非常に優れたパフォーマンスを発揮しました。これについては、私のロボットハンドコントロールプロジェクトで読むことができます

コード

  • bpm_watch.ino
bpm_watch.ino Arduino
 #include  #ifdef __AVR__ #include #endif#include  #include  #include  #include  int rf_cen =9; // nRF24チップイネーブルpinintrf_cs =8; // nRF24 CS pinRF24 rf(rf_cen、rf_cs); //パイプアドレス-uECGにハードコードされていますsideuint8_tpipe_rx [8] ={0x0E、0xE6、0x0D、0xA7、0、0、0、0}; //どのピンがArduinoはNeoPixelsに接続されていますか?#definePIN 5 // Arduinoに接続されているNeoPixelsの数は?アドレスはスワップされたビットの順序を使用します// 1バイトのビット順序を逆にしますuint8_tv =0; if(a&0x80)v | =0x01; if(a&0x40)v | =0x02; if(a&0x20)v | =0x04; if(a&0x10)v | =0x08; if(a&0x08)v | =0x10; if(a&0x04)v | =0x20; if(a&0x02)v | =0x40; if(a&0x01)v | =0x80; return v;} void setup(){pixels.begin(); //これによりNeoPixelライブラリが初期化されます。 for(int i =0; i  0)//はいの場合-新しく受信したBPMとして保存しますrf_bpm =bb; } long ms =millis(); if(ms --last_pix_upd> 10)//ピクセルをあまり頻繁に更新しない{int r、g、b; last_pix_upd =ms; int bpm =rf_bpm; int max_bright =160; //最大輝度の値、最大255。ただし、常に最大であるとは限りません:) float dd =25; //色調間のBPMの変化(青->緑->黄->ピンク->赤)float t1 =90、t2、t3、t4; // t1-「ベース」BPM、t1より低い場合は青になりますt2 =t1 + dd; t3 =t2 + dd; t4 =t3 + dd; //現在のt1 ... t4の範囲に応じて色を変更するためのコードif(bpm  

回路図

ドキュメントがありません。

nrf24_led_ring_o2Gij5oigT.fzz

製造プロセス

  1. ルネサスとアルトランは、3db AccessUWBを使用してウェアラブルチップセットを開発しています
  2. DIY環境と空気品質モニター
  3. PythonとRaspberryPiの温度センサー
  4. RaspberryPiを使用して自宅の温度を監視します
  5. リモート心拍数モニター
  6. Arduinoを使用してモニターをAmbilightにする
  7. Arduinoとスマートフォンを使用したDIY電圧計
  8. IoTを使用した心拍数モニター
  9. フォトレジスターによる心拍数の検出
  10. 衣類モニターの心拍数に統合されたセンサー
  11. CNC マシンを使用して作成された材料とコンポーネント