バイオセンシングモジュールを使用したヘルスフィットネスウェアラブルの開発

著者 Stephen Evanczuk

DigiKeyの北米担当編集者の提供

COVID-19(新型コロナウイルス感染症)による健康意識の高まりなどを背景に、バイオセンシングウェアラブルへの関心が高まっており、バッテリ寿命が延長された低コストの小型フォームファクタで優れた機能と高い精度を求めるユーザーのニーズを満たす、より効果的なソリューションに対する需要が高まっています。これは、厳しい市場投入までの時間や予算を満たそうとする際に、設計者に継続的な課題をもたらしています。一方、高度な機能統合やより包括的な設計ソリューションを含むバイオセンシングデバイスの進歩は、設計者のプラスになっています。

この記事では、バイオセンサやウェアラブルのトレンドと、設計者が直面する課題について説明します。次に、Maxim Integratedの心拍数および末梢酸素飽和(SpO2)バイオセンサモジュールを紹介し、バッテリ駆動モバイル製品の厳しい電力バジェットに妥協することなく、正確な心拍数や他の測定を提供できるウェアラブルをより効果的に実装できる方法を説明します。

バイオセンシングの設計要件

心拍数モニタリングはさまざまなコンシューマウェアラブルの主要要件ですが、SpO2測定への関心は高まりを続けています。以前は、SpO2測定は、主に運動選手がフィットネス管理を最適化するために使用していましたが、特にCOVID-19感染症に関連した呼吸機能の低下の症状を自己モニタリングするために、より広範に応用されるようになりました。開発者にとって、ウェアラブル電子機器に慣れている健康意識の高い人に適切なソリューションを提供することは、コスト、電力、フォームファクタ、重量の面で大きな課題となっています。

現在、多くのバイオセンサにはアナログフロントエンドサブシステムが内蔵されているため、開発者はヘルスフィットネス測定に必要な信号チェーンと後処理サブシステムを構築する必要がありません。ただし、これらの高度なデバイスの大部分では、ウェアラブルデバイスの機能が適切に組み合わされていません。その結果、スマートウォッチ、フィットネスバンド、完全ワイヤレスイヤホンなど、他の主要なウェアラブルと同様の目立たない小型バイオセンシングウェアラブルを求めるユーザーの期待に応えるためには、設計上の課題が解決されていません。

また、人気の高いウェアラブルタイプに1つ以上のバイオセンシング機能を追加する必要がある場合、設計統合に関連したさらなる課題が生じる可能性があります。他のすべてのタイプのモバイルバッテリ駆動パーソナル電子機器製品と同様に、最も小型の製品であっても消費者は暗黙のうちにバッテリ寿命の延長を求めており、一般的にはコストや機能だけでなくバッテリ寿命に基づいてそれらの製品を選択しています。

これらの複合的な要件を満たすために、開発者はカスタムデバイスの設計用にMaxim IntegratedのMAXM86146バイオセンシングモジュール、迅速な試作用にMAXM86146ベースのMAXM86146EVSYS評価システムを活用できます。

ドロップインソリューションを提供するバイオセンシングモジュール

4.5 x 4.1 x 0.88mmの38ピンパッケージで提供されるMaxim IntegratedのMAXM86146バイオセンシングモジュールは、ヘルスフィットネス用小型バッテリ駆動ウェアラブルの開発をスピードアップするために特別に設計されたドロップインソリューションです。バッテリ寿命の延長とバイオセンシング機能の両要件を満たすため、このモジュールは心拍数およびSpO2の迅速かつ正確な測定を維持しつつ、消費電力を最小化します。

2つの内蔵フォトダイオードに加え、モジュールにはMaxim IntegratedのMAX86141デュアルチャンネル光学アナログフロントエンド(AFE)、とMaxim IntegratedのMAX32660 Darwinマイクロコントローラのバイオセンシングに最適化されたバリアントであるArm Cortex-M4ベースのマイクロコントローラが含まれます(図1)。

Maxim IntegratedのMAX86146バイオセンシングモジュールの図(クリックして拡大)図1:Maxim IntegratedのMAX86146バイオセンシングモジュールは、小型パッケージ内に光学AFE、マイクロコントローラ、フォトダイオードを内蔵(画像提供:Maxim Integrated)

