« 2014年6月 | トップページ | 2014年8月 »

2014年7月の2件の記事

2014年7月26日 (土)

心電計プロジェクト:DACのMCP4726でオシロに波形が出た

 前回のブログ記事から20日以上も経ってしまった。それにしても今回の心電計プロジェクトは予想以上に難航している。遅れたのは他にやることがあって時間がなかったこともあるのだが、それでも、やっとのことで心電波形をオシロで確認することができた。これでステップ3の終了である。

201407240009  うまくいかなかった原因は、いつもながら、わかってしまえば、なぜこれに気が付かなかったのかと思うばかりの下らないミスである。まあ、これが面白くて電子工作をやっているようなものだが、それにしても動かなかった時の暗澹たる気分がまだ頭に残っている。因果なものである。

 負け惜しみになるが、こんなものでも問題解決のケーススタディとしては役に立つかもしれない。ともあれ以下はこの20日余りの顛末である。

DAコンバーターを変換基板につけてデータシートを勉強(7/2/2014)
 身体から取り出した微小な電圧をアナログアンプで増幅し、それをAVRマイコン(Tiny861)のADコンバーターで数値化し、デジタルフィルターでハムノイズを除去した。そこまでは良かったが、数値データをグラフにする手間がかかって繰り返しテストができない。

 そこで、DAコンバーターで数値を再びアナログに戻し、オシロで波形をみようと(ロードマップではステップ3)、秋月電子で最近売り出されたDAコンバーターMCP4726を買ってきた。 1チャンネル、12ビットのDACで値段も安い(2ケで¥180)。ディジタル側のインターフェースはI2Cである。

 MCP4726には詳細なデータシートがついているが、ウェブには使用例がどこにも見当たらない。I2Cインターフェースはこれまで色々使っているので何とかなると思うが不安は残る。まあ、人柱になるのもたまには良いだろう。

201407240010  まずはデータシートを慎重に読み込む。マイクロチップ社のICなのでやたら丁寧なデータシートである。86ページもある(職場の裏表印刷のプリンターでやっと印刷)。O-Familyさんのように翻訳してあげれば喜ばれるのだろうが、そこまでの気力がない。

 それにしても、たかがDACなのになぜこんなたくさん機能があるのだろう。I2Cでデータを受け取ってアナログ電圧に換えるだけにしてはEEPROMまでついている。何のためなのか。

 ひととおり目を通しただけで、全部を理解したとはとても言えないレベルだが、単に数値データをアナログに変えるだけのオペレーションならそう難しくはなさそうだ。

 EEPROMの使い道はまだ良くわからない。判然とはしないが、電源断を含む運転を想定していて、前の値を保持しているだけのようだ。コマンドが沢山あって色々なことが出来そうだが、当面は関係ない。ディバイスのアドレスは出荷時に固定で、あとからは換えられない。

 データシートには具体例があるので、数値入力12ビットをアナログ化する手順だけなら間題ない。1ブロックを27ビットとし、頭1バイトをI2Cのマスター書き込み宣言、続いてデータバイト2バイトを送る。それぞれのバイトのあとにACKビットが1ビットづつ付くので計27ビット分を送ると、ディバイスはアナログ電圧をラッチする。

 リニアPCMプレーヤーのミニLCDを動かすのに使ったI2Cライブラリーを持ち込む。これはChaNさんがFatFSのモニターの中でタイマーに使っていたGPIO版を移植したものだ。そっくりソースコードでプロジェクトに放り込み、必要な機能だけを絞っていく。

 沢山、LCD用の関数があるが全部取り除く。I2Cのクロックは、625μsのサンプリング期間に27ビットが送り終える速さにしなければならない。ビットレートを100khz程度で、30ビット->300μsで送れるようクロックを調整する。

