【本サイトのご利用指針】
当サイトはSPAM対策等のためJavaScriptを使っています。
JavaScriptの実行を可能な状態にしてご利用下さい。
Please enable the execution of JavaScript!







































































【トランジスタ技術2006年01月号】 投稿記事『心電計の製作』

  【リンクフリー】 私設研究所ネオテックラボ Neo-Tech-Lab.co.uk
【記載者】 私設研究所Neo-Tech-Lab.com 上田智章
【最終更新日】2013年02月08日【更新日】2009年01月27日【掲載日】2006年05月27日
 
ここにチェックボックス型外部コンテンツ・メニューが入ります。




【ブラウザはGoogle Chrome】
●最新版ダウンロードはこちら

【お知らせ】

Windows7でChromeがフリーズを起こす場合は、コントロールパネル⇒管理ツール⇒サービス でWindows Media Player Network Sharing Serviceを停止かつ無効にします。Micorosoftのバグです。

【CQ出版インターフェース誌 連載】~個人で試せる!生体センシング実験室~

 心電計関連記事を2015年12月号から2016年5月号まで連載記事で書いています。
 CQ出版のインターフェース誌2015年12月号から連載を開始した『個人で試せる!生体センシング実験室』のサンプル・プログラムのダウンロード・サポートを行うためのサイトページは下記URLです。
連載記事のダウンロードページはこちら

  

【生体計測学習キット】第1弾:心電計ボード

 CQ出版から、近日発売予定です。製品単価は2万円前後の予定です。
 詳しくはCQ出版インターフェース誌のページをご覧ください。
      ●【心電計ボードのドキュメント】
  


【ルネサス センシングソリューション展 B2】

■2014年3月14日(大阪),18日,19日(東京)
 Smart Analogを非接触バイタル・センサへ応用する事例紹介
 PowerPoint資料のダウンロードサービスを行います。zip形式です。
 『静電容量型近接センサ』及び『Light Coding技術を用いた光学レンズを
 用いない赤外線モーション・非接触バイタルセンサ』
 ●イントロダクション (過去の取り組み:非接触画像センシング)
 ●静電容量式センサ
 ●赤外線式センサ
 ●赤外線式ハンドモーションセンサ
 ●Q&A

 そのうち暇を見つけて詳細な記事ページを用意します。

左側:IC101, 右側:IC500
●IC101:16ビットΣΔ-A/Dコンバータ(UART/SPI)+PGIA+温度センサ+電源+マルチプレクサ+フラッシュメモリ
●IC500:反転増幅/非反転増幅/差動増幅/IVコンバータが選択できるConfigアンプ3個+同期検波+LPF+HPF+温度センサ+OPアンプ1個+SPI

【静電容量式センサ】直列LCR共振回路のCをP板で構成。結合容量変化を捕捉。
【赤外線式センサ】単峰性赤外線レーザーを使ったLight Coding方式。レンズなしのフォトダイオードで環境光の10万分の1の反射量変化を捕捉。
【ハンドモーションセンサ】ドミソ(C4,E4,G4)の周波数でパルス変調した3光源とレンズなしのフォトダイオード。周波数ごとの振幅値から3次元座標を取得。


【目 次】

【トランジスタ技術2006年01月号】
心電計の製作

1) 【はじめに】
2) 【心電図波形の成り立ち】
3) 【体のどの2点間の電位差を測定するのか】『標準12誘導法』
4) 【心電図から何がわかる?】
5) 【1チャンネル心電計の製作】
6) 【微弱信号を増幅する際のくふう】
7) 【測定電極】
8) 【交流ノイズの除去方法】
9) 【ソフトウェア】
【Coming Soon】
10) 【入浴中の心電図を無拘束で観測できる浴槽心電計】
11) 【Kinectで赤外線脈波と呼吸を非接触モニタ】
12) 【】
13) 【】
14) 【】
15) 【】
16) 【】
17) 【】
18) 【】

【予告】この記事は古くなったのでもうすぐ再編集されます。

とりあえず旧記事のサルベージだけに留めました。時間を作って再編集する予定です。

【注意事項】

 本ドキュメントで紹介する製作物は、作り方や使用方法を誤ると人体に影響を及ぼす可能性があります。
バッテリー駆動やAC結合、光絶縁など、安全には万全を期していますが、電子工学および医学に対する十分
な知識と電子回路の製作経験が少ない方は決して製作しないで下さい。
                                 ☆Tomoaki Ueda☆ (上田智章)

【はじめに】

 心電計(ECG、Electrocardiograph)は、ドラマの中で登場したり、健康診断で使われたりと、
医療関連機器の中でもっともなじみ深い生体情報測定器の一つです。
 心電図は、心臓の電気的な活動によって体表面に出現する1.5mVPP程度の微弱な電圧波形を指します。
電圧が出るのなら…と、単純に増幅回路だけを使って、一般家庭の環境下で心電図の測定を行うこと
は意外に難しいのです。
 心電図の測定には、基線動揺や交流ノイズの除去、電気的絶縁対策など、ほかの測定分野に応用できる
技術的要素が多数含まれています。ここでは、心電図測定を行うための基礎知識を紹介した後、心電図を
測定してパソコンに波形を表示する1チャネル心電計(写真1)の作りかたついて説明します。

【備考】

★当初は、フォトカプラで製作してしていたものを出版社の要望により光ファイバに変更した回路でした。
 実際にはあり得ない回路であり、現状Visual Basic Ver.6.0も使えませんので、記事を別の物に差し替えます。
 現在、入浴中に無拘束で心電図をモニターする浴槽心電計の記事への差し替えを予定しています。
 これにより、平成元年度の技術情報から平成12、13年頃の私設研究所研究内容の技術情報に更新されます。
★専用A/Dコンバータは使用せず、PDM(Pulse Density Modulation)技術を使います。
 また、音声合成(μ-iVoice)の機能を付加し、iCloud対応にする予定です。
 CPUも使わず、Altera社製CPLD MaxIIシリーズEMP570T100C5を実装し、通信はUSBシリアル通信またはZigBeeで行います。

【図1】製作物の写真と計測ソフトウェアの起動状態


a) 心電図測定のようす                      d) ステンレス・アングルによる代用電極(ホームセンターで調達)


b) RS-232C⇔光シリアル変換ボード                          c) 心電計本体ボード


e) RS-232C⇔光シリアル変換ボードの裏面                     f) 心電計本体ボードの裏面


g) 測定データ表示用ソフトウェアのようす(言語:Microsoft社Visual Basic 6.0)
【捕捉事項】
 既に現在のOSではVisual Basic 6.0は動作しません。測定データ表示用ソフトウェアはVisual C#への移植をお願いします。
 Interface 2013年01月号『研究 人間センシング』第9章でExcel VBAで必要な殆どの信号処理アルゴリズムを記述しました。
 ダウンロード・サポートページもご利用ください。
 是非、そちらを参考にしてください。

【心電図波形の成り立ち】

なぜ体の表面に電圧が発生するのか
 心臓は心筋を収縮させることによって、血液を肺や全身に循環させるポンプとして機能する臓器です。
図1に示すように、心臓には左右に隔壁と弁膜で仕切られた心房と心室が備わっています。
 それ以外にも、心房と心室を構成する心筋を絶妙なタイミングで収縮コントロールするための電気的指令を出したり、
伝えたりする組織を備えています。洞結節と房室結節という二つの結節組織と興奮伝導路と呼ばれる神経がこれに当ります。
 電気的にコントロールするといっても、電子回路と違って、心筋の収縮指令は瞬時に伝わるわけではありません。