25サンプル/秒(sps)で10μAしか消費しない内蔵のMAX86141は、心拍数とSpO2の測定に使用される複数の発光ダイオード(LED)を制御するために設計された包括的な光学AFEサブシステムを提供します。光心拍数モニタは定期的に光電式容積脈波記録法(PPG)を使用して、心臓の各鼓動と関連した末梢血液量の変化をモニタリングします。この測定で、デバイスは、通常、波長540nmの緑色の光を使用します。緑色の光は他の多くの波長よりも組織内に浸透する深度が浅いため、この光は血液に吸収され、結果としてアーティファクト(人工物)が少なくなります。光学パルスオキシメータは赤色LED(標準660nm)と赤外線(IR)LED(標準940nm)の両方を使用して、ヘモグロビンとデオキシヘモグロビンの吸光度の差を測定します。これは、光学SpO2測定法の基盤となる技術です(市販部品を使用した低コストのパルスオキシメータの設計を参照)。

これらの光学測定を実行するために、開発者は、フォトダイオードの信号収集が、適切なLEDからの光出力パルスと精密に同期していることを確認する必要があります。MAXM86146モジュールに内蔵されたMAX86141 AFEは、LEDの制御用とフォトダイオードの信号収集用にそれぞれ別個の信号チェーンを提供します。出力側のAFEには、心拍数測定用の緑色LEDとSpO2測定用の赤色および赤外線LEDにパルスを送信するための3つの高電流、低ノイズLEDドライバが搭載されています。入力側のAFEは、2つのフォトダイオード信号収集チャンネルを提供し、それぞれに専用の19ビットA/Dコンバータ(ADC)が備わっています。これら2つの読み出しチャンネルは、別々に動作するか、放射面積を拡大するために組み合わせて使用されます。

AFE LEDとフォトダイオード信号チェーンを制御することにより、オンボードマイクロコントローラ上で実行されるファームウェアは、AFE設定を調整して、信号対ノイズ比(SNR)を最大化し、消費電力を最小化します。周辺光の変化にともなって、内蔵のMAX86141に組み込まれた周辺光補正(ALC)回路が照明条件の段階的変化に反応します。ただし、ユーザーが日陰と明るい太陽光の間を素早く通過する場合などの一部の状況では、周辺光が急激に変化し、ALCエラーが発生します。このような状況は通常よくあることで、これに対処するため、MAX86141にはピケットフェンス検出と置換機能が組み込まれています。ここで、デバイスは、周囲測定で以前のサンプルから大きく外れているものを特定し、その周辺光データサンプルを個別に、周囲レベルの比較的ゆっくりした変化と一致する外挿値で置き換えます。

モジュールのマイクロコントローラはそのファームウェアを使用してAFE操作を管理するため、正確な心拍数とSpO2の測定を実行するために必要な詳細な操作については、開発者は意識する必要がありません。このモジュールはファームウェア設定を使用してこれらの測定を自動的に実行し、システムホストプロセッサがモジュールのI2Cシリアルインターフェースを介してアクセスできるように、先入れ/先出し(FIFO)バッファに生データと計算結果を保存します。

MAX86146がウェアラブルハードウェア設計をいかに簡素化するか

広範な統合機能を備えたMAX86146バイオセンシングモジュールにおいて、正確な心拍数とSpO2の測定の提供を可能にする設計を完成させるのに必要な追加部品は比較的少数です。心拍数およびSpO2の同時測定において、MAX86146は、緑色、赤色、および赤外線のディスクリートLEDに接続されたMaxim IntegratedのMAX14689スイッチなどの外付け低ノイズアナログマルチプレクサと統合できます(図2)。

Maxim IntegratedのMAX86146バイオセンシングモジュールの図(クリックして拡大)図2:心拍数とSpO2の測定を同時に実行するために、Maxim IntegratedのMAX86146バイオセンシングモジュールは、適切なLED、アナログマルチプレクサ(MAX14689、左)、測定中の動きを検出するための加速度センサ以外には追加部品をほとんど必要しない(画像提供:Maxim Integrated)

さらに、MAXM86146は、3軸加速度センサからのモーションデータを使用して、心拍数測定中のユーザーの動きを補正し、ユーザーが短時間静止する必要のあるSpO2測定中に動きを検出するために設計されています。ここで開発者は、ファームウェアがサポートする加速度センサをMAXM86146のSPIポートに直接接続するか、汎用加速度センサをホストプロセッサに接続します。