I2CインターフェースのDAコンバーターは動いた(7/7/2014)
 Tiny861を載せたブレッドボードの横に、MCP4726を載せて配線する。6ピンしかないので接続はいとも簡単だ。どんな波形が出てくるかわからないので、最初からロジックアナライザーをI2Cの端子、SCL、SDAにつないだままテストに入る。

 おーし、出てきた出てきた。スタートコンディションは出ているようだ。ロジアナのプロトコルアナライザーを早速入れてコードの解析に入る。うむ、これまでUARTに出力していた数値らしい値が送られている。ただ、ビットレートが100Khzにしては遅い。625μsのサンプリング期間を超えてしまっている。

 ロジアナの波形をさらに分析する。どうもクロックSCLのDuty比がおかしい、ソースコードをチェックする。おやあ、delayコマンドが沢山入っているなあ。データを送るところや、スタートコンディションを作るところに無駄と思われるdelayが入っている。

 ミニLCDのときは速度に十分な余裕があったので神経質になっていなかったが、今度はシビアなので、このあたりは直さないといけない。delayコマンドを少しづつ減らしてロジアナでチェックする。余り減らしすぎるとSCLクロックがおかしくなるので慎重に減らしていく。

 何回かのコンパイルで27ビットの送信は、サンプリング期間に収まった。これはもう動いているだろう。ロジアナでの出力はバッチリだ。出力ラインをオシロのプローブにつけて本番実験開始である。

 おやあ、出てこない。入力は完全なのに。あっあっあ、そのピンは出力ピンではなくてVrefピンだ。6ピンしかないピン配置を間違えている。あせるとろくなことはない。気持ちを落ち着けてジャンパーを付け替える。 Mcp4726_i2c

 出てきた、出てきた。それらしいアナログ出力が出てきた。アナログアンプの入力端の操作で上下する。しかし、心電波形らしい波形は全くでてこない。ただ、直流が出るだけ。オシロを2現象にして、アナログアンプの出力と、DAコンバーターの出力を調べる。

 DACは完全に動いているようだ。見事にハムノイズはとれているが、肝腎の波形が出てこない。ハムノイズのレベルに合わせて基線部分は上下するが(これがUARTに出した時に見た脈流だろう)、心電波形らしい鋭いパルスはどこにも見当たらない。ディジタル部は問題ないが、やはりアナログアンプの問題に戻ってきた。

 アナログアンプは、あれから進展はない。相変わらずハムノイズの嵐で心電波形らしいデータはまだお目にかかれない。どこを直して良いのかわからないのだ。暗礁に乗り上げたままである。

音楽教室おさらい会とワールドカップで電子工作はお休み(7/14/2014)
 そうこうするうちに一年に一度の音楽教室の発表(おさらい)会が近づいてきた。所長は、中断もあるが足掛け何十年と楽器(フルート)を同じ先生から習っている。先生のお年はもう75 才、レッスンというよりお年寄りの茶飲み話仲間のようなつもりで教室に通っている。

 ここでは、一年に1回か2回、生徒(全部大人か年配者)を集めた仲間内の発表会を開く。半年がかりで課題曲を仕上げていくのだが、前にも書いたように、この発表会というのが麻薬性の強い行事なのである。誰かに聞かせるわけでもない、単なる仲間内のおさらい会、勉強会という位置づけなのだが、これがなぜかはまる。

 プロになるわけもないのに、先生からは容赦ない指導が加わる。今さらうまくなるわけがないのだがこちらにも意地というものがある。一生懸命にさらう。そのかいあって始めはたどたどしかった曲が、音楽らしくなってくると嬉しいものである。しかしあとで録音を聞くと大抵がっかりする。

 何度さらっても、うまく行かないところがある。音程やリズムもおかしい。先生は、「なぜこんなところではずれるのか信じられない」などと嘆かれると、いくら本当でも、正直、気分が落ちこむ。

 しかし本番は容赦なく近づく。練習が気になって、電子工作はすっかり手が付かないでいる。というのも昔々、発表会でかなりうまい人が、突然あがってしまい最初から最後まで音が出なくて、みんなでじっとうつむいて曲が終わるのを待っていたという恐怖の経験がある。そうならないよう必死に曲を繰り返し練習し、最低限の音はでるようにさらっていく。

 本番である。これまでの練習の成果が試される時だ。何のために何ヶ月も同じ曲をさらってきたのか。これまでの投資が実を結ぶかはすべてこの演奏で決まる。所長は血液型がB型なので、ようするに「安定した不安定」である。吹いてみるまでわからない。

 あがっていないので気分よく吹いていると、不用意なミスが続いて自滅に近い結果になるときがある。そうかと思えば、ガチガチに緊張していても、なぜか調子が上がってきて練習以上にうまく吹けるときがある。

 細かいミスを気にしないで、耐えて吹いていると知らぬうちに難しいところが通過できる。あがってしまうとだめだが、あまり冷静でもかえってうまくいかない。このあたりの回復力は、何と言っても練習量で決まる。だから練習はさぼれない。

 今回は、まあまあで、70%の出来か。電子工作のデバッグは、解決しないと勝利の美酒を味わえないが、演奏は終りさえすればあとは極楽である。ドーパミンがたっぷり放出され、本人は数日は幸せな気分にひたれる。恐らくマラソン完走のあとの解放感と同じである。

 1ヶ月くらいは、楽器をケースから出すのもいやなくらいだが、そのうちいつのまにか取り出して吹いている。そして数カ月もすると、次の発表会の曲の選定がやってくる。あんなに苦しい目をして練習し、会場費やピアニストの謝礼に高い出費をしているのに、なぜかまた発表会に出る気になる。不思議なものである。