興奮状態の細胞が隣接する細胞を刺激して、順次、電気的興奮状態を伝播させるので、興奮が伝わるのに一定の伝播時間が
かかります。興奮状態にある細胞は分極しており、一種の電池のような状態(電流源)になっています。
 人体を構成する組織は、1kHz以下の周波数では誘電率の影響を無視でき、抵抗で置き換えて考えることができます。
表1に示すように組織ごとに固有の導電率をもっており、血液、筋肉、脂肪はもちろん、骨にも電流が流れる性質があります。
 図2に示すように、心臓内に興奮状態の部位(電流源)があると、抵抗性をもった周囲の組織には帰還電流が流れ、体表面
の任意の2点間には電位差が発生することになるのです。興奮状態の変化によって電流の向きや電流の発生場所が変われば、
体表面電位の極性や強さも変わります。体表面電位信号のうち、心臓内の電気活動状態に応じて変化する成分を心電図と呼びます。

心臓内の組織と心電図波形の関係
▲洞結節(SAノード)
 ペースメーカ細胞で構成された洞結節(SAノード)は、心拍リズムの起点となる電気的興奮を発生するいわば発振器で、
図3(a)に示すように興奮伝導路を通してその興奮を房室結節(AVノード)に伝えるとともに、心房心筋組織は右房から左房
へ順次興奮を伝えます。次に図3(b)に示すように、その興奮は心房心筋を収縮させて心室へ血液を押し出します。
▲房室輪
 心房と心室の間には、房室輪と呼ばれる膜があります。心房心筋の興奮は、心室心筋側に直接伝わらないように、房室輪
によって絶縁されており、心房が収縮して心室への血液の送り込みが完了するまでに、勝手に心室が収縮することがないよ
うになっています。
▲房室結節
 房室結節は伝導された興奮を遅延させ、心房の収縮が終わったタイミングで心室を収縮させる指令を発します。房室結節
が遅延させた興奮は、心室心筋側に唯一接続されている興奮伝導路であるヒス(HIS)束を通して心室側に伝わり、左右両
束に別れ、さらにプルキンエ繊維網へと細かくわかれながら心室心筋全体に興奮を伝導します。心筋に伝導された興奮は心
筋の収縮を促し、心室を収縮させます[図3(d)、図3(e)]。
 以上のように、心拍ごとに心筋内には興奮電流が位置や方向、分布を変えながら時間をかけて伝導しているのです。その
結果として、体表面の各部には電位差が発生し、変化します。
▲心電図の波形の名称
 図3に示すように、心電図は心臓の電気的な状態を反映しており、電気的な起点から順にP波、Q波、R波、S波、T波、
U波と呼ばれています。特にQ波からS波までの変化をQRS群、S波からT波開始付近までをSTセグメントと呼びます。




【図1】心臓の解剖図


【表1】生体組織導電率(数値が大きいほど電気抵抗が低く電流が流れやすい)
Geddes L, Baker L (1967) The specific resistance of biological material
---A compendium of data for the biological engineer and physiologist. Med.Biol. Eng. 5: 271-293



【図2】体表面で電圧観測できる理由                【図3】心電図と心臓の動きの関係

【体のどの2点間の電位差を測定するのか】

標準12誘導法
 心電図は心臓内の興奮電流に起因して発生する体表面電位差なので、体のどの2点間の電位差を測定するかで波形の形状が
大きく異なります。心電図測定方法は心電図を心臓病の診断に使うために標準化されており、標準12誘導法がもっとも多く
使われています。両手首と両足首に装着する電極を四肢電極、胸部に装着する電極を胸部電極と呼びます。健康診断で使わ
れる四肢電極は大きなクリップのような形をしていますが、ゴムのベルトで巻き付けるタイプもあります。
 標準12誘導は図4のように、合計4個の四肢電極(RA、LA、RF、LF)と6個の胸部電極(V1~V6)を使って測定します。
四肢電極は右手首がRA、左手首がLA、右足首がRF、左足首がLFと呼ばれます。心臓からもっとも離れている右足首
(RF)は基準電位をとるための電極として使います。

Ⅰ/Ⅱ/Ⅲ誘導と単極肢誘導
 四肢電極だけで測定する誘導には標準肢誘導(Ⅰ、Ⅱ、Ⅲ)と単極肢誘導(aVR、aVL、aVF)があります。Ⅰ誘導はLA-RA、
Ⅱ誘導はLF-RA、Ⅲ誘導はLF-LAとして単純に差を求める誘導方法です。
 単極肢誘導は、aVRがRA-(LA+LF)/2、aVLがLA-(RA+LF)/2、aVFがLF-(RA+LA)/2とし、対応する
四肢電極の電位から残りの2極の平均電位を差し引いた誘導法になっています。

胸部単極誘導法
 胸部単極誘導法は、(RA+LA+LF)/3を基準電位と考え、電極ごとに(胸部電極電位)-(RA,LA,LFの平均電位)を
求める誘導法です。各胸部電極の位置は骨格特徴によって決められており、V1,V2,V3,V4,V5,V6まであります。


【図4】誘導法の説明(どの電極を使って心電図をとるかを説明する図です。健康診断では標準12誘導法が使われています。)

【心電図から何がわかる?】

WPW症候群や不整脈
 前述した興奮伝導の過程は、健常者のものです。例えば、WPW症候群と呼ばれる先天性疾患の場合にはQRS群の
立ち上がりが早期に始まり、傾斜が長く続くので、図5(a)に示すようにデルタ波(⊿)と呼ばれる特有の波形が観測されます。
 不整脈の場合には、正常な心電図に混じって通常状態とは異なる形状の波が時々出現します。
 心臓の心筋に酸素を供給するための血管が血栓によって詰まりぎみの場合、運動による負荷がかかった直後の状態では、
心筋に十分な酸素を供給できない虚血状態に陥いり、STセグメントが通常の状態よりも下降するケースがあります。図5(b)
に下降する場合の波形を例示します。

心拍数
 心電図は心疾患の診断だけでなく、さまざまな分野で応用されています。R波とR波の間隔はR-R間隔と呼ばれますが、
60秒をR-R間隔で割れば心拍数が得られます。ダイエット運動でもっとも脂肪を燃焼させるのに適した運動負荷状態を維持
する目的で心拍数をモニタする場合などに使われます。

ストレスや運動能力
 R-R間隔は通常変動しているものなのですが、健康な人、若い人、リラックスしている人ほど、揺らぎの幅が大きい特徴
があります。その反対に、身体に大きな負荷がかかっている人、高齢者、ストレスがある人ほど、揺らぎが少ない傾向があり
ます。
 図6に事例を示します。軽い運動中のR-R間隔を測定し、横軸に今回の測定値を縦軸に一つ前の測定値を取り、1拍ごとに
ポインティングしていくと、R-R間隔は心拍変動に伴って揺らいでいるため分布は広がりを示すのですが、年齢が若いほど
揺らぎに幅があるため、図のような結果が得られました。年齢または運動能力を示しているかもしれません。


【図5】STセグメントの異常 踏み台昇降運動等で心臓に運動負荷をかけると心拍数が増加するので心筋に酸素を供給するために心臓の冠状動脈の血流も
増大するはずである。しかし、血栓があると十分に血流が増大できないために、心筋が酸素欠乏に陥りだす。この状態を
長時間放置すると心不全や心筋梗塞等の発作を引き起こすことになる。これを虚血性心疾患と言う。
虚血性心疾患の兆候は発作の数分前にSTセグメントの異常という形で心電図上に現れる。
運動中に心電図を常時モニターしていれば、危険な兆候を察知することができ、最悪の事態を事前に回避することが期待
できるのである。