ホスト接続オプションはデバイスの選択において優れた柔軟性を提供し、MemsicMC3630などの汎用3軸加速度センサ(25spsに対応)しか必要としません。それでも開発者は、加速度センサのデータが心拍数のデータサンプリングと同期することを確認する必要があります。このために、オンボードマイクロコントローラは、必要に応じて加速度センサのサンプルを内部的にデシメートまたは補間して、心拍数データと加速度センサデータの間のドリフトを補償します。

MAXM86146の評価と迅速な試作におけるクイックスタートの取得

MAXM86146はシステムハードウェア設計を簡素化しますが、MAXM86146の評価やアプリケーションの迅速な試作を求める開発者は、MAXM86146EVSYS評価システムを使用することにより、ハードウェア設計をスキップして、デバイスでの作業をすぐに始めることができます。USBまたは3.7Vのリチウムポリマー(LiPo)バッテリで駆動されるMAXM86146EVSYSは、フレックスケーブルによりBluetooth Low Energy(BLE)対応MAXSensorBLEメインデータ収集ボードに接続されたMAXM86146ベースのMAXM86146_OSB光センサボード(OSB)で構成されます(図3)。

Maxim Integrated MAXM86146EVSYS評価システムの画像図3:Maxim IntegratedのMAXM86146EVSYS評価システムには、BLE対応メインプロセッサボードやフレックスケーブルで接続されたMAXM86146ベースのセンサボードが搭載されている(画像提供:Maxim Integrated)

MAXSensorBLEボードは、Maxim IntegratedのMAX32620ホストマイクロコントローラおよびNordic SemiconductorNRF52832 Bluetoothマイクロコントローラを内蔵しています。実際、MAXSensorBLEボードは、BLE対応ウェアラブル設計の完全なリファレンス設計として役立ちます。アクティブおよびパッシブなサポート部品に加えて、MAXSensorBLEボードの設計は、ウェアラブルのバッテリ寿命を延長するために特別に設計されたMaxim IntegratedのMAX20303電源管理集積回路(PMIC)を完備しています。

MAXM86146_OSB光センサボードは、MAXM86146バイオセンシングモジュールを、心拍数とSpO2の同時測定を実行するのに必要なMAX14689アナログスイッチおよびLEDの完全なセットと組み合わせます。さらに、このボードは、 MAXM86146モジュールに直接接続された、ファームウェアがサポートする3軸加速度センサを内蔵しています。

MAXM86146EVSYS評価システムを使用してMAXM86146モジュールを評価するために、開発者はUSB-CやLiPoバッテリを使用してシステムの電源を入れ、必要に応じてBLE USBドングルをMaxim IntegratedのMAXM86146 EVシステムソフトウェアアプリケーションを実行しているパソコンに挿入します。このWindowsアプリケーションは、開発者がMAXM86146の設定を簡単に変更して、データプロットとして表示される結果を観察できるようにするグラフィカルユーザーインターフェース(GUI)を提供します。MAXM86146レジスタへのアクセスの提供に加えて、GUIはさまざまな動作モードや構成を設定するための直感的なメニューも提供します。たとえば、開発者はGUIモードタブを使用してさまざまなLEDシーケンスを設定したり(図4、上)、GUI構成タブを使用してそれらのLEDシーケンスを心拍数とSpO2の測定に適用したりできます(図4、下)。

Maxim IntegratedのMAXM86146 EVシステムソフトウェアGUIの画像図4:Maxim IntegratedのMAXM86146 EVシステムソフトウェアGUIにより、開発者はLEDシーケンス(上)などのさまざまな動作モードを定義して、MAXM86146の性能を評価できる。次に、それらのシーケンス(下)を心拍数とSpO2の測定に使用する(画像提供:Maxim Integrated)

カスタムソフトウェアの開発用に、Maxim Integratedは、Wearable HRM & SpO2 Algorithm for MAXM86146ソフトウェアパッケージを提供しています。MAXM86146は内蔵マイクロコントローラファームウェアを使用して心拍数とSpO2の測定を提供するため、デバイスからデータを抽出するプロセスは簡単です。Maxim Integratedのソフトウェアパッケージは、デバイスを初期化し、MAXM86146 FIFOから最終的にデータを読み取り、個別のデータアイテムを解析するための手順を示しています(リスト1)。

コピーする
typedef struct{
   uint32_t green_led_cnt;
   uint32_t ir_led_cnt;
   uint32_t red_led_cnt;
   uint32_t hr;
   uint32_t hr_conf;
   uint32_t spo2;
   uint32_t spo2_conf;
   uint32_t scd_state;
} mes_repor_t;
 
