心電計プロジェクト: ディジタルフィルターまで動いたが
心電計開発のロードマップは出来た。今回のプロジェクトは、高精度アナログアンプにマイコンを使ったディジタル数値処理、それにTFT液晶などの描画ソフト開発と多彩なステージがあり、楽しみが多い。
まずはステップ(1)の、心臓からの微弱電圧を拾うアナログアンプの開発である。参考サイトには、いくつかの回路図が載っているので、制作上の不安は少ない。アナログなので、ブレッドボードではなく直接、汎用基板に作っていくことにする。
調べたところでは、少なくとも3種類の定数値付きの回路図(ここが2つ、ここが1つ)が見つかっている。いずれも特に難しいことはしていないし、実装上の問題もなさそうだ。なかでも雑誌にも掲載されているここのサイトの回路は、LM358という廉価品のオペアンプを使っている。
他の回路図は高価な計装アンプなどを使っていて、その入手が難しい。迷わずこのLM358の回路を使わせて貰うことに決めた。電源は、このあいだ千石で買ったジャンクのリチウム電池を使う。容量、電圧とも丁度良いサイズだ。
アナログアンプは出来た。しかしノイズだけで波形の検証はできず(6/13/2014)
3日かけて久しぶりの汎用基板のハンダ付けを楽しんだ。今回は慎重に、出来た部品面のアートワークをスキャナーでとりこんで反転させ、ハンダ面のアートワーク図も作る。CR部品が多く、アートワークは結構複雑だ。
LM358のような汎用オペアンプで、生体系の微小電圧を増幅できるのか半信半疑だが、まさか動かない回路図が雑誌に載ることはないだろう。動くことを信じてせっせとハンダ付けする。UEW線は殆ど使わない。CRのリード線だけで接続する。
ちょっと工夫したところは、各オペアンプのVccにつけるパスコンをチップ部品にしたところか。なるべく実装をコンパクトにしようと思いついたのだが、本当は手持ちの0.1μFのセラコンがちょうど在庫切れになっていたという事情もある。
全部組みあがったところで、最後のボルテージフォロワーの入力に並列に入れる2000pF(1000pF×2)のコンデンサーを忘れているのに気づいた。かなり密集して実装したので、部品一つでも追加するのが難しい。やむを得ずリード線一本だけを表側に通して配線を終了した。
くだらないけれど、こういうチマチマとした工作が何故か好きである。何もそんなにこだわらなくても良いと思うのだが、自分で配線ルール(UEW線でも交差させない、可能な限りハンダ面で解決、保守性を考慮するなど)を作って、その制限のなかで目的を達成するのが楽しい。
ハンダ付けするところがなくなった。アナログアンプの完成である。何度も配線チェックをしてから通電テストに入る。ここの検証は簡単ではない。最初は、商用電源のノイズが重畳した出力が得られるだけなので正常に動いているかどうかは、次のデジタルフィルターの完成まで待たねばならない。
それでも折角出来たのだから、オシロで波形を見ることにする。心電計の身体接続部はまだ作っていない。とりあえずリード線の先端の銅を出し、手首や足首にまいたハンカチの隙間に押し込んで、テストする。 予想通り、盛大な50Hzパルスが出るだけで、心電波形らしいものは全く見ることは出来なかった。まあ、増幅はしているようだから、これはこれで良いとしよう。
デジタルフィルターのマイコンの準備(6/17/2014)
サッカーのワールドカップが遂に始まった。日本とコートジボアールの初戦は惜しかった。本田の先制ゴールで心のどこかに「守り」の気持ちが出てしまったのだろう。岡田元監督もTVで言っていたが、ドロクバが入って相手チームの雰囲気が明らかに変わったのに単調に「守って」いたところを前がかりになられて簡単に点を取られた。
まあ、4年に一度のワールドカップは世界中で32チームしか本大会に出られない。連続して出場しているだけでもたいしたものである。大会前日本に完敗したコスタリカが、強豪ウルグアイを破るという番狂わせがあるのもワールドカップである。奇跡を信じて応援していこう。
電子工作の話に戻る。とりあえずアナログアンプは動いているようだ。サンプリングを短くすると、頭の切れた50Hzがもろにトリガーされて出るだけ。周期を長くすれば、参照サイトにもあるように50Hzの嵐で心電波形は全く隠れてしまっている(のだろう)。
ただ、サンプリングを1秒程度にすると、50Hzがはずれて何となく心電波形らしいものが出てくるところがある(写真参照)。しかし、こんな交流波形を見ているだけでは埒(らち)があかない。アナログアンプはこれくらいにして、デジタルフィルター制作のステップ(2)に進んだ。
ブレッドボードにデジタルフィルターのマイコンを準備する。石は、ADコンバーターを持っているTiny861を選ぶ。クロックが悩ましい。今度のフィルターは、商用電源の周波数(関東では50Hz、関西は60Hz)の周期にぴったり合わせてサンプリングをする必要がある。
参照サイトでは、32段階のFIFOを採用している。始め、なぜこの数を選んだのか良くわからなかったが、ロジックを調べているうち謎が解けた。2バイト演算の最大数に合わせているのだ。ADコンバーターの分解能を10ビットとすると、数値の範囲は、0から1023になる。1サイクルの合計値を計算する必要があるので、32×1024=32767で、符号付2 バイト整数を使うのなら、これでピッタリである。
マイコンのクロック周波数は、50Hzのフィルター精度をなるべく高くするため正確な625μs(20/32ms )のサンプリング間隔が作れるように決める必要がある。タイマーのプリスケール値は設定できる値が限られているので注意が必要だ。色々調べた結果、部品箱にあった、7.372Mhzのクリスタルが一番有効になることがわかった。
この石は、以前正確なUARTボーレートを出すために買ってあった石で、これを使うと、プリスケールを32にすると、144tickでぴったり625μsになる。またUARTは192の分周で38400bpsのビット幅に誤差0%で入る。
家具固定のL字金具で電極を用意したり、ディジタル部を開発したり(6/20/2014)
近所のホームセンターでステンレスの電極を見つけてきた。家具の固定などに使うL字ホルダーだ。結構な値段(一本あたり¥200)がする。3本いる。電極には圧着端子をつけたコードをつなぎ、コードの先はテスターで使うミニジャックをつける。ミニジャックとソケットは、秋葉原駅下のラジオセンターで赤黒以外の端子を見つけた。青、黄、緑など沢山の色があった。
作ってみると、例の雑誌の写真に出ている電極と全く同じ形だったのに苦笑する。体につけるサポートはマジックベルトを考えたが、結局、テニスのリストバンド(汗取り用)が沢山余っていたのでこれを流用した。足首につけるのがちょっとつらい。
このあと、たまたま立ち寄ったスポーツ用品店で足用の適当なサポーターを探した。しかし安価なサポーターはみんな輪状で、マジックベルトのようにはがせるようなものは、何故かとんでもなく高価(¥2000以上)なので、買うのをやめた。まだ動かないのに凝るのはよそう。
ミニジャックのソケットを、雑誌記事と同じように基板にハンダ付けして仮止めし、アナログアンプの方はだいぶさまになってきた。ブレッドボードに載せたTiny861は、動いてからこの基板の残っている部分に実装するつもりだ。
ディジタルフィルターのソフト開発に入る。当研究所ではスクラッチからソフトを書き出すことは滅多になく、これまでに開発したコードを流用することが多い。今度もタイマー割り込み駆動のプログラムの中から、アクリル曲げ器に使った熱電対温度制御部を選んだ。こいつはADコンバーターを使っているので好都合だ。
新しいプロジェクトを作り、そこへ、そっくり前のソースを持ち込んだ後、これを頭からどんどん換えて作っていく。ディジタルフィルターの数値出力は、UARTでARMなどの表示系(ステップ4)に送ることになるが、とりあえずはキャラクターに直し、PCのUARTコンソールに出力させる。
UARTの出力速度は、サンプリング周期より遅いので、このあたりはバッファー付きの送信関数でないと、まともに表示がされないだろう。おあつらえむきにこの前作ったUSI-UARTが役に立ちそうである。
デジタルフィルター(ステップ2)は動いているようだ(6/21/2014)
擬似コーディングは、プログラムが似たような構造なので簡単に終わり、コードの開発は1日もかからなかった。問題はUART出力をどのタイミングでやるかである。UARTにフィルターの出力を出すとき、625μsのサンプリングの度に、3桁のキャラクター(38400bpsで621μs)を連続して出力することは無理だろう。
とりあえず、32段のFIFOが1周するたびに一回、UARTを動かしてデータを出すことにする。これくらいなら全く問題がない。USI-UARTのお陰で万が一、次の割り込みにかかっても系を乱すこともない(はずだ)。
ソフトが出来上がったので早速テストに入る。と、これが全く動かない。このあとの紆余曲折はいつものことなので端折るが、結局、何とか動くまで3日もかかってしまった。まあ、それにしても、いつもながらの大騒ぎである。プログラムはまさしく考えたようには動かず書いたようにしか動かない。まずは超初歩的なミスから。
(1)USI-UARTは独立したシリアルラインを持っている。それに気づかず、いつものISP-UARTだと思ってファーム書き込み後ISP書き込みモードにしたまま動かないと動かないと騒いでいた(ISP-UARTは、書き込みモードで動く)。
(2)FIFOバッファーのオーバーフローに気づかず、暴走を繰り返す。1バイト違っていただけだが。
(3)タイマーのプリスケールの設定が全く違っていて、とんでもない値と原因不明の暴走。
始めは不精してオシロで全部片付けようと思ったが、UARTが出るところまでなら何とかなっても暴走は歯が立たない。すぐにロジックアナライザーの登板を仰いだ。ロジアナはやはり強力で、上記(2)以降のトラブルは雲散霧消した。始めからロジアナを使えばよかったのだ。
まだ、データのないとき文字が化けるときがあるが、何とかPCのUARTコンソールにデジタル出力の数値が連続して出るようになった。PCのリターンキーで出力を開始し、次のリターンキーで表示を止める。
PCのコンソール画面上に、数値データが並ぶので、それを画面上でコピーし、エクセルのデータにとりこみ、折れ線グラフにする。おおお、出てきた出てきた。50Hzのハムノイズはすっかりとれて、なにやら1秒に一回程度の波があらわれた。
現在のUART出力は、サンプリング値を全部表示するとバッファーがオーバーフローするので、32段に一回だけの表示でカーブが緩いが、周期からみて脈拍の波に違いない。感動の一瞬である。
ただ、波の基準値が一定していない。それに波形も綺麗に出るときと出ないときがある。アナログアンプを調整したいが、エクセルのグラフに出すまでの手順が厄介なので、アナログの方をいじるわけにはいかない。それにUARTがまだ不安定で、表示が時々字化けするのを止められない。
ロジアナでUARTの字化けも解決。デジタルフィルターはこんなものか(6/23/2014)
ロジアナで本格的なデバッグに入る。ADコンバーターを動かすところ、USI-UARTの送信関数の出力、さらにUSIのボーレートカウンターなどにプローブ点を設置し、ロジアナで動きを観察する。
プログラムは凡そ考えたとおりに動いていた。ADコンバーターは着実に625μs単位にデータを取得しており、UARTの送信関数も一瞬のうちに処理を終えている。このあとUSIの4ビットカウンターの割り込みで実際にデータが送られていくのだが、これも間違いなさそうだ。
しかし、字化けしているときは、タイミングが合っていてもUARTの送信データの方がまるまる汚れて出ている。文字をシフトレジスターに入れるときにおかしくなっている。となると考えられる原因は、データをシフトレジスターに入れるタイミングと、送出するときの衝突である。
あらためてソースコードを眺めてみた。cli()とsei()で割り込まれるのを防止している送信関数の範囲は、データバッファーのカウントを換えるところだけで、実際のデータをバッファーにセットするところは割り込み禁止になっていない。
データバッファーに入れるところで衝突しても、送出時はそこは関係ないので問題ないはずだが、どうもここがくさい。直すのは造作のないことなので、試しに、この部分も割り込み停止にしてみた。
なんと、これで直ったのである。アナログアンプの電源が切れていても(このときが字化けが多い)、全く問題なし。延々とデータを出してもきっちりデータを出力する。字化けは完全に解消した。
データをいくつかとる。みんな1秒に一回程度のパルスを捕らえている。ただ、基本電位が安定しないし、だいたい波形が心電図らしくない。原因は20ms間隔でデータをとっているからだとは思うが、正弦波的な波形で、いわゆる心電波のいくつかの特徴的な波が出てこない。
これ以上のUARTでの測定は面倒なだけで進展が遅い。そろそろ別の表示法を考える時期のようだ。DACを使うか。32ビット系のTFT液晶に向かうか、迷うところである。DACを使って、オシロの2現象で比較したいところだが、早くTFT液晶でまともな波形を出したい気分もある。
20ms単位の表示では心拍の波形は表現できない?(6/25/2014)
ぐずぐずしている間に、サッカーのワールドカップでは日本が負けてしまった。結局2軍のコロンビアでも全く歯が立たなかった。今から思い返せば、あの初戦の前半であげた本田の先制ゴールがすべて仇になったように思う。
一瞬、世界のトップレベルになったという錯覚がメンバー全員に行き渡って我を忘れてしまったのではないか。日本はまだ、そんなレベルではない。必死にボールに喰らいついて、がむしゃらに点を取りに行かなければ行けないのに、ついその気(一流のつもり)になってしまったのではないか。それくらい、あの本田のゴールは素晴らしかった。
まあ、それはともかく電子工作である。どっちにするかまだ迷っている。もういちど参考情報を熟読する。採集方法は間違っていないようだ。波形図を見ると100HzくらいのR波が出ているが、この波形は確かに20ms単位では正確な値は表示できないはずだ。
1秒間だけ精密な波形を出力する方法も考えてみる。せっかくUSI-UARTを採用してデバッグに苦労したのだから、もうすこしこの方法もやってみたい。
しかし、サンプリングを1/8の4ms間隔にしても変わりがなかった。今度は取得データ範囲が短くなるため、波形の把握がかえって出来なくなる。難しいものだ。どうもアナログアンプもおかしいのかもしれない。もう一度、念入りに回路図を調べ、基板の配線を確認するが間違いはなかった。
DAコンバーターを買ってきた。人柱になるか(6/27/2014)
雑誌記事の写真を見ていると、フィルターをかけるまえの商用電源のノイズに入った波形には、心電波形のいわゆるR波(一番鋭いピーク)はノイズの上を超えて観測されている。一方、こちらの補正前の波形には、これが見られない。
色々アナログアンプをいじる必要があると思うが、現在の手順では沢山データを取るのに多大な労力を要する。といって、ARMの表示系を実現するには、まだかなり道が遠い。色々迷ったが、結局、以前寄り道と考えていたDAコンバーターを使ってアナログにし、オシロで調べるのが一番早道のような気がしてきた。
手持ちに12ビットDAコンバーターがあったはずだ。部品箱を漁る。しかし急には見つからない。出てきたのはオーディオ用の16ビットのDAコンバーターだが、こんなことに使うには抵抗がある。BU3616というビデオ用のDAコンバーターは8ビットパラレル入力で話にならない。
確か以前、秋月で買ったと思っていた12ビットコンバーターを部品箱の底から、やっとのことで見つけた。何と、こいつはDACではなくてADコンバーターMCP3204だった。完全な勘違いである。やれやれ。
仕方がないので、手頃なDAコンバーターチップを入手することにする。秋月のサイトを覗く。MCP4726*というI2Cインターフェースのチップが安価で良さそうだ。ただ、これを使った参考例が、全くウェブ上では見つからない。
データシートは、マイクロチップ社製品らしく、懇切丁寧な(14Mbytesもある)PDFがあるので何とかなりそうだが、使用例が見つからないのは痛い。まあ、人柱になるのも良いか。先日、秋葉原に立ち寄って現物を入手した。
ブログの更新が滞ってきたので、このあたりで報告することにする。さあ、この寄り道がどうなるか。
(* 修正済み 以前7026と誤記。失礼しました)
| 固定リンク
「AVR」カテゴリの記事
- ソフトI2Cはクロックストレッチまで手を出してあえなく沈没(2017.09.02)
- オシロのテストどころかソフト開発で大はまり(2017.07.26)
- 超音波方式の人感センサーI2C化と新しいオシロ(2017.06.29)
- motionの動体検知はRaspi3の電源が安定しない(2017.04.16)
- 赤外線学習リモコンはデータ再現で挫折したまま進まず(2016.07.21)
「電子工作」カテゴリの記事
- 生存証明2(2022.10.19)
- 生存証明(2022.01.23)
- パソコン連動テーブルタップの修理を諦めて自作(2021.02.16)
- 半年ぶりのブログ更新に漕ぎつけた(2019.09.19)
- 研究所活動は停滞したままでCCDカメラ顕微鏡導入など(2019.02.08)
コメント
Shuji009さん、お久しぶりです。
あ、あ、間違えてますね。おっしゃるとおりMCP4726です。
写真にも出てるのに。
最近はこういうつまらないミスが多いですね。
まあ、年のせいに違いないので、あまり気張らず、ペースを落として
工作を進めています。昨日、I2Cドライバーまでできました。
投稿: がた老 | 2014年7月 6日 (日) 19時11分
がた老さん、ご無沙汰しています。
> MCP7026というI2Cインターフェースのチップ
ですが、検索しても全くでてこないのですが・・・?
秋月電商(秋月電子と書くと、嫁が、でんこと不倫していると怒られるので、電商と書くことにします)でも見つかりません。
よく似た型名ですとMCP4726っていう12ビットでIICのDACならあるのですが。
投稿: Shuji009 | 2014年7月 6日 (日) 05時32分