アナログアンプ不調。あきらめるか(7/18/2014)
 発表会とワールドカップでとられていた時間が電子工作に戻ってきた。アナログアンプのトラブルシューティングである。両腕からとった微弱な心電波形をノイズの中から拾うにはどうしたら良いのか。

 いろいろ手を尽くしたが、すべてうまくいかない。まずノイズ自体が大きすぎる。ディジタル系をつなぐと電源を入れなくても出力ラインには盛大なノイズがでる。それに20Khzあたりの細かいノイズもあらわれ、これはオペアンプの発振が疑われる。オペアンプをLM358から、LPCMプレーヤーに使ったNJM4580などに換えてみるが事態は改善されない。 201407260011

 DACはうまく動いているようだが、オペアンプの出力がべた(クリッピングされた)な矩形波なのが気に入らない。心電波形がすべて隠れてしまっているのではないか。増幅率が過大で、ノイズと心拍波形が上限を越えれば、ノイズフィルターそのものも動かないはずだ。

 というので、前段の計装アンプ部と、そのあとの増幅部(LPF付)に半固定のVRを入れて増幅率を可変にしてみた。抵抗値を上げて増幅率を落としていくと、矩形波のハムノイズはちゃんとした正弦波に戻った。しかし心電波形らしいものはどこにもあらわれなかった。ウェブの資料では心電波のR波(一番鋭いパルス)はノイズを突き抜けて観測されているが、ここにはそれが出てこない。

 理屈が良くわかっていないので、原因究明の方向が見えないのである。ハムノイズを軽減する方法がわからない。アースなどをつけたり、シールドケーブルを使ったりするのだろうが調べた限り、心電計でこういうことをしている例はない。

 助けを求めてウェブをさまよう。あれから「心電計」だけではなく、「心電計 回路図」で検索すると、以前より多くの回路例を見ることができた。いずれもLM358のような廉価版のオペアンプではなく、高額な計装アンプなどを使った例が多い。やっぱりLM358ではだめなのだろうか。

 段々自信がなくなってきて、仕事の帰り秋葉原に寄り、秋月電子で1ケ¥400の計装アンプLT1167や高精度オペアンプLT1112を買ってしまう。このまま引き下がるのは悔しい。2台目を作ろうという算段である。

201407220001 何のことはない。電極をしっかりつけたら波形が出た!(7/23/2014)
 それが、2台目の制作にとりかかろうとした矢先、解決してしまったのである。あてもなくオシロに電源を入れ、べたな出力電圧を漫然と見ていた時だ。何となく一秒ごとの小さなパルスが画面に出ているのに気が付いた。

 ふーむ、雑音にしてはパルスの出方が周期的だ。これは何だろう、試しにオシロのDCカップリングをACにして、感度を上げてみた。おおー、これは心電波形だ。間違いない。腕に付けた電極を動かすと波形が飛んでしまうが、暫くするとまた波形が戻ってくる。

