|
【ブラウザはGoogle Chrome】
●最新版ダウンロードはこちら 【お知らせ】Windows7でChromeがフリーズを起こす場合は、コントロールパネル⇒管理ツール⇒サービス でWindows Media Player Network Sharing Serviceを停止かつ無効にします。Micorosoftのバグです。 |
![]() ![]() 【トランジスタ技術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のバグです。 |
【ルネサス センシングソリューション展 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コンバータからデータを読み込む */ 【図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入出力を行っています。 使いかたは測定の開始と終了のボタンがあるだけの簡素なものです。 ソフトウェアに少し手を加えればバイナリ形式なら波形データをファイルに落とすことができると思います。 【まとめ】心電図測定は、近年は医療だけでなく、高齢化社会を反映して独居老人の安否確認(布団や衣服に導電性繊維を使って工夫)や、入浴中モニタとして注目されています。これを機会にほかの生体情報測定にもチャレンジして 行きたいと思います。 |
【呼吸とRR間隔】図13上にRR間隔のプロットを、図13下に医療用呼吸センサ(鼻にサーミスタを固定し、呼吸に伴う温度変化を捉えるセンサ)のプロットを示します。ご覧のように、呼吸センサを使わなくても、心電図から呼吸曲線が得られることがわかると思います。 |
![]() 【図13】RR間隔と呼吸曲線の比較 |
【短時間の加算平均心電図】矩形波相関トリガ法でQRS群の精確な出現時相がわかるので、QRS群を基準として数波~10波程度の短時間の加算平均を行うことで、ノイズを抑制した心電図を得ることができます。図14に事例を示します。図12に下段の心電図を処理することで得られたデータです。 |
![]() 【図14】矩形波相関トリガを用いた短時間加算平均心電図の事例 |
【浴槽心電計】 |
【実際のプログラムの事例】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☆ (上田智章) |