【図6】入浴中の心電図から取得したR-R間隔のゆらぎマップ
Interface2013年01月号『研究 人間センシング』の第9章に記載の矩形波相関トリガ法を用いて、心電図のR波とR波の
間隔を信号処理によってリアルタイムに精密に求めることができる。この図は横軸を今回のR-R間隔、縦軸を前回のR-R間隔
とすることで、R-R間隔のゆらぎ状態を見る図である。
この図はある意味、怖い図で、年齢が若い程広範囲に柔軟に揺らぎ、高齢あるいは病気で重篤になるほど余裕がなくなり、
直線的にマップされてしまう。自分の余命があとどの位なのかわかりそうで相当怖い図なのです。

【1チャンネル心電計の製作】

簡単にするため今回は1チャネルの心電計を作る
 いよいよ電子回路について説明します。実用的な心電計は四肢電極と6個の胸部電極を備え、標準12誘導を
測定する機能を備える必要がありますが、本稿では電子回路の規模が大きくなるので、両手首(RA,LA)と
基準電極(RF)の3極を使って、標準肢誘導のⅠ誘導を測定する1チャネル心電計としました。

全体の構成と人体に電流が流れ込まないためのくふう
 図7に本心電計のブロック図を、図8に全回路図を、表2に部品表を示します。
(詳細な説明付き回路図はこちら)
一般に心電計は、人体に電流が流れ込むことがないように、心電アンプ部を電気的に絶縁する対策を施す必要
があります。本心電計では、交流電源から給電しているパソコンとのインターフェース接続を想定しており、
心電アンプ部の入力をAC結合にするだけでなく、信号入出力、電源、グラウンドのすべてを電気的に絶縁す
ることで、外部からの電流経路を遮断しています。
 具体的に説明します。十分な電気的絶縁を行うため本心電計はEIA-232インターフェースと心電計本体の
2つの基板に分かれています。両基板間はトスリンクという東芝製の光伝送インターフェースで結ばれていま
す。各基板の電源は、006P乾電池の9Vを3端子レギュレータにより5Vに変換して使っています。基板間の通
信は非同期で行うのでトスリンクはDCから使えるTOTX173,TORX173を採用しました。この独立した電源回路と光
通信インターフェースによって、人体とパソコンは電気的に絶縁された構成となっています。写真2にプリント
基板の外観を示します。パソコン側のEIA-232インターフェース基板の電源はACアダプタを使ってもかまい
ませんが、心電計本体基板の電源は交流電源からの保護のため必ず電池を用いて下さい。

トスリンクを用いたのには技術的理由はなく、記事掲載時のCQ出版社の要望によるものです。
しかしながら、電気的絶縁対策は省略せずに必ず行ってください。
他の機器の漏電や誘導雷等で感電をしないようにするために必要な最低限度の措置です。
通常はフォトカプラを用います。2つの電源パターンは十分な距離(絶縁距離)をおいて作らなければなりません。


【図7】心電計のブロック図

【図8】心電計の回路図

【微弱信号を増幅する際のくふう】

微弱信号を増幅する際のくふう
 心電アンプ部は、
  ・人体に測定電流が流れることを防止するためのAC結合入力をもった増幅率21倍の計装用アンプ
  ・基線動揺と呼ばれる生体電位特有のノイズを除去するための時定数1秒の積分器
  ・増幅率51倍の非反転増幅器
  ・ロー・パス・フィルタ
  ・人体電位の変動範囲がPICマイコンのA-Dコンバータの入力範囲(0~5V)内に入るように2.5Vを基準とする信号
に変換するためのアクティブ・グラウンド回路で構成されています。
 心電図の周波数帯域はDC~100Hz、電圧は1.5mVPP程度、周期は0.8s間隔程度の微弱な電気信号です。1000倍に
増幅すれば1.5VPP程度になります。ところが、AC結合部に使う金属皮膜抵抗の精度は1%なので、50mV程度の入力
オフセット電圧があります。さらにOPアンプにも出力電圧オフセットがあるため、この成分が10mV程度だとしても、
1000倍すると数10Vにもなってしまい、測定に支障が出てしまいます。また、呼吸をしたり、腕や胸の筋肉を動かした
りすると心電図には基線動揺と呼ばれるノイズが重畳します。このため、心電アンプではDC成分と基線動揺の除去を
行う必要から2段階で増幅を行います。
 計装用アンプの初段増幅率は10倍から30倍程度が好ましいと考えられ、本心電計では増幅率を21倍としました。次段
の積分器は、計装用アンプ出力を積分してリファレンスにネガティブ・フィードバックをかけています。これによって、
時定数と比べて長い時間の累積電圧が、常にゼロ(2.5V)となるようにコントロールされ、DC成分と基線動揺の除去を
行います。その後、非反転増幅器で51倍に増幅し、入力電位差をトータルで1000倍に増幅することで、心電図を1.5VPP
程度にし、PICマイコン内蔵A-Dの入力レンジからはみ出ないように工夫しています。
 ロー・パス・フィルタの周波数特性を図9に示します。PICマイコンのアンチエイリアスが目的なので、カットオフ
はもう少し低い(150Hzから250Hz程度)ほうが良いでしょう。
 アクティブ・グラウンド回路は、PICマイコンに内蔵のA-Dコンバータの入力レンジが0~5Vなので、グラウンド・
レベルを2.5Vにもち上げるための役割も兼ねています。2.5Vは抵抗分圧で作っています。抵抗分圧回路のダイオードは、
電源OFF時にコンデンサの電荷を放電するためのものです。
 図10に本心電計により測定した心電図を示します。

【図9】ローパスフィルタの周波数特性


a) 電極と人体の接触状態がよく、筋肉に力が入らずリラックスした状態の場合には比較的良好な心電図を計測することができます。

b) 電極と人体の接触状態が悪い場合や、各部の筋肉に力が入っている状態では混入ノイズが多く、きれいな心電図を得ることができません。
【図10】測定波形の例

【測定電極】

 医療の現場では、使い捨ての導電性ゲル電極や、銀-塩化銀電極、ステンレス電極などが使われています。
しかし、それらは非常に高価なもので、入手性も悪いです。今回は入手性や価格を重視して、ホーム・センタ
で調達できるステンレス製L型金具(写真2)を使用しました。
 ステンレス製ならパイプ状でも板状でもかまいません。銅やアルミニウム製の電極では、汗の塩分の影響を
受けて測定波形が不安定になるかもしれません。また、接触面積が少ないとノイズの原因になります。
 写真3に示すように電極はサポータや太めの輪ゴム、または洋裁用の平ゴムを少しきつめに手首や足首に巻き
つけ、挟み込んで体表面にしっかり固定して使います。電極を固定した直後は、ノイズが多いかもしれません。
人体に接触させてから時間が経てばノイズが少なくなると思います。ノイズが多いようなら、接触部分を石鹸で
洗い、皮脂を良く落としてみてください。
 測定中に力むと筋電図が乗るので、安静でリラックスした姿勢をとってください。RA、LAに対応する電極
は両手で握ってもかまいませんが、あまり力を入れないようにします。

【写真2】ステンレス製L型アングルを使った測定用電極