201407230006  半固定抵抗を動かして増幅率を変えてみる。腕を動かすと波形が乱れるし、筋電流が出るということなので自由には変えられないが、増幅率の大小は関係ないようだ。リップルが矩形波になっていても関係ない。

 腕を机の上でなく、座っている膝の上まで降ろすと波形はさらに強くなった。これは間違いなく心電波形だ。一番鋭いR波だけでなく付随したS波など他の波も見える。1divを100mVまで上げるとくっきり心電波形が見える。

 いやあ、感動である。念願の心電波形である。自宅のオシロで見えている。調子の良い時だと、300mV P-PのR波(一番鋭いパルス)が観測できる。要するに、電極をしばらく当てていると、波形が強くなっていくのだ。

201407230007_2  嬉しくて、家族を久しぶりに工作室に誘い、彼女の心電波形も見てみた。皮膚抵抗が違うのか、夕食のビールのせいか簡単に心電波形が出てきた。やれやれ、何をやってもうまくいかず、あげくにもう一台別のアナログアンプを作ろうとした直前に動いてしまった。

どうしてこれがわからなかったのか分析する(7/25/2014)
 気持ちが落ち着いて、今回のトラブルの集約をしてみる。要は、電極を完全に皮膚に密着させていないことによる入力電圧不足である。実に簡単な最初にチェックするべきポイントである。何故これに気がつかなかったのか。

 人のせいにするには気が引けるが、まず参考情報にこうした注意がなかったのがここまで迷走した原因であることは否めない。銅やアルミは接触部で電気化学反応が出るのでステンレスにしなさいとはあるが、十分皮膚と密着させなさいとはどの資料も書いていない。

 次は、自分が慌て者なので、電極を付けて反応がないと次々に電極をずらして様子を見ていたため、波形を見落としていたこともあるだろう。皮膚と電極の間の接触抵抗は、どうも変化するらしく、暫く同じ個所に密着させていると抵抗が低くなっていくようだ。

201407230008  さらに、1.5mV P-Pの元の心電波を1000倍近くするのだから、DAコンバーター出力は、1V近く振れるはずという思い込みがあった。そのためオシロのDCカップリングでなくACカップリングにして感度を上げるということに思い至らなかった。

 考えてみたら、最初のアナログアンプ出力は、2.54V P-Pだが、ディジタルフィルターのAD変換とDA変換で単位が大幅に変わって来るので、パルスは倍率通りにはならない。調子の良い時は、アナログアンプ出力でも、R波のピークが観測でき、そのときのP-Pはスペックどおり1.5Vを超えているのだ。

 何度も再現テストをして、心電波形がオシロから出ることを確認した。いやあ、苦労したけれど、心電計プロジェクトは難関を突破した。サポーターをもう少しきつくして電極を皮膚に密着させるようにすれば、つけて10秒後には間違いなく波形が出てくる。

 これで、心電計プロジェクトは、次の映像化ステップに移ることができる。こちらは得意のディジタルなので先行きは明るい。I2CのDAコンバーターのソースコードライブラリは、全部が終わってから公開するつもりだが、もし要望があればまだ半かけではあるが、いつでも公開できる。

| | コメント (0) | トラックバック (0)

2014年7月 2日 (水)

心電計プロジェクト: ディジタルフィルターまで動いたが

 心電計開発のロードマップは出来た。今回のプロジェクトは、高精度アナログアンプにマイコンを使ったディジタル数値処理、それにTFT液晶などの描画ソフト開発と多彩なステージがあり、楽しみが多い。

 まずはステップ(1)の、心臓からの微弱電圧を拾うアナログアンプの開発である。参考サイトには、いくつかの回路図が載っているので、制作上の不安は少ない。アナログなので、ブレッドボードではなく直接、汎用基板に作っていくことにする。

 調べたところでは、少なくとも3種類の定数値付きの回路図(ここが2つここが1つ)が見つかっている。いずれも特に難しいことはしていないし、実装上の問題もなさそうだ。なかでも雑誌にも掲載されているここのサイトの回路は、LM358という廉価品のオペアンプを使っている。

 他の回路図は高価な計装アンプなどを使っていて、その入手が難しい。迷わずこのLM358の回路を使わせて貰うことに決めた。電源は、このあいだ千石で買ったジャンクのリチウム電池を使う。容量、電圧とも丁度良いサイズだ。