typedef struct {
   uint32_t led1;
   uint32_t led2;
   uint32_t led3;
   uint32_t led4;
   uint32_t led5;
   uint32_t led6;
} max8614x_mode1_data;
 
typedef struct {
   int16_t x;
   int16_t y;
   int16_t z;
} accel_mode1_data;
 
typedef struct __attribute__((packed)){
   uint8_t current_operating_mode; // mode 1 & 2
   // WHRM data
   uint16_t hr;                  // mode 1 & 2
   uint8_t hr_conf;              // mode 1 & 2
   uint16_t rr;                  // mode 1 & 2
   uint8_t rr_conf;              // mode 1 & 2
   uint8_t activity_class;       // mode 1 & 2
   // WSPO2 data
   uint16_t r;                   // mode 1 & 2
   uint8_t spo2_conf;            // mode 1 & 2
   uint16_t spo2;                // mode 1 & 2
   uint8_t percentComplete;      // mode 1 & 2
   uint8_t lowSignalQualityFlag; // mode 1 & 2
   uint8_t motionFlag;           // mode 1 & 2
  uint8_t lowPiFlag;            // mode 1 & 2
   uint8_t unreliableRFlag;      // mode 1 & 2
   uint8_t spo2State;            // mode 1 & 2
   uint8_t scd_contact_state;
} whrm_wspo2_suite_mode1_data;
 