【写真3】電極の保持方法(サポーターを使う方法です。)

【交流ノイズの除去方法】

 一般家庭の壁や床にはAC100V電源が原因となる漏れ電流が流れており、心電図測定を行うと交流ノイズが
重畳します。しかし、本心電計には交流ノイズを除去するための電子回路を実装しておらず、病院で使うような
静電防止シートも使いません。A-D変換された生データを取り出せば交流ノイズがかなりの振幅で重畳している
はずです。今回は電子回路の規模を抑えるために、PICマイコンにノイズを除去させています。

ノイズ除去のアルゴリズム
 リスト1の処理をタイマ割り込み処理の中でリアルタイムに実行しています。図11にこのアルゴリズムの内容
を示します。商用周波数が60Hzであれば1秒間に1920回(約521μ秒)、50Hzであれば1秒間に1600回のタイマ割
り込み処理を行います。タイマ割り込みごとにA-D変換を行い、32段のFIFOに格納すれば、FIFOにはち
ょうどノイズ1波形分が入ります。FIFOへの入力データdinとFIFOの出力データdoutを使って、
   sum=sum+din-dout
を計算すれば、移動平均を求めることができ、ノイズの成分はちょうど1波分なので、sumからはノイズ成分が
相殺除去されるのです。sumには10ビット精度のA-D変換値が32=2^5回加算された値が格納されているので、
15ビットの値がタイマ割り込み処理ごとに得られます。FIFOは、データ・シフトに伴うデータ転送を避け
るためにポインタptrを使ってリング・メモリを構成することにより実現しています。このアルゴリズムはノイ
ズ振幅がA-Dの入力レンジに収まっている限り効果絶大です。
 トスリンクを介したEIA-232の最大通信速度は115200bpsですが、本心電計では19200bpsで使用しています。
このために間引き処理を使い、タイマ割り込みが4回発生したら1回データを送信しています。ただし、送信処理
がタイマ割り込みを妨げることがないように、送信バッファ空割り込みを使っています。ワード・データの1バイト
目はタイマ割り込み中で送信し、送信バッファ空割り込みを許可します。2バイト目は送信バッファ空割り込みで
送信し、送信バッファ空割り込みを非許可に戻します。

【アルゴリズム】

       Din = read_adc();           /* A/Dコンバータからデータを読み込む */
sum = sum - FIFO[ptr] + Din;/* 変化成分だけを使って移動平均を計算する */
FIFO[ptr] = Din; /* FIFOにデータを格納する */
ptr++; /* FIFOポインタを更新する */
if (ptr == nFIFO ) ptr = 0; /* FIFOの深さ(nFIFO)を超えたらポインタをクリアする */

【図11】ノイズ除去アルゴリズムの説明図
★心電図のノイズには、基線動揺、商用電源ノイズ(50/60Hzのハム)、筋電図の混入などがあるが、
このアルゴリズムは商用電源ノイズの周期性に着目して除去する方法です。ポインタで管理したFIFO
を利用することで、マイコンでもリアルタイムに除去が可能です。
Interface 2013年01月号『研究 人間センシング』第9章でExcel VBAで必要な殆どの信号処理アルゴリズムを記述しました。
ダウンロード・サポートページもご利用ください。
是非、そちらを参考にしてください。