アナログアンプは出来た。しかしノイズだけで波形の検証はできず(6/13/2014)
 3日かけて久しぶりの汎用基板のハンダ付けを楽しんだ。今回は慎重に、出来た部品面のアートワークをスキャナーでとりこんで反転させ、ハンダ面のアートワーク図も作る。CR部品が多く、アートワークは結構複雑だ。Blg_p6116529

 LM358のような汎用オペアンプで、生体系の微小電圧を増幅できるのか半信半疑だが、まさか動かない回路図が雑誌に載ることはないだろう。動くことを信じてせっせとハンダ付けする。UEW線は殆ど使わない。CRのリード線だけで接続する。

 ちょっと工夫したところは、各オペアンプのVccにつけるパスコンをチップ部品にしたところか。なるべく実装をコンパクトにしようと思いついたのだが、本当は手持ちの0.1μFのセラコンがちょうど在庫切れになっていたという事情もある。

 全部組みあがったところで、最後のボルテージフォロワーの入力に並列に入れる2000pF(1000pF×2)のコンデンサーを忘れているのに気づいた。かなり密集して実装したので、部品一つでも追加するのが難しい。やむを得ずリード線一本だけを表側に通して配線を終了した。

 くだらないけれど、こういうチマチマとした工作が何故か好きである。何もそんなにこだわらなくても良いと思うのだが、自分で配線ルール(UEW線でも交差させない、可能な限りハンダ面で解決、保守性を考慮するなど)を作って、その制限のなかで目的を達成するのが楽しい。Blg_p6166539

 ハンダ付けするところがなくなった。アナログアンプの完成である。何度も配線チェックをしてから通電テストに入る。ここの検証は簡単ではない。最初は、商用電源のノイズが重畳した出力が得られるだけなので正常に動いているかどうかは、次のデジタルフィルターの完成まで待たねばならない。Blg_p6166531

 それでも折角出来たのだから、オシロで波形を見ることにする。心電計の身体接続部はまだ作っていない。とりあえずリード線の先端の銅を出し、手首や足首にまいたハンカチの隙間に押し込んで、テストする。 予想通り、盛大な50Hzパルスが出るだけで、心電波形らしいものは全く見ることは出来なかった。まあ、増幅はしているようだから、これはこれで良いとしよう。

デジタルフィルターのマイコンの準備(6/17/2014)
 サッカーのワールドカップが遂に始まった。日本とコートジボアールの初戦は惜しかった。本田の先制ゴールで心のどこかに「守り」の気持ちが出てしまったのだろう。岡田元監督もTVで言っていたが、ドロクバが入って相手チームの雰囲気が明らかに変わったのに単調に「守って」いたところを前がかりになられて簡単に点を取られた。

 まあ、4年に一度のワールドカップは世界中で32チームしか本大会に出られない。連続して出場しているだけでもたいしたものである。大会前日本に完敗したコスタリカが、強豪ウルグアイを破るという番狂わせがあるのもワールドカップである。奇跡を信じて応援していこう。

 電子工作の話に戻る。とりあえずアナログアンプは動いているようだ。サンプリングを短くすると、頭の切れた50Hzがもろにトリガーされて出るだけ。周期を長くすれば、参照サイトにもあるように50Hzの嵐で心電波形は全く隠れてしまっている(のだろう)。

 ただ、サンプリングを1秒程度にすると、50Hzがはずれて何となく心電波形らしいものが出てくるところがある(写真参照)。しかし、こんな交流波形を見ているだけでは埒(らち)があかない。アナログアンプはこれくらいにして、デジタルフィルター制作のステップ(2)に進んだ。