void execute_data_poll( mes_repor_t* mesOutput ) {
 
[deleted lines of code]
 
  status = read_fifo_data(num_samples, WHRMWSPO2_FRAME_SIZE, &databuf[0], sizeof(databuf));
  if(status == SS_SUCCESS &&  num_samples > 0 && num_samples < MAX_WHRMWSPO2_SAMPLE_COUNT){  
 
  max8614x_mode1_data             ppgDataSample;
    accel_mode1_data                accelDataSamp;
    whrm_wspo2_suite_mode1_data     algoDataSamp;
 
    int sampleIdx = 0;
    int ptr =0;
    while( sampleIdx < num_samples ) {
 
      ppgDataSample.led1                 = (databuf[ptr+1] << 16) + (databuf[ptr+2] << 8) + (databuf[ptr+3] << 0);
      ppgDataSample.led2                 = (databuf[ptr+4] << 16) + (databuf[ptr+5] << 8) + (databuf[ptr+6] << 0);
      ppgDataSample.led3                 = (databuf[ptr+7] << 16) + (databuf[ptr+8] << 8) + (databuf[ptr+9] << 0);
      ppgDataSample.led4                 = (databuf[ptr+10] << 16)+ (databuf[ptr+11] << 8)+ (databuf[ptr+12] << 0);
      ppgDataSample.led5                 = (databuf[ptr+13] << 16)+ (databuf[ptr+14] << 8)+ (databuf[ptr+15] << 0);
      ppgDataSample.led6                 = (databuf[ptr+16] << 16)+ (databuf[ptr+17] << 8)+ (databuf[ptr+18] << 0);
      accelDataSamp.x                    = (databuf[ptr+19] << 8) + (databuf[ptr+20] << 0);
      accelDataSamp.y                    = (databuf[ptr+21] << 8) + (databuf[ptr+22] << 0);
      accelDataSamp.z                    = (databuf[ptr+23] << 8) + (databuf[ptr+24] << 0);
      algoDataSamp.current_operating_mode= (databuf[ptr+25]);
      algoDataSamp.hr                    = (databuf[ptr+26] << 8) + (databuf[ptr+27] << 0);
      algoDataSamp.hr_conf               = (databuf[ptr+28]);
      algoDataSamp.rr                    = (databuf[ptr+29] << 8) + (databuf[ptr+30] << 0);
      algoDataSamp.rr_conf               = (databuf[ptr+31]);
      algoDataSamp.activity_class        = (databuf[ptr+32]);
      algoDataSamp.r                     = (databuf[ptr+33] << 8) + (databuf[ptr+34] << 0);
      algoDataSamp.spo2_conf             = (databuf[ptr+35]);
      algoDataSamp.spo2                  = (databuf[ptr+36] << 8) + (databuf[ptr+37] << 0);
      algoDataSamp.percentComplete       = (databuf[ptr+38]);
      algoDataSamp.lowSignalQualityFlag  = (databuf[ptr+39]);
      algoDataSamp.motionFlag            = (databuf[ptr+40]);
      algoDataSamp.lowPiFlag             = (databuf[ptr+41]);
      algoDataSamp.unreliableRFlag       = (databuf[ptr+42]);
      algoDataSamp.spo2State             = (databuf[ptr+43]);
      algoDataSamp.scd_contact_state     = (databuf[ptr+44]);
 
      mesOutput->green_led_cnt           = ppgDataSample.led1;
      mesOutput->ir_led_cnt              = ppgDataSample.led2;
      mesOutput->red_led_cnt             = ppgDataSample.led3;
      mesOutput->hr                      = algoDataSamp.hr / 10;
      mesOutput->hr_conf                 = algoDataSamp.hr_conf;
      mesOutput->spo2                    = algoDataSamp.spo2 / 10;
      mesOutput->spo2_conf               = algoDataSamp.spo2_conf;
      mesOutput->scd_state               = algoDataSamp.scd_contact_state;
 
   /* printf(" greenCnt= %d , irCnt= %d , redCnt = %d ,"
                     " hr= %d , hr_conf= %d , spo2= %d , spo2_conf= %d , skin_contact = %d \r\n"
                     , mesOutput->green_led_cnt , mesOutput->ir_led_cnt , mesOutput->red_led_cnt
                     , mesOutput->hr , mesOutput->hr_conf , mesOutput->spo2 , mesOutput->spo2_conf , mesOutput->scd_state);
         */            
[deleted lines of code]

リスト1:Maxim Integratedのソフトウェアパッケージからのスニペットは、バイオセンシングモジュールから測定や他のデータを抽出するための基本的な方法を示す(コード提供:Maxim Integrated)

リスト1は、C言語ルーチン execute_data_poll() を使用して、MAXM86146から心拍数の数値とSpO2の測定値を返す方法を示しています。ここで、コードはローカルバッファ databuf にデバイスのFIFOを読み込んでから、いくつかの異なるC言語ソフトウェア構造のインスタンスに databuf のコンテンツをマッピングします。構成データと他のメタデータをそれらの構造インスタンスに保存することに加えて、ルーチンは最終的に mes_repor_t 構造のインスタンスである mesOutput で心拍数とSpO2の測定を提供します。開発者は最後の printf ステートメントをコメント解除するだけで、コンソール上で結果を表示できます。

ヘルスおよびフィットネスウェアラブルの実装において、MAXM86146ソフトウェアおよびハードウェアは開発を 大幅に簡素化します。ただし、米国食品医薬品局(FDA)の承認を得ることを意図したデバイスにおいて、開発者は最終製品のFDAレベルの性能を検証するための適切なテストを実行する必要があります。Maxim IntegratedのMAXM86146およびその組み込みアルゴリズムはFDAグレードの測定性能を提供しますが、開発者はセンサだけでなくシステム全体がFDAの性能要件を満たしていることを確認する必要があります。

結論

COVID-19感染症の症状モニタリングにおけるSpO2データの役割が最近注目されたこともあり、正確な心拍数とSpO2の測定を提供できるウェアラブルへの関心は引き続き高まっています。特殊なバイオセンサはこれらの測定を提供できますが、既存のソリューションの大部分は、多機能の小型ウェアラブルにおいてバッテリ残量を延長可能にするというデバイス小型化のニーズを満たすことができていません。この記事で説明したように、迅速な試作キットによりサポートされているMaxim Integratedの小型バイオセンシングモジュールは、最小限の消費電力でFDAグレードの測定を実現する効果的な選択肢を提供しています。

DigiKey logo

免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、DigiKeyの意見、信念および視点またはDigiKeyの公式な方針を必ずしも反映するものではありません。

著者について

Image of Stephen Evanczuk

Stephen Evanczuk

Stephen Evanczuk氏は、IoTを含むハードウェア、ソフトウェア、システム、アプリケーションなど幅広いトピックについて、20年以上にわたってエレクトロニクス業界および電子業界に関する記事を書いたり経験を積んできました。彼はニューロンネットワークで神経科学のPh.Dを受け、大規模に分散された安全システムとアルゴリズム加速法に関して航空宇宙産業に従事しました。現在、彼は技術や工学に関する記事を書いていないときに、認知と推薦システムへの深い学びの応用に取り組んでいます。

出版者について

DigiKeyの北米担当編集者