はじめまして!ハニカムラボの漆館と申します。
電子回路設計や3Dプリンタなど、ハードウェア系のものづくりが得意です!
今回やること
ドップラーセンサを用いて、非接触で心拍を測定してみます。
センサは秋月電子で購入したドップラーモジュール(24GHz) IPM-165-A01を使います。
ドップラーセンサについて
ドップラーセンサとは、電波によって物体の動きを検出するセンサです。
センサから送信された電波が移動する物体に照射されたとき、ドップラー効果により物体から反射する周波数が変化します。
このときの周波数の差を検知して、物体の動きを取得します。
今回使用するIPM-165-A01は周波数が24 [GHZ]で、波長が約12.5 [mm]と短いため、微細な動きを検知することができます。
構成図
ドップラーセンサを胸部に向け、出力信号をADコンバータに入力しUARTでデータをPCへ送信、グラフで表示します。
今回使用するドップラーセンサの出力信号は、最大で399 [mVp-p]と小さい電圧のため、オペアンプ等で増幅する必要があります。
今回は、同じドップラーセンサで心拍検知をしている方12を参考に、増幅器を内蔵しているADコンバータMCP3425を使用します。
スケッチ
体動ノイズを除去するため、Filtersライブラリを使いハイパスフィルタをかけています。
#include <Filters.h>
#include <Wire.h>
#define MCP3425_address 0x68
#define configRegister 0b10011011
float Vraw;
float Vref = 2.048 ;
float filterFrequency = 2.0;
FilterOnePole filterOneHighpass(HIGHPASS, filterFrequency);
void setup() {
Wire.begin();
Wire.setClock(400000);
Serial.begin(115200);
Wire.beginTransmission(MCP3425_address);
Wire.write(configRegister);
Wire.endTransmission();
}
void loop() {
Vraw = (int)readADC() * Vref / 32767.0 ;
filterOneHighpass.input(Vraw);
float hpfVol = filterOneHighpass.output();
Serial.print(">HPF:");
Serial.println(String(hpfVol,5));
delay(10);
}
float readADC() {
Wire.requestFrom(MCP3425_address, 2);
return ( (Wire.read() << 8 ) + Wire.read() );
}
デモ
(机ごちゃごちゃですみません)
心拍と思われる波形が取れました!
ただ、呼吸による動きは除去しきれなかったため、動画では息を止めています。
まとめ
シンプルな構成で非接触での心拍取得ができました!
今後としては、
- デジタルフィルタの調整
- 心拍、呼吸、体動の分離
- 脈拍センサとの比較
- インタラクティブコンテンツへの応用
など行っていきたいなと考えています!
参考文献
- 作りながら学ぶArduino+=電子工作入門 - A-Dコンバータ その6 16ビットI2C MCP3425-(1)
- ものづくりとプログラミング日記 - 16ビットADコンバーターMCP3425(K-08018)
- リョーサンテクラボ - ドップラーセンサの原理 | ドップラーセンサとは - 第2回 -
-
ドップラー効果でバイタルを検知してみた
https://qiita.com/pokurin123/items/57af34a9bb68bbaf5817 ↩ -
ドップラーレーダーでバイタルセンシング(1)
https://analyticsai.wordpress.com/2018/06/19/%e3%83%89%e3%83%83%e3%83%97%e3%83%a9%e3%83%bc%e3%83%ac%e3%83%bc%e3%83%80%e3%83%bc%e3%81%a7%e3%83%90%e3%82%a4%e3%82%bf%e3%83%ab%e3%82%bb%e3%83%b3%e3%82%b7%e3%83%b3%e3%82%b0%ef%bc%88%ef%bc%91%ef%bc%89/ ↩