Blg_p6166530  ブレッドボードにデジタルフィルターのマイコンを準備する。石は、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本いる。電極には圧着端子をつけたコードをつなぎ、コードの先はテスターで使うミニジャックをつける。ミニジャックとソケットは、秋葉原駅下のラジオセンターで赤黒以外の端子を見つけた。青、黄、緑など沢山の色があった。

Blg_p6166532  作ってみると、例の雑誌の写真に出ている電極と全く同じ形だったのに苦笑する。体につけるサポートはマジックベルトを考えたが、結局、テニスのリストバンド(汗取り用)が沢山余っていたのでこれを流用した。足首につけるのがちょっとつらい。

 このあと、たまたま立ち寄ったスポーツ用品店で足用の適当なサポーターを探した。しかし安価なサポーターはみんな輪状で、マジックベルトのようにはがせるようなものは、何故かとんでもなく高価(¥2000以上)なので、買うのをやめた。まだ動かないのに凝るのはよそう。

Blg_p7026542  ミニジャックのソケットを、雑誌記事と同じように基板にハンダ付けして仮止めし、アナログアンプの方はだいぶさまになってきた。ブレッドボードに載せた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のリターンキーで出力を開始し、次のリターンキーで表示を止める。

Uartdata

 PCのコンソール画面上に、数値データが並ぶので、それを画面上でコピーし、エクセルのデータにとりこみ、折れ線グラフにする。おおお、出てきた出てきた。50Hzのハムノイズはすっかりとれて、なにやら1秒に一回程度の波があらわれた。

 現在のUART出力は、サンプリング値を全部表示するとバッファーがオーバーフローするので、32段に一回だけの表示でカーブが緩いが、周期からみて脈拍の波に違いない。感動の一瞬である。

Ecgbest

 ただ、波の基準値が一定していない。それに波形も綺麗に出るときと出ないときがある。アナログアンプを調整したいが、エクセルのグラフに出すまでの手順が厄介なので、アナログの方をいじるわけにはいかない。それにUARTがまだ不安定で、表示が時々字化けするのを止められない。

ロジアナでUARTの字化けも解決。デジタルフィルターはこんなものか(6/23/2014)
 ロジアナで本格的なデバッグに入る。ADコンバーターを動かすところ、USI-UARTの送信関数の出力、さらにUSIのボーレートカウンターなどにプローブ点を設置し、ロジアナで動きを観察する。

 プログラムは凡そ考えたとおりに動いていた。ADコンバーターは着実に625μs単位にデータを取得しており、UARTの送信関数も一瞬のうちに処理を終えている。このあとUSIの4ビットカウンターの割り込みで実際にデータが送られていくのだが、これも間違いなさそうだ。

Digftr

 しかし、字化けしているときは、タイミングが合っていてもUARTの送信データの方がまるまる汚れて出ている。文字をシフトレジスターに入れるときにおかしくなっている。となると考えられる原因は、データをシフトレジスターに入れるタイミングと、送出するときの衝突である。

 あらためてソースコードを眺めてみた。cli()とsei()で割り込まれるのを防止している送信関数の範囲は、データバッファーのカウントを換えるところだけで、実際のデータをバッファーにセットするところは割り込み禁止になっていない。

 データバッファーに入れるところで衝突しても、送出時はそこは関係ないので問題ないはずだが、どうもここがくさい。直すのは造作のないことなので、試しに、この部分も割り込み停止にしてみた。

Blg_p7026546

 なんと、これで直ったのである。アナログアンプの電源が切れていても(このときが字化けが多い)、全く問題なし。延々とデータを出してもきっちりデータを出力する。字化けは完全に解消した。

 データをいくつかとる。みんな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があるので何とかなりそうだが、使用例が見つからないのは痛い。まあ、人柱になるのも良いか。先日、秋葉原に立ち寄って現物を入手した。

Blg_p7026541  ブログの更新が滞ってきたので、このあたりで報告することにする。さあ、この寄り道がどうなるか。

(* 修正済み 以前7026と誤記。失礼しました)

| | コメント (2) | トラックバック (0)

« 2014年6月 | トップページ | 2014年8月 »