マルツTOP > APPLICATION LAB TOPページ おすすめ技術記事アーカイブス > バイオセンシングモジュールを使用したヘルスフィットネスウェアラブルの開発

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

著者 Stephen Evanczuk 氏
Digi-Keyの北米担当編集者 提供
2020-10-21

マルツ掲載日:2021-2-22


 新型コロナウイルス感染症(COVID-19)による健康意識の高まりなどを背景に、バイオセンシングウェアラブルへの関心が高まっており、バッテリ寿命が延長された低コストの小型フォームファクタで優れた機能と高い精度を求めるユーザーのニーズを満たす、より効果的なソリューションに対する需要が高まっています。

 これは、厳しい市場投入までの時間や予算を満たそうとする際に、設計者に継続的な課題をもたらしています。一方、高度な機能統合やより包括的な設計ソリューションを含むバイオセンシングデバイスの進歩は、設計者のプラスになっています。

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

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

 心拍数モニタリングはさまざまなコンシューマウェアラブルの主要要件ですが、SpO2測定への関心は高まりを続けています。以前は、SpO2測定は主に運動選手がフィットネス管理を最適化するために使用していましたが、特にCOVID-19感染症に関連した呼吸機能の低下の症状を自己モニタリングするために、より広範に応用されるようになりました。

 開発者にとって、ウェアラブル電子機器に慣れている健康意識の高い人に適切なソリューションを提供することは、コスト、電力、フォームファクタ、重量の面で大きな課題となっています。

 現在、多くのバイオセンサにはアナログフロントエンドサブシステムが内蔵されているため、開発者はヘルスフィットネス測定に必要な信号チェーンと後処理サブシステムを構築する必要がありません。ただし、これらの高度なデバイスの大部分では、ウェアラブルデバイスの機能が適切に組み合わされていません。

 その結果、スマートウォッチ、フィットネスバンド、完全ワイヤレスイヤホンなど、他の主要なウェアラブルと同様の目立たない小型バイオセンシングウェアラブルを求めるユーザーの期待に応えるためには、設計上の課題が解決されていません。

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

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

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

 4.5×4.1×0.88mmの38ピンパッケージで提供されるMaxim IntegratedのMAXM86146バイオセンシングモジュールは、ヘルスフィットネス用小型バッテリ駆動ウェアラブルの開発をスピードアップするために特別に設計されたドロップインソリューションです。

 バッテリ寿命の延長とバイオセンシング機能の両要件を満たすため、このモジュールは心拍数とSpO2の迅速かつ正確な測定を維持しつつ、消費電力を最小化します。

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


図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と赤外線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)。


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

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

 ホスト接続オプションはデバイスの選択において優れた柔軟性を提供し、MemsicのMC3630などの汎用3軸加速度センサ(25spsに対応)しか必要としません。それでも開発者は、加速度センサのデータが心拍数のデータサンプリングと同期することを確認する必要があります。

 このために、オンボードマイクロコントローラは、必要に応じて加速度センサのサンプルを内部的にデシメートまたは補間して、心拍数データと加速度センサデータの間のドリフトを補償します。

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

 MAXM86146はシステムハードウェア設計を簡素化しますが、MAXM86146の評価やアプリケーションの迅速な試作を求める開発者は、MAXM86146EVSYS評価システムを使用することにより、ハードウェア設計をスキップして、デバイスでの作業をすぐに始めることができます。

 USBまたは3.7Vのリチウムポリマー(LiPo)バッテリで駆動されるMAXM86146EVSYSは、フレックスケーブルによりBluetooth Low Energy(BLE)対応MAXSensorBLEメインデータ収集ボードに接続されたMAXM86146ベースのMAXM86146_OSB光センサボード(OSB)で構成されます(図3)。


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

 MAXSensorBLEボードは、Maxim IntegratedのMAX32620ホストマイクロコントローラとNordic SemiconductorのNRF52832 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、下)。


図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グレードの測定を実現する効果的な選択肢を提供しています。



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

 

このページのコンテンツはDigi-Key社より提供されています。
英文でのオリジナルのコンテンツはDigi-Keyサイトでご確認いただけます。
   


Digi-Key社の全製品は 1個からマルツオンラインで購入できます

※製品カテゴリー総一覧はこちら



ODM、OEM、EMSで定期購入や量産をご検討のお客様へ【価格交渉OK】

毎月一定額をご購入予定のお客様や量産部品としてご検討されているお客様には、マルツ特別価格にてDigi-Key社製品を供給いたします。
条件に応じて、マルツオンライン表示価格よりもお安い価格をご提示できる場合がございます。
是非一度、マルツエレックにお見積もりをご用命ください。


ページトップへ