Explorer(IE)のバージョンをサポートしておりません。最適なウェブサイトパフォーマンスを実現するため、最新バージョンのブラウザへアップデートしていただくことをお勧めします。簡単な4つの検索方法1.検索したい用語を入力した後、そのままエンターキーを押すか、サーチアイコンをクリックしてください。入力された用語でそのまま検索されます。2.検索したい用語を入力すると、ドロップダウンで検索の提案が表示されます。提案された項目をクリックすると、関連のページが直接表示されます。3.検索の提案の右端にマウスを持っていくと「検索」のリンクが表示されます。これをクリックすると、提案された用語に基づく検索結果が表示されます。4.検索結果のページには、結果を絞り込むフィルタが表示されます。こちらもご活用ください。本コンテンツに関するお問合せはこちらはじめに今回は心電センサICを使って、ストレスを数値化してリアルタイムにグラフ表示するIoT作りに挑戦してみたいと思います。ストレスをグラフで可視化センサーICとして、アナログ・デバイセズ社のAD8232という心電モニタICが搭載されたモジュールを使います。AD8232は、微弱な生体信号から必要な信号を抽出し、増幅とフィルタ処理を行った結果をアナログ信号で出力します。NanoなどADC入力のあるマイコンボードを使えば、モジュールから簡単に心拍波形データを得ることが出来ます。心拍波形の揺らぎからストレスの指標を算出することが知られているため、その情報を活用してストレスを可視化します。心拍と言えば、「心拍数」が頭に浮かぶと思います。心拍数とは、一定の時間内に心臓が拍動する回数で、通常は1分間あたりの拍動数のことを指します。健康な成人の場合、安静時の心拍数は1分間に60~100回程度です。一方で「脈拍数」という言葉もあります。心臓から送り出される血液によって生じた拍動が動脈に現れたものが「脈拍」です。不整脈のない健康状態であれば「心拍数」=「脈拍数」となります。心拍数(脈拍数)の計測には主に「心電図法」と「光電脈波法」の2つがありますので、簡単に説明します。心電図法(ECG)心臓には洞房結節という部分があり、電気パルスを発生して心筋を収縮させることで周期的に拍動させています。心電図法は体の数箇所に電極パッドを付け、心臓から発生する微弱な電気パルスを捉えて測る方法です。今回のAD8232搭載モジュールはこの方式になります。心電図法の電極パッド光電脈波法(PPG)光電脈波法は、近赤外光を皮膚表面に当てて、反射した光をフォトダイオードなどで受光する方式です。動脈血管内のヘモグロビンが光を吸収する特性を利用し脈拍をセンシングしています。多くのウォッチ型のウェアラブルデバイスに採用されています。簡易的には、スマホ本体に搭載されているCMOSカメラを受光器、LEDフラッシュライトを発光源とした方法もあり、スマホさえあれば脈拍数を測定することが可能になっています。iPhone/Androidのアプリが複数あります。心拍数の計測については、手軽に測定できる光電脈波法で十分だと思います。一方で、波形を観測したときには2つの方法で精度に差が現れます。以下に「心電図による波形」と「光電脈波による波形」を示します。脈波波形のピークは心電波形のピークのように尖っておらず、心拍間隔の計測精度が低いことが分かると思います。心拍波形の揺らぎに関しては、心電波形を使った方が高い精度で測定出来るということです。(ただし、脈波波形が心拍波形の揺らぎに全く使えないわけではありません。脈波波形を2階微分した「加速度脈波」を用いた解析を用いるなどの手法もあります。)心電波形をもう少し長い時間で観測したときの図を示します。正常な心電図であれば、図のように周期的に同じ波形が現れます。Interval)と呼ばれており、ストレス指標を算出するための必要な要素となります。次のセクションではストレス指標とRRIの関係を説明します。意識の介在なしに制御するシステムで、「交感神経系」と「副交感神経系」があります。心身の鎮静化・エネルギーの消費抑制と蓄えの方向に働きます。心拍変動(HRV)は交感神経と副交感神経の両方に影響を与えます。Frequency)の2つの領域に注目します。LF成分は0.05Hz~0.15Hzまで、HF値は0.15Hz~0.40Hzまでの成分です。LF成分とHF成分は以下の特性を持っています。LF成分:交感神経または副交感神経が活性化しているときに増加HF成分:副交感神経が活性化している場合のみ増加つまり、2つの比であるLF/HFを指標としてみれば、数値が高いときはストレスがある、低いときはリラックスしていると判定できる仕組みです。全体システム今回はこちらのwebサイトを参考にして、ストレスを可視化するアルゴリズムを組み立てました。アルゴリズムは以下の通りです。使ってBLEを経由してPCまたはスマホで結果をグラフ表示します。Nano2の送信頻度は実力的に最小500msくらいが限界です。心拍波形データそのものをPCやスマホ側にリアルタイム送信するのは無理ということです。Nano2側で心拍のピーク検出と心拍間隔RRIを取得し、それをBLE送信することとします。線形補間、フーリエ変換、ストレス指標の算出はPC/スマホ側のブラウザを使ってJavaScriptでプログラミングします。AD8232搭載モジュールは電源とGNDさえ接続すれば、アナログ信号が出力されます。する電子部品も、すべて電子部品専門の通販サイトで購入が可能です。ピークを検出するにあたり、心拍波形がどんなものかを知る必要があります。そこでPCとシリアル通信でき、書き込みもでき、BLE通信にも対応できる回路にしました。ハンダ付けは一切不要です。Nano2と書き込み器の接続をジャンパー線で延長したと考えれば分かりやすいと思います。実際の結線はこのような感じです。センサパッドの貼り付け貼り付け位置は、腕と足に付ける方法と、胸の周囲に貼り付ける方法の2通りあります。付けやすい方を選択して下さい。センサケーブルにセンサパッドを付けてから貼り付けた方が良いと思います。赤、青、黒のそれぞれのパッドをできるだけ図に近い位置通りに貼ります。ハートマークは心臓を表しています。画像出典元:https://learn.sparkfun.com/tutorials/ad8232-heart-rate-monitor-hookup-guide心拍波形ピーク検出ピークを検出する方法として、閾値(threshold_v)を設けて判断するという最もシンプルな方法を取ります。連続誤検知防止で一旦検出したらしばらくは検出しない時間(threshold_t)も決め打ちで設定します。閾値を決めるために、まず実際の心拍波形を知る必要があります。Nano2へ書き込みます。プログラム全体をこちらからimportできます。場合はこちらからimportしてください。次にPC側でシリアルデータを受信して波形を出力します。自作して波形出力するアプリを作ることも可能ですが、既に世の中にあるアプリを活用します。IDEにはシリアルプロッタというツールがあり、シリアル受信したデータを波形として描画してくれます。このとき、Arduino側のプログラムは一切不要です。IDEをお持ちの方は最新のIDEをダウンロードしてください。IDEはこちらのサイトからダウンロードできます。選択すればダウンロード可能です。Nano2のシリアルポートを選択します。選択するとグラフが表示されます。右下の数値はボーレート(転送速度)を示しています。このグラフから、閾値threshold_vを650と決定しました。この閾値は各個人毎に異なりますので、グラフを見て適宜調整してください。次に時間ですが、シリアルプロッタの横軸の単位からは求められなさそうです。健康な成人の安静時脈拍数は60~100BPMで、周期に変換すると600ms~1000msです。このことから300msくらい取っておけば、一番尖っているR波形の横幅は十分に超えそうです。threshold_tを300と決定しました。シリアルプロッタのグラフ波形をよく観察しておいてください。腕を動かしたり、足を動かしたり、線をさわったり、大きく息を吸ったりしたときなど、波形にどのような影響がでるかチェックして下さい。ストレスを計測するためには数分のデータ蓄積が必要です。その際に異常波形にならないようにするためには、どのくらいまでなら体を動かしても影響が出ないのか、ここでしっかり感覚をつかんでおきましょう。先程得たthreshold_v:650とthreshold_t:300を使ってRRIを取得します。第6回までのMbedプログラムからの主な変更点を中心に説明します。今回新たに3つのグローバル変数を用意します。これまでのプログラムでは、200ms毎にBLEデータを送信していましたが、今回のプログラムではRRIが取得でき次第の送信に変更します。これまで使っていたタイマー200msは廃止し、代わりに時間をカウントするためのタイマーとして役割を変更します。TICKER_TIMEは200msから1msに変更します。Nanoプログラム:タイマー設定値変更タイマーのイベントハンドラは変数timer_numのインクリメントを行うのみに変更します。Nanoプログラム:タイマーイベントハンドラこれまでのプログラムではmain関数のwhileループにおいてwaitForEventでBLEイベント待ちのみでしたが、変更後はAD8232からの信号値をアナログ入力して条件が揃った場合のみRRI値をBLE送信しています。条件というのは、入力信号値が閾値threshold_v以上、かつ、前回のピーク検出からの時間経過がthreshold_t以上であることです。プログラム全体はこちらからimportできます。実際にPC側でBLE受信できるか確認してみましょう。第6回で使用したHTML/JavaScriptプログラムから3点変更しました。表示サブタイトルを変更プログラム全体をこちらからダウンロードできます。ZIP”ボタンを押してください。※HTMLファイル以外は前回と全く同じファイルです。Notify”ボタンをクリックしてBLE接続を行います。これで心拍間隔RRI(単位ms)を取得できました。線形補間で再サンプリングLFとHFを求めるためにフーリエ変換を行う必要がありますが、デジタルで計算を行うため、サンプリング間隔を一定にする必要があります。その際に使うのが線形補間です。この2つのグラフはX軸に経過時間[ms]、Y軸にRRIをプロットしたものです。上側グラフは、実際に取得したRRIを元にプロットしています。RRIの揺らぎがあるため、サンプリング間隔は一定ではありません。このままだとフーリエ変換できないため、一定間隔になるように再サンプリングを行います。再サンプリングの方法は複数ありますが、シンプルな方法である線形補間を採用しました。線形補間は実際のデータの隣接した2点間を結んだ直線から求める方法です。下側グラフが線形補間を行った後のグラフで、データが500[ms]毎に一定間隔でプロットされているのが分かると思います。y1)を見つけて、以下の計算を行っています。線形補間の式フーリエ変換でパワースペクトル再サンプリング出来たら、波形からパワースペクトルに変換します。パワースペクトルとは、横軸が周波数で縦軸が振幅です。各周波数における成分がどれくらいあるかを示しています。波形からパワースペクトルへの変換イメージ波形からパワースペクトルに変換するにはフーリエ変換を行います。離散フーリエ変換は以下の式です。離散フーリエ変換の式このままではプログラムで計算できないため、以下のオイラーの公式を使って、実部(Re)と虚部(Im)に分けます。以下のような式に展開できます。高速に離散フーリエ変換を行うFFTと呼ばれるアルゴリズムがありますが、今回はサンプリング周波数とサンプル数を少なく設定しているため、FFTを使わない離散フーリエ変換を行っています。ReとImをそれぞれ算出した後、周波数と振幅を求めることにより、パワースペクトルを得ることができます。周波数は以下の式で求まります。各周波数に対する振幅は以下の式で求まります。以下に示す周波数範囲にある振幅値の合計を出して、LFとHFを算出します。ストレス指標は以下の式で求まります。これでストレスの可視化ができます。RRIデータをBLE受信してから、再サンプリング・フーリエ変換・ストレス指標算出・グラフ表示を行うプログラムを作成しました。プログラムの詳細説明は割愛します。プログラム全体をこちらからダウンロードできます。ZIP”ボタンを押してください。※HTMLファイル以外は前回と全く同じファイルです。実際に実行して、数分経過するとLF/HFの値がグラフに表示されます。中央の大きな数値はRRIのリアルタイム値です。LF/HF値はその下の小さな数値とグラフの両方で表現しています。サンプリング周波数は2Hzとし、サンプル数Nは256としました。256個のデータが溜まるまではempty状態でLF/HFは表示されません。RRIが400~800の範囲を超えている場合は異常データとしました。(※この値は各個人で調整してください)異常なデータが来た場合はerrorとし、全てのデータをクリアして0から溜め直します。256個以上のデータが溜まったら、LF/HFが算出され出力されます。新しい心拍間隔データを受け取ったら、一番古いデータを捨て、再サンプリング・フーリエ変換・ストレス指標算出までの計算を行い、エラーが無ければ、ずっとストレス指標を出し続けます。注意点PCからUSB給電の場合、ノイズが混じってしまうためACアダプタは抜いて下さい。このようにモバイルバッテリーで給電させることが望ましいです。実際にリラックスした状態とストレスを与えた状態で、ストレス指標を実測してみました。条件は同じ姿勢で5分間、以下の状態を保ち続けることです。リラックス状態:リラックスするBGMを聴きながら目をつぶった状態ストレス状態:緊張するBGMを聴きながら、スマホで暗算アプリをひたすら解くこれを交互に3回繰り返したとき、それぞれのストレス指標の平均値結果がこちらです。※先のプログラムから約5分間のログを出してExcelで集計しました。ストレス指標の実測結果リラックス状態とストレス状態ではっきりと数値に差が出ました。リラックス状態時のストレス指標は0.9以下、ストレス状態時のストレス指標は1.2以上とキレイに分けることが出来ます。この結果は1人だけの結果なので、研究結果としては不足していますが、それなりにストレス指標と実際のストレスに相関がありそうだということが実感できました。今回は、ストレス指標算出及び実証実験を簡易的に行いましたが、興味のある方はもう少し深く研究してみると面白いと思います。日本語アナログ・デバイセズは、ウェブサイトの利便性を向上させるためにCookieを使用しています。弊社の会員サービスへ安全にログイン頂くための必要不可欠なCookieと、機能性を高めウェブサイトを最適化するためのCookieがあります。ウェブサイト上での活動データの収集は、弊社の製品およびサービスを改善するために使用されます。当サイトが提供できる最高のパフォーマンスと機能をお使いいただくために、クッキーを承認することをお勧めします。クッキーの詳細をご覧ください。プライバシーポリシーの詳細はこちらをご覧ください。承認して続ける承認して続ける使用されるCookieは、次のように分類されます。必要不可欠なCookie:analog.comの閲覧に必要、または機能的に提供される特定のCookieです。顧客情報をネットワーク送信するという目的に使用されます。お客様が要求するオンラインサービス(技術問合せ送信や、オンラインでの製品購入など)を提供するために必要不可欠です。分析/パフォーマンスCookie:これらのCookieにより、訪問者の数を認識してカウントし、訪問者がWebサイトをどのように移動するかなど、ウェブ分析またはその他の形式の情報を測定できます。これにより、たとえばユーザーが探しているものを簡単に見つけられるようにウェブサイト上のリンクを設定/調整するなど、ユーザビリティの改善に役立ちます。機能的Cookie:これらのCookieは、お客様が当社のウェブサイトに戻ったときにお客様を認識するために使用されます。これにより、コンテンツをパーソナライズし、個人設定(言語や地域の選択、会員サービスへのログイン情報など)を記憶することができます。これらのCookieの情報が失われると、サービスが機能しなくなる場合がありますが、ウェブサイトが機能しなくなることはありません。ターゲティング/プロファイリングCookie:これらのCookieは、当社のWebサイトへのアクセス、およびサービスの使用、アクセスしたページ、追跡したリンクを記録します。この情報を使用して、ウェブサイトとそこに表示される広告を顧客の興味に関連するものにします。その目的のためにこの情報を第三者と共有する場合があります。時間のないエンジニアの皆さんのために、セミナー情報や興味のある製品に関連したさまざまな技術情報を集めてタイムリーにお届けします。AnalogDialogueなどもご紹介しています。