良いぞ、コーディングミスはなかったようだ。よーし、ピークのR波が鋭くたち、世間でよく見る心電波形の形になった。良かった、良かった、自分の心臓がおかしくなったわけではない。keiさんありがとうございました。久しぶりにAVRをいじったので、ついでに気になっていたAVR側のデバッグをした。稀れにだが、デジタルフィルターを通さないノイズの入ったままのデータが送られる時がある。電源の抜き差しを頻繁に行ったときに多い。サンプリングに失敗しているとみられる。コードを調べていくと、ADコンバーターのサンプリングを10回もやっていることがわかった。一回9μsのADCサイクルで10回というと100μs近くになる。送出間隔は、635μsなので、この程度なら大丈夫だとは思うが、試しにこれを2回に減らしてみた。あてずっぽうだったが、これが原因だった。何度電源を抜き差ししても一回もトラブルは起きなくなった。心電波形はこれでほぼ完全になった。画面に、枠線や、数字を出すステップに来た。それと、トリガーを考えなければならない。今は連続して波形を出しているので、心拍のピークは一定のところに出ない。これを一定の位置から画面に出すようにしたい。これが出来れば本格的な心電図になるのだが、この実現はそう簡単ではない。画像表示関数をデバッグする(12/21/2014)この間トラブった描画関数について、作者のねむいさんから丁寧なお詫びコメントが入った。こちらが好き勝手に使ってこけているのだから、恐縮されるとかえってこちらが戸惑ってしまう(オープンソースは無保証が大前提)。自分だって昔に開発したコードのバグを指摘されるのは、有り難い反面(建前)、実は何となく昔の思い出したくない古傷に触れられる感じで、そう手放しで喜べる出来事ではない(本音)。これが仕事なら本当に助かるけれど、遊びで作ったのにケチをつけられるのはたまらないと思う。何かこのところ狙い撃ちをするみたいに不具合に遭遇してしまい、かえって申し訳ない気持ちでいっぱいである。荒さがしをしているつもりはないのに結果としてそうなっている。こちらこそ、ごめんなさい、ごめんなさいである。それはともかく、新版で解消したので差し替えて下さいということだが、全部を差し替えるのは大変なので、ソースをみてどこが違っていたのか確かめてその修正だけをすることにした。不具合は2つあった(関数Display_DrawLine_If())。・差分を積み上げるときの数をせっかくABS()で正数にしているのに、元の数で計算。・if(数値)は、0がfalseで0以外がtrueなのだが、数値>0とすべきをif(数値)としていたために負数がすりぬける。いずれも、全くのケアレスミスである。所長も正しいコードと比較するまで机上デバッグでは見つけられなかった。ソフト開発というのはこういうものである。書いたようにしか動かない。どんな簡単なソフトでも動くまで信用してはいけない。グラフの描画は最初、2重線を引いていたが、折れ線だと1本線でも十分綺麗にでることがわかり一本に減らす。ロジックが少し簡単になった。これで残っている不具合は、電極の装着が依然不安定なことだけになった。電極は、前にも書いたように暫く(1分程度)同じ位置に固定していると接触抵抗が下がって波形がでてくるのだが、5分以上置いておいても出てこないときがある。始めつけた場所によると思っていたが、どうも断線の可能性が高い気がしてきた。導通テストでは大丈夫である。しつこく調べるうち、遂に、1本のコードで断線を発見した。しめてあるコードの中の部分で断線していたのだ。しめた部分をドライバーでこじてゆるめ、コードを引っ張ったらポロッと切れた銅線が出てきた。いう微弱電位の断線はたちが悪い。意外に簡単にトリガーはかけることができた(12/26/2014)トリガーである。波形を常に一定の場所から描くことである。オシロスコープに近い処理が必要になってきた。リアルタイム性は余り求められていないので、トリガーは出てきたデータを一旦バッファーに貯めて、そこから考えれば大抵の方法は思いつく。メモに沢山思いついたことを書きとめながら色々考えていたが、結局、以下の簡便な方法でやることにした。・1フレーム分のデータを蓄積し、その中の最大点のポイント(R波)を記録しておく。・描画は、その最大点より少し前からスタートする。このポイントがフレームの先を越えたらフレームの最初から描く。ここで少しずれるときがあるが、余り厳密には考えない。・描画と記録の速度を同期させておけば、オーバーランやアンダーランの心配なく、描画が続く(はずである)。・ただし、フレームの最初の方にピークがあるときは、最大1画面程度まで描画は遅れる。リアルタイムな心電波形ではない。最初すぐに波形は出てこない。