【ソフトウェア】

 プログラムとアプリケーション・ソフトは公開しています。(lzh形式ファイルのダウンロードはこちら

PICマイコンのソフトウェア
 C言語で記述しています。CCS社製のコンパイラを使っています。プログラムはコメントを含めて70行程度の
サイズです。MPLAB IDEで使用できるようにプログラム・リスト、hex形式ともに公開します。
 通信コマンドは測定終了(00H)と測定開始(01H)の二つのコマンドしか備えていません。通信速度は19200bpsで、
1サンプル2バイトのデータを下位、上位バイトの順に、50Hz圏なら毎秒400サンプルで、60Hz圏なら毎秒480サンプル
で波形データを出力します。

パソコン上で結果を表示するソフトウェア
 測定結果をパソコンで表示するためのアプリケーション・ソフトは、Visual Basicで記述しました。
 Win32APIを利用してEIA-232入出力を行っています。
 使いかたは測定の開始と終了のボタンがあるだけの簡素なものです。
 ソフトウェアに少し手を加えればバイナリ形式なら波形データをファイルに落とすことができると思います。

【まとめ】

 心電図測定は、近年は医療だけでなく、高齢化社会を反映して独居老人の安否確認(布団や衣服に導電性繊維
を使って工夫)や、入浴中モニタとして注目されています。これを機会にほかの生体情報測定にもチャレンジして
行きたいと思います。

【スポーツ心電図】

インターフェース2013年1月号『研究 人間センシング 第9章』

【心電計アンプの特性と構造】

図1に典型的なUSB接続方式の心電計の回路ブロック図を示します。USBから給電されていますが、パソコンと心電計回路及びマイコンを電気的に絶縁するために絶縁型DC/DCコンバータとフォトカプラを使用しています。アナログ信号を絶縁する方法も存在しますが、デジタルで絶縁する方がローコストで済みます。


【図1】心電計の回路ブロックと心電図

●増幅率
図1に示されているように、心電図はP波、Q波、R波、S波、T波、U波からなり、健常者の心電図は概ね1.5mVpp程度の電圧振幅を有しています。但し、拡張性心筋症の患者では3mVpp程度の電圧振幅を示すケースがあります。このためA/D変換を行いやすい電圧レベルに増幅するために100倍から1000倍程度の増幅を行う必要があります。但し後述するように、心電図には『基線動揺』『電極オフセット電圧』など、様々なノイズが混入してくるので、増幅は1段で行わず、2段階に分離して行います。通常初段アンプは計装用アンプを用いて増幅率を10倍から30倍程度に設定します。
●バイアス電流
アンプが増幅を行うためには、測定対象からバイアス電流を奪わなければ動作しません。しかし、人体は電池ではありませんからバイアス電流が大きいと正しい心電図の測定を行うことができません。概ね、心電計アンプの初段のバイアス電流は1nA~1pAのものを使用します。
●周波数帯域幅
心電図が最も急激に変化するのはR波の時刻ですが、周波数スペクトルは概ね最大80Hz程度なので、心電計の帯域幅としてはDC付近から100Hzまであれば十分です。それ以上の周波数成分はノイズを含むだけなので、LPF(ローパスフィルタ)でカットします。
心電波形は電圧振幅が小さい上に、皮膚抵抗が10kΩと大きいため、商用電源に起因するハム・ノイズも大きく重畳します。しかし、ハム・ノイズはその周期性からソフトウェアで容易に除去を行うことができるので、アナログ回路部で無理に除去を行う必要はありません。
●基線動揺の除去とDCサーボ
P波の前あるいはU波の後ろの電位レベルを基線と呼ぶのですが、上記の電極位置の対策を行っても、激しい呼吸や手足の運動で『基線動揺』という大きなレベル変動を引き起こすため、この基線動揺を低減する回路が必要になります。図1の計装用アンプの出力に接続されている積分器がそのための回路です。正常な心拍数が1分間に60回~90回程度であるので、時定数を0.1秒~0.01秒程度に設定し、計装用アンプのリファレンスにネガティブ・フィードバックをかけます。基線変動があり、レベルが正方向に増加すると、積分器で累積加算され、ネガティブ・フィードバックにより符号が反転して基線変動を減少させる方向にリファレンス・レベルを変更します。反対に基線動揺でレベルが負方向に減少すると、積分器で累積加算され、ネガティブ・フィードバックにより符号が反転して基線変動を増加させるリファレンス・レベルを変更します。つまり、結果的に基線動揺を打ち消す方向に動作します。この回路はDCサーボと呼ばれます。
また電極材料として異種の金属材料や導電性ゲル等が使用されていると数mV程度のDCオフセットが発生します。このような場合にも初段増幅率を大きく設定していると、DCオフセットも増幅してレンジ・オーバーを招く結果となります。
基線動揺の除去や電極に起因するDCオフセットのキャンセルはソフトウェアでも行うことができますが、10mVを超える場合もあるので初段アンプで増幅後にアナログ回路で除去を行い、その後で残りの増幅を行う方がシステム的に有利です。

【心電アンプの具体的な設計事例】

図2にローコストな心電計アンプの設計事例を示します。
低価格のオペアンプLM358を3個で心電計アンプを構成している例です。初段差動増幅器(計装用アンプ)で21倍、DCサーボによる基線動揺除去後に100倍に増幅しています。
DCサーボと言うのは、積分器で1Hz~0.3Hz以下の周波数成分(直流成分)に関して累積加算を演算し、差動増幅器にその逆成分を戻すネガティブ・フィードバックを行うことで、DC成分を打ち消してくれる回路の事です。心電図には基線動揺と呼ばれるDCオフセットの変動がつきものなので、この回路は必須なのです。
心電図にはその他、高周波成分の筋電図(EMG)や商用電源ノイズ(50/60Hz)などが重畳します。心電図の有効周波数成分は1Hz~80Hz程度の範囲なので、カットオフ周波数100Hz~120Hz程度のローパスフィルタ(LPF: Low Pass Filter)で筋電図に関してはある程度の除去が可能です。
商用電源ノイズ(ハム)に関しては、後述のアルゴリズムでPICマイコン程度でもリアルタイムに除去が可能ですので、ノッチフィルタの必要性は全くありません。
医療用の心電計の回路では、自動体外除細動器(AED: Automated External Defibrillator)と呼ばれる電気ショックを与える装置の高電圧から、心電計の入力回路を保護するための回路が実装されていますが、スポーツ心電などではそれ程必要性はないと思います。しかし、静電気などから回路を保護するためにも実装した方が良いかもしれません。実際の保護回路はダイオードと抵抗を組み合わせて構成されている場合が殆どです。
このように、心電計といってもA/D変換までのアナログ回路はこの程度の規模で済みます。メーカーがその気になれば100~200円程度で作れる程度の回路です。


【図2】ローコストな心電計アンプの回路図の例

【電気安全対策について】

心電計を取り扱う場合に安全上必ず注意しなければならない事項に、接地漏れ電流、外装漏れ電流、患者漏れ電流Ⅰ、患者漏れ電流Ⅱ、患者漏れ電流Ⅲ、患者測定電流の項目があります。医療用機器でなく、スポーツ・エレクトロニクスで使用する機器であっても安全上は医療用機器と同レベルまたはそれ以上の対策を講じておく必要があります。医療機器分野では、測定対象者の事を用語上『患者』と表記する風習があります。体表面に電極を装着するスポーツ心電では、人体に流れる漏れ電流や測定電流を直流で10μA、交流で100μAの範囲に十分収まるように回路設計を行う必要があります。
図3に示すように、測定データの受け取り側のパソコンの電源環境とデータ通信の接続方法に応じて、心電計側の回路設計が変わることがわかると思います。内蔵バッテリー駆動のノートパソコンと接続するパターンが心電計側の電気絶縁対策を省略することができ、製作が容易であることがわかると思います。
あるいは、WiFi等のワイヤレス通信インターフェースを使ってリアルタイム・データ転送を行う方式も相手を選ばず有利です。

【定義】
【接地漏れ電流】アース線を流れる漏れ電流
【外装漏れ電流】機器の外装から操作する人体を介して流れる漏れ電流
【患者漏れ電流Ⅰ】体表面電極から人体を介して大地に流れる漏れ電流
【患者測定電流】体表面電極間に人体を介して流れる、生理学的な効果を意図しない測定用電流


【図3】電気絶縁対策の事例紹介

【スポーツ心電の電極に関して】

●スポーツ心電測定用電極の位置
また、歩行時やジョギング中、あるいは他のスポーツを行っている最中の心電図を計測する場合には、医療用の心電図計測方法では腕、太腿、腹筋などの筋電図が重畳しやすく、障害となるため、電極位置は心臓に近い胸部位置あるいは腕の付け根、両腰の骨盤位置に貼り付けることが多いです。
但し、歩行やジョギング等の比較的軽度の運動の場合に、心電図計測から心拍タイミングや呼吸曲線を取得する場合には、ソフトウェアでノイズを除去することも可能ですので、リストバンドに測定回路を仕込んで、ケース裏面に電極を設けるのも一手です。


【図4】スポーツ心電とリストバンド型生体計測装置

【ハム・ノイズ除去方法】

心電図は健常者の最大ピーク電位が1.5mVpp程度の微弱な信号であり、皮膚抵抗が10kΩと高いこともあり、商用交流電源の漏えい電流に起因するハム・ノイズが重畳するケースが多く、接地アースの取れない一般家庭内で計測を行うと殆どのケースで大きなハム・ノイズが混入します。
このような場合に備え、A/Dコンバータのサンプリング速度を50Hz/60Hzの整数倍の速度に設定しておき、以下に示す、ハム・ノイズ除去方法を用います。
図5に示すリングメモリFIFO(First-In First-Out)アルゴリズムは、ポインタの管理により、データ転送処理負荷が小さなFIFOアルゴリズムを説明する図です。FIFOとは所定個数分のデータを一定時間幅分だけ蓄積をおこない、最初に到着したデータを一定時間経過後に取り出していくメモリです。トコロテンの突出し器が説明に使われます。FIFOのメモリ段数をnFIFO、書込み/読出しポインタをptrとします。ptrは0からnFIFO-1の値を取り、初期値を0とします。新規データが到着すると、①ptr位置からデータを取り出し、②ptr位置に新規データを書き込み、③ptrをインクリメント(+1)、④ptrがnFIFOになればptr=0とする。この①から④を所定周期で実行します。
このFIFOへのデータ更新速度がハム・ノイズの基本周波数(50Hz/60Hz)の整数倍mである場合には、FIFOの内部にはちょうどm波分の波形が収まります。このm波分の平均を取ればsin波状のハム・ノイズは相殺されることになります。
しかし、毎回、nFIFO個のデータを加算平均するのは演算負荷を食ってしまいます。そこで図6のように前回の累積加算演算結果sumを用いてデータの入出力の結果発生する変化分を求めてsumを更新します。この場合、FIFOに格納されているデータは加減算によって誤差を生じない整数値である必要があります。最初に1回だけ1/nFIFOを求めておき、sumに毎回乗じて加算平均値aveを得ます。
sum = sum + din –dout;
ave = sum * keisu; ( 最初にkeisu = 1/nFIFO; を求めておく)
ハム・ノイズ除去前の生波形を図7に、除去後の波形を図8に示します。効果はご覧の通り明らかです。簡単なソフトウェアだけで商用電源ノイズ除去を行うことができるので、アナログ回路にはノッチフィルタは不必要なのです。
このアルゴリズムは加減算だけなので、PICマイコン程度でもリアルタイムにノイズ除去を行うことができます。

【図5】リングメモリFIFO(First-In First-Out)アルゴリズム


【図6】ハム・ノイズ除去アルゴリズム


【図7】ノイズが混入した心電図


【図8】ノイズ除去後の波形

【心拍のタイミングを精確に捉える】

心電図の解析で有用な情報はR波を基準とすることで多く得ることができます。
心拍の間隔(R-R間隔:R波ピークと次のR波ピークまでの時間)は、呼吸によって顕著に揺らぐ性質があります。即ち、各心電波形のR波の中心時刻を精確に捕捉することができれば、R-R間隔を基に呼吸曲線を得ることができます。
しかしながらR波の中心時刻をレベルトリガで捉えようと考えると、個人差の壁に突き当たります。実は、R波の後続のT波ピークの高さが非常に高い人がいるからです。図9に心電図の測定事例を示します。①と②は健常に近い人の事例ですが、③は心不全を起こしたことのある人の事例、④はペースメーカーを埋め込んでいる人の事例です。このようにR波の時相をレベルトリガで捉えるのは問題が存在しています。また、図10に示すようにR波自体も変動するためレベルトリガでは時相を精確に捕捉することはできません。

【図9】心電図の測定事例


【図10】R波の変動

【矩形波相関トリガ法】

そこで考えた処理方法がQRS群(Q波、R波、S波をひとまとめの波形として扱う場合の名称)が負正負の極性を持った波形であることを利用する方法です。QRS群は60mS~80mS位(★R波は約その半分)の時間幅の波形であり、T波はそれに比べれば数倍長く、ペースメーカの信号は数mS以下の非常に短いパルス信号です。そこでQRS群を負正負の符号を持ち、1:2:1の時間幅であり、振幅を-1, +1, -1の信号であると近似します。
仮にサンプリング周波数を1mSとし、QRS群の時間幅を64mSとすると、模擬Q波、S波の時間幅は16mS、模擬R波の時間幅は32mSとなります。ハム・ノイズ除去の項で登場したリングメモリFIFOを使って、ポインタを3つ使えば、模擬QRS群と実測心電波形のリアルタイム相関フィルタを構成することができます。
わかりやすく説明するために、16サンプル幅のケースで説明を行います。各時刻のサンプルをDjで表現すると相関値sumは下記の様に計算することになります。
   sum = -(D0+D1+D2+D3) +(D4+D5+D6+D7+D8+D9+D10+D11) -(D12+D13+D14+D15);
   sum = -(D1+D2+D3+D4) +(D5+D6+D7+D8+D9+D10+D11+D12) -(D13+D14+D15+D16);
   sum = -(D2+D3+D4+D5) +(D6+D7+D8+D9+D10+D11+D12+D13) -(D14+D15+D16+D17);
   sum = -(D3+D4+D5+D6) +(D7+D8+D9+D10+D11+D12+D13+D14) -(D15+D16+D17+D18);
これを毎回計算すると演算負荷が膨大となるので、前回演算したsumを使って差分のみ計算を行います。
すると、
   sum = sum + D0 -2×D4 + 2×D12 –D16;
   sum = sum + D1 -2×D5 + 2×D13 –D17;
   sum = sum + D2 -2×D6 + 2×D14 –D18;
というように演算負荷は縮小します。演算誤差を発生しないように、この演算は整数で行います。また、乗算がありますが、値を2倍するのは1ビット左シフトを行うことで容易に行うことができます。
次のような手順で行います。
【初期化処理】
 ①FIFOを0クリア
 ②nF4=nFIFO/4; Ptr1=0; Ptr2=3*nF4; Ptr3 = nF4;
 ③sum = 0;
【毎回の処理】
 ①Din←時刻jの心電図測定値Dj
 ②sum = sum +Din -2*M(Ptr2) +2*M(Ptr3) –M(Ptr1);
 ③M(Ptr)=Din;
 ④Ptr1++; if (Ptr1==nFIFO) { Ptr1 =0; }
 ⑤Ptr2++; if (Ptr2==nFIFO) { Ptr2 =0; }
 ⑥Ptr3++; if (Ptr3==nFIFO) { Ptr3 =0; }
以上のようにして、上述の矩形波との相互相関処理を行い、そのピーク時相をR波の中心時相とすることで正確にR波の出現時刻を捕捉することができます。少々基線動揺が残留していたり、ハムノイズが混入していてもこのフィルタ処理は有効に機能します。図12上に軽運動時の健常者、図12下に通常の入浴中の心疾患患者の心電波形と矩形波相関トリガの結果を示します。基線動揺に影響することなく、QRS群の捕捉が行えていることがわかります。

【図11】模擬QRS群とする矩形波の形状


【図12】矩形波相関トリガ法の処理結果の事例

【呼吸とRR間隔】

図13上にRR間隔のプロットを、図13下に医療用呼吸センサ(鼻にサーミスタを固定し、呼吸に伴う温度変化を捉えるセンサ)のプロットを示します。ご覧のように、呼吸センサを使わなくても、心電図から呼吸曲線が得られることがわかると思います。

【図13】RR間隔と呼吸曲線の比較

【短時間の加算平均心電図】

矩形波相関トリガ法でQRS群の精確な出現時相がわかるので、QRS群を基準として数波~10波程度の短時間の加算平均を行うことで、ノイズを抑制した心電図を得ることができます。図14に事例を示します。図12に下段の心電図を処理することで得られたデータです。

【図14】矩形波相関トリガを用いた短時間加算平均心電図の事例

【虚血性心疾患の兆候を5分前に見ることができる運動負荷心電図】

スポーツ心電図ではこのように矩形波相関トリガを使って、運動中の心電図を観測することにより、呼吸や心拍数を観測することができますが、短時間加算平均心電図から各部の縦方向のレベル変化も観測することができます。図15は異常心電図の例ですが、下段のようにSTセグメント(S波とT波の間)のレベル変化も捉えることができます。
上段は先天性刺激伝導路異常であるWPW症候群で見られるデルタ波という波形の例です。
下段は虚血性心疾患で冠状動脈の血栓が原因で運動負荷時に発生する虚血(心筋の酸素欠乏)によって発生するSTセグメントの異常例です。

【図15】異常な心電図の例

【浴槽心電計】

 

【浴槽心電計】

完全な純水は電気抵抗が高く電気が流れる事はありませんが、普通の水道水や井戸の水にはわずかに塩分が溶け込んでいるため電気が流れます。風呂のお湯には汗の成分も加わるので、浴槽側面にステンレス製の電極を図16のように配置することで、湯水を介して無拘束状態で入浴中の心電図を測定することができます。但し、電極面積や浴槽の大きさ、湯水の量、塩分濃度によって影響を受けます。ピーク電圧は通常の心電図が1.5mVppであるのに対して、350μVpp~900μVpp程度となります。
また、浴槽表面は非金属製(非導電性)のバスタブである必要があります。
図17に測定用ステンレスワイヤ電極を例示します。
図18に浴槽心電図の実測波形の例を示します。このように、入浴中でも無拘束で心電図をリアルタイム観測することが可能です。日本では、毎年浴室で亡くなられる方が1万4千人以上おられ、現象を続ける交通事故死者数の数倍にあたることから考えても、家庭内とはいえ、浴室は非常に危険な領域であると言えます。約半数は浴槽内で溺死、残りは洗い場で転倒状態という形で発見されていますが、浴槽内の事故原因の半数は虚血性心疾患の発作が、残り半数は体が温まり過ぎて末端の毛細血管が開き低血圧が原因であるといわれています。
虚血性心疾患では、発作の5分前にSTセグメントの下降が観測されるとされていますので、検出後出湯を施せば溺死を防ぐことができます。また、低血圧の方は単純に長時間入り過ぎているのですから、熱い湯に5分以上入らなければ事態を回避することが可能です。

【図16】浴槽心電計の電極配置位置


【図17】ステンレスワイヤ製電極


【図18】浴槽心電図の実測波形の例

【RR間隔を使った揺らぎマップ】

R-R間隔は通常変動しているものなのですが、健康な人、若い人、リラックスしている人程、揺らぎの幅が大きい特徴があり、その反対に身体に大きな負荷がかかっている人、高齢者、ストレスがある人程、揺らぎが少ない傾向があります。図19に事例を示します。軽い運動中のR-R間隔を測定し、横軸に今回の計測値を、縦軸に1つ前の計測値を取り、1拍毎にポインティングしていくと、R-R間隔は心拍変動に伴って揺らいでいるため分布は広がりを示すのですが、年齢が若いほど揺らぎに幅があるため、図のような結果が得られました。年齢あるいは運動能力を示しているかもしれません。

【図19】R-R間隔の揺らぎと実年齢の関係

【実際のプログラムの事例】

Excel VBAで記述した心電図(ECG: Electrocardiogram)データ処理のプログラムをリスト1に例示します。ハム・ノイズの除去、基線動揺の除去、矩形波相関処理、矩形波相関ピーク時刻の検出処理、RR間隔の取得処理、心拍数の取得処理を行っています。サンプリング速度を1ミリ秒間隔で行うことを前提に記述しています。図20にECGの生波形を、図21にハム・ノイズ除去後の波形を、図22に基線動揺除去後の波形を、図23に矩形波相関処理結果を例示します。横軸の単位はミリ秒です。

【サンプル・プログラム】
『Excel VBAで心電図データを処理(リアルタイム処理向け)』

【図20】ECGの生波形


【図21】ハム・ノイズ除去後のECG波形


【図22】基線動揺除去後のECG波形


【図23】矩形波相関

【Excel VBA ソースリスト】

【リスト1】
 【サンプル・プログラム】
  『Excel VBAで心電図データを処理(リアルタイム処理向け)』
Private Const ofsECG As Long = 6 '【Sheet2の格納開始行を示す】

'【変数】
Private TimeCount As Long     '【A/D変換時刻】単位mS
Private aTimeCount As Long    '【現在時刻】
Private bTimeCount As Long    '【過去時刻】
Private aveECG As Long        '【ECG加算平均値】ノッチ処理後
Private servoECG As Long      '【DCサーボ後ECG】
Private CorECG As Long        '【矩形波相関値】
Private RRspan As Long        '【RR間隔】QRS群通しの間隔[mS]
Private HeartRate As Single   '【心拍数】1分間あたりの脈拍数

'【ハムノイズ除去処理関連】
Private pRowInput As Long     '【A/D変換サンプル番号ポインタ】
Private pColTimeCount As Long '【A/D変換時刻管理ポインタ】
Private pColInput As Long     '【A/D変換チャンネルポインタ】
Private Din As Long           '【A/D変換データ】
Private NotchFIFO() As Long   '【NotchFIFOの配列】
Private nNotchFIFO As Long    '【NotchFIFOのサイズ】
Private pNotchFIFO As Long    '【NotchFIFOのポインタ】
Private sNotchFIFO As Long    '【NotchFIFOの累積加算値】
Private kNotchFIFO As Double  '【NotchFIFOの加算平均値を得る為の乗算係数】

'【基線動揺除去処理関連】
Private DCOffset As Long      '【DCオフセット量】

'【矩形波相関処理関連】
Private Const nCorFIFO As Long = 80 '【矩形波相関のサイズ】★必ず4の倍数であること
Private CorFIFO() As Long     '【矩形波相関の配列】
Private pCor1 As Long         '【矩形波相関のポインタ1】初期値 0
Private pCor2 As Long         '【矩形波相関のポインタ2】初期値 nCorFIFO/4
Private pCor3 As Long         '【矩形波相関のポインタ3】初期値 3*nCorFIFO/4
Private sCorFIFO As Long      '【矩形波相関値】

'【QRS群検出時刻処理関連】
Private Const ThreshHold As Long = 40000 '【矩形波相関のピーク検出の為の閾値】
Private indx As Long          '【QRS群検出時刻リストのポインタ】
Private maxCor As Long        '【最大相関値】
Private maxTime As Long       '【最大相関値検出時刻】[mS]
Private PeekList() As Long    '【QRS群検出時刻リストの配列】
Private QRSTimeStamp As Long  '【QRS群検出時刻】

Private Sub CommandButton1_Click()
   pRowInput = 14     '【第14行目から】
   pColTimeCount = 1  '【第1桁目が時刻データ】
   pColInput = 3      '【第2桁目がECGデータ】
   TimeCount = 0      '【時刻番号の初期化】
   aTimeCount = 0     '【A/D変換現在時刻コード】
   bTimeCount = -9999 '【A/D変換前回時刻コード】
   
        InitNotchFIFO    '【初期化】ノッチフィルタ(ハムノイズ除去)
        InitDCServo      '【初期化】DCサーボ処理
        InitRectangleCor '【初期化】矩形波相関
        InitDetectPeek   '【初期化】QRS群検出
LStart:
        Din = GetADvalue()                '【A/D変換値を取得する】
        If (TimeCount < 0) Then End       '【全ての処理を終了】
        aveECG = NotchFilter(Din)         '【ノッチフィルタ処理】
        servoECG = DCServo(aveECG)        '【DCサーボ処理】
        CorECG = RectangleCor(servoECG)   '【矩形波相関処理】
        QRSTimeStamp = DetectPeek(CorECG) '【矩形波相関のピークを検出】
        
        Sheet2.Cells(ofsECG + TimeCount, 1) = TimeCount '【時刻を保存】[mS]
        Sheet2.Cells(ofsECG + TimeCount, 2) = Din       '【ECGのA/D変換値】
        Sheet2.Cells(ofsECG + TimeCount, 3) = aveECG    '【ハムノイズ除去後のECGデータ】
        Sheet2.Cells(ofsECG + TimeCount, 4) = servoECG  '【基線動揺除去後のECGデータ】
        Sheet2.Cells(ofsECG + TimeCount, 5) = CorECG    '【矩形波相関値】
        If QRSTimeStamp > 0 Then '【QRS群が検出された】
           Sheet2.Cells(ofsECG + indx, 6) = QRSTimeStamp - (nCorFIFO \ 2) '【検出時刻】[mS]
        End If
        If indx > 0 Then '【前回検出時刻があれば...】
           RRspan = PeekList(indx) - PeekList(indx - 1)    '【RR間隔】[mS]
           Sheet2.Cells(ofsECG + indx, 7) = RRspan         '
           Sheet2.Cells(ofsECG + indx, 8) = 60000 / RRspan '【心拍数】[回/分]
        End If
        TimeCount = TimeCount + 1 '【時刻更新】
        GoTo LStart
End Sub

Private Sub InitDetectPeek()
   indx = -1            '【QRS群検出時刻を保存するポインタ】
   ReDim PeekList(1000) '【QRS群検出時刻を保存する配列】
   maxCor = 0           '【矩形波相関値の暫定的な最大値】
   maxTime = 0          '【矩形波相関最大値の暫定的な検出時刻】
End Sub

Private Function DetectPeek(Din As Long) As Long
   DetectPeek = -1
   If Din > ThreshHold Then  '【しきい値を超えたか?】
      If maxCor < Din Then   '【前回相関値より大きいか?】
         maxCor = Din        '(Yes) 比較用相関値を保存する
         maxTime = TimeCount '
      Else
         If maxTime + 1 = TimeCount Then
            DetectPeek = TimeCount   '【関数出力】
            indx = indx + 1          '【リスト保存ポインタを更新する】
            PeekList(indx) = maxTime 'ピークを越えた⇒時刻をリストに保存
         End If
      End If
   Else
      maxCor = 0 '【閾値以下】
   End If
End Function

Private Sub InitRectangleCor()
   Dim i As Long
   
   ReDim CorFIFO(nCorFIFO - 1) '【矩形波相関処理用FIFO配列初期化】
   For i = 0 To nCorFIFO - 1   '
      CorFIFO(i) = 0           '
   Next i                      '
   pCor1 = 3 * nCorFIFO \ 4    '【管理ポインタの初期化】
   pCor2 = nCorFIFO \ 4        '
   pCor3 = 0                   '
   sCorFIFO = 0                '【矩形波相関値】
End Sub

Private Function RectangleCor(Din As Long) As Long
   sCorFIFO = sCorFIFO - Din + 2 * CorFIFO(pCor1) - 2 * CorFIFO(pCor2) + CorFIFO(pCor3) '【矩形波相関演算】
   CorFIFO(pCor3) = Din                                                                 '【新規データをFIFOに保存】
   pCor1 = pCor1 + 1                  '【ポインタpCor1の更新】
   If pCor1 = nCorFIFO Then pCor1 = 0 '
   pCor2 = pCor2 + 1                  '【ポインタpCor2の更新】
   If pCor2 = nCorFIFO Then pCor2 = 0 '
   pCor3 = pCor3 + 1                  '【ポインタpCor3の更新】
   If pCor3 = nCorFIFO Then pCor3 = 0 '
   RectangleCor = sCorFIFO            '【矩形波相関値を出力する】
End Function

Private Sub InitDCServo()
   DCOffset = 0 '【DCオフセットをリセットする】
End Sub

Private Function DCServo(Din As Long) As Double
   DCOffset = DCOffset + (Din - DCOffset) * 0.01 '【現DCオフセットとの差分値を累積加算してDCオフセットを得る】
   DCServo = Din - DCOffset                      '【DCオフセットを差し引いた分を出力する】
End Function

Private Sub InitNotchFIFO() '【ハムノイズ除去用FIFOのサイズを決め、0クリアする】
   Dim i As Long
   
   If (OptionButton1.Value = True) Then nNotchFIFO = 20 Else nNotchFIFO = 17
   ReDim NotchFIFO(nNotchFIFO - 1) '【配列NotchFIFOを確保】
   For i = 0 To nNotchFIFO - 1     '【配列NotchFIFOを0クリア】
      NotchFIFO(i) = 0             '
   Next i                          '
   pNotchFIFO = 0                  '【ポインタの初期化】
   sNotchFIFO = 0#                 '【NotchFIFOの累積加算値】
   kNotchFIFO = 1# / nNotchFIFO    '【加算平均値を得るための乗算係数】
End Sub

Private Function NotchFilter(Din As Long) As Double
   sNotchFIFO = sNotchFIFO + Din - NotchFIFO(pNotchFIFO) '【累積加算値を求める】
   NotchFIFO(pNotchFIFO) = Din                           '【FIFOに新規データを格納】
   pNotchFIFO = pNotchFIFO + 1                           '【ポインタ修正】
   If (pNotchFIFO = nNotchFIFO) Then pNotchFIFO = 0      '【ポインタ修正】
   NotchFilter = sNotchFIFO * kNotchFIFO                 '【加算平均値を返す】
End Function

Private Function GetADvalue() As Long
   aTimeCount = Sheet1.Cells(pRowInput, pColTimeCount) '【現在時刻情報を読込む】
   If (aTimeCount < bTimeCount) Then                   '【過去値と比較】⇒減少なら測定終了
      TimeCount = -1 '【データ終了】
      GetADvalue = 0
   Else
      GetADvalue = Sheet1.Cells(pRowInput, pColInput)  '【A/D変換値を読込む】
      pRowInput = pRowInput + 1                        '【読込ポインタを進める】
      bTimeCount = aTimeCount                          '【現在値⇒過去値】
   End If
End Function
    

【Coming Soon】『入浴中の心電図を無拘束で観測できる浴槽心電計』

当初は、フォトカプラで製作してしていたものを出版社の要望により光ファイバに変更した回路でした。
実際にはあり得ない回路であり、現状Visual Basic Ver.6.0も使えませんので、記事を別の物に差し替えます。
現在、浴槽心電計の記事への差し替えを予定しています。

浴槽心電計とは、無拘束で入浴中の人物の心電図を観測する装置です。
純水の電気導電率はほぼ0で電気抵抗は無限大なのですが、風呂の湯は違います。
そもそも生活に利用している水道水でさえ塩分を含んでいるので、風呂の湯には導電性があります。
普通の家庭用浴槽ならピーク電位差が500μVpp~800μVpp程度になりますが、
浴槽側面にステンレス電極を用意すれば、無拘束で入浴中の人物の心電図を観測することができます。
毎年、浴室で死亡される日本人の数は、14,000~17,000人と言われており、
年間交通事故死者数が4,000人程度であることを考えれば、非常に危険な場所だと言うことができます。
死者の半数は浴槽内、残り半数が洗い場や脱衣場での死亡であることを考えると、
入浴中の心電図の見守りと異常検出時の本人への入浴終了アドバイス、発作検出時の外部通報処理等
の意義をお分かりいただけると思います。

浴槽心電計により、平成元年度の技術情報から平成12、13年頃の技術情報に更新される予定です。
専用A/Dコンバータは使用せず、PDM(Pulse Density Modulation)技術を使います。
また、音声合成(μ-iVoice)の機能を付加し、iCloud対応にする予定です。
CPUも使わず、Altera社製CPLD MaxIIシリーズEMP570T100C5を実装し、通信はUSBシリアル通信またはZigBeeで行います。






【Kinectで赤外線脈波と呼吸を非接触モニタ】

日本においてもシャワー浴が普及してきたため、Kinectを使った赤外線脈波と呼吸モニタも威力を
発揮できそうです。これからは無拘束、非接触、非侵襲生体センシングの時代ではないかと思います。


【Kinect】赤外線ランダムドットパターンでヘモグロビンの赤外線吸光特性を利用して赤外線脈波を非接触で観測。
さらに、デプス・イメージで胸部の距離変動(2~5mmpp)を0.1mm以下の精度で捕捉して呼吸もモニタ。

【】

【】

【】

【】

【】

【】



【参考資料】

【トランジスタ技術2006年01月号】
心電計の製作

【予告】この記事は古くなったのでもうすぐ再編集されます。

とりあえず旧記事のサルベージだけに留めました。時間を作って再編集する予定です。

【注意事項】

 本ドキュメントで紹介する製作物は、作り方や使用方法を誤ると人体に影響を及ぼす可能性があります。
バッテリー駆動やAC結合、光絶縁など、安全には万全を期していますが、電子工学および医学に対する十分
な知識と電子回路の製作経験が少ない方は決して製作しないで下さい。
                                 ☆Tomoaki Ueda☆ (上田智章)