(日々の記録)デジタルオシロを買った。(月)心電計プロジェクト:表示部の詳細設計とインターフェースに悩む心電波形表示の擬似コーディングを始める(10/20/2014)長い間道草を食ってきたが、やっと心電計の波形表示部の詳細設計まで来た。それにしてもこのプロジェクトは遅れに遅れている。始めたのが6月だから、もうそろそろ半年近くになる。オシロで波形を見たのが7月なのに、これをARMで液晶表示をしようとしてから事が進まない。ARMの開発環境の整備から始まり、TFT液晶が動きだすまで、基板を買い直したりして2ヶ月もかかってしまった。最近は集中力が落ちている。PCに向かってもすぐ設計に入れず、ついWindows7に入っていた無料ゲームで時間をつぶしてしまう。効率がガタ落ちである(スパイダーソリティアの中級がとても難しい。最初は20回に一回もクリアできなかった。現在は、勝率10%)。繰り言を言っていても始まらない。TFT液晶は何とかカラーバーまで出たので、これでやっと波形表示のソフト開発に入れる。心臓パルス波形をオシロスコープのように折れ線グラフで表示するところだ。オシロスコープのロジックは、難しいことを言い出せばきりがないが、基本原理は簡単だ。対象測定値の変化を時間単位に点で表示し、これを連続的に出して画面の端に来れば再び同じことを繰り返すだけである。単位時間が短くなり、一秒の1/1000(ミリセカンド)、1/100万(マイクロセカンド)の世界になれば、どのタイミング(トリガー)で、どれだけのデータ範囲を画面に描画するかなどとなると、とたんに難しくなるが、幸い、心臓の鼓動は1秒程度の非常に長い周期なので、そういう気遣いはいらない(はずだ)。こんどの液晶の描画単位は240X320ドットである。これを横に使い、300ドットの間を2秒程度でポイントを打ち終えれば、元に戻ってポイントを打ち直す。そのとき前に描いたポイントを消していく。この繰り返しで心電図の波形が表示できるはずだ(ほんとうか)。いう描画で一番面倒なのが、この折れ線グラフよりむしろグラフのスケールや、数値の表示である。このあいだのグラフィック気圧計でも、プログラムの殆どの手間は、縦横の線や、日付の表示にかかっていた。オシロスコープのソフトは、ネットのあちこちで紹介されているようだが、見ないことにしている。困ったときは頼りにするつもりだが、初めから見てしまうのには抵抗がある。見たことでそれに縛られたくない。意地になって独自開発を目指している。印刷の裏紙にメモを書き散らし、イメージを膨らませながらプログラムの骨格を作り始めた。表示だけならどうと言うことはない。問題なのは、センサー部から送られてくるデータを取りこぼしなくいかに表示部に送るかというインターフェースの部分である。TFT液晶基板の実装版は簡単に動いた(10/27/2014)その矢先、親戚に不幸があって丸々一週間の間が空いた。この間、関西を2往復した。年も年だったし(80才)、長い闘病の末だったので覚悟は出来ていたが、亡くなったのが兄弟の中で一番仲の良かった長姉だったので少し精神的に参った。何もしていないと次から次に思い出が湧き出してきて気持ちが沈む。それを拭っ切るために、少し無理にでも電子工作に気持ちを向けることにした。関西から帰ってきて工作机を整理していたら、TFT液晶基板の実装がまだ済んでいないことに気付いた。TFT液晶の接続は、このあいだ買ったスルーホール用のジャンパーによる仮接続で、このままにしておくわけにはいかない。それに、センサー部のディジタルフィルターのマイコンTiny861もブレッドボードにささったままだ。液晶基板の実装をやることする。実装を先延ばしにしていたのは、レイアウトに迷っていたからである。ウェブなどの作例を見ると、こうした液晶画面の実装は殆どは、基板の上に重ねていくスタック構造が主流で、この前のグラフィック気圧計もそうなっている。ケースのことまで考えると、コンパクトにするためには必然的にこの形になるのだが、もうちょっと面白い実装はないか色々調べていた。良いヒントは得られなかった。結局、芸のない話だが前と同じスタック方式で、CPU基板の上に主基板を載せ、その上にTFT液晶を載せることにした。両面の汎用基板を切り出す。前と同じスタイルなので作業に迷うところは少ない。工夫したところは、普通のピンヘッダーとソケットでは背が高くなりすぎるので、TFT液晶と主基板の接続を背の低いICソケットピンにすることにしたところか。側は、秋月が最近売り出した「細ピンヘッダー」を使った。これで今までのスタック基板が何となく間が抜けた感じだったのが、少し引き締まったスタイルになった。それに、この種のピンヘッダーは高価で使いにくかったが、これは安いのでお財布にも優しい。3時間で15本(30個所)の配線が済んだ。ショートだけしていないことを確認して通電。ロジックも何もない、コネクターとピンの間をつなぐだけの作業なので造作がない。インターフェースが難しい(10/29/2014)問題のインターフェースの設計である。これまでのセンサー部と、表示部のインターフェースを具体的に決めなければならない。センサー部は生体に接続するので、万が一を考えて電池で駆動する。表示部はACアダプターかUSB経由で電源を供給し、センサー部とはフォトカプラーで絶縁する。インターフェースのプロトコルである。I2Cは既にDACで使っていて開発が不要だが、こいつは絶縁が簡単にはできないのでパスである(双方向で動く必要がある)。無線のXbeeが一番スマートなのだけれど、今のところストックがない。これも、あれこれ迷って、とりあえずはUARTでフォトカプラー経由でつなぐことにした。受信はいらないので、送信だけの1チャンネルで良い。送出データは最初、保守性を考えてキャラクターで送ることを考えていた。キャラクターにすると3バイトが必要で、38400bpsの速度(当研究所のUART標準)では、センサー部の最小サンプリング単位625μsを軽くオーバーしてしまう。画面表示は早くても数十msのオーダーなので、平均化などして送出単位を延ばせばよいのだが、このあたりの調整は表示部でやりたい。いうことになると2バイトバイナリで送るのが順当なところだろう。読み込みのロジックは結構面倒だ。受信は、UART受信割り込みでデータを取る予定なので、2バイトづつで1ブロックのデータを識別する必要がある。姑息な方法だが、フラグを立てて、最初のバイトと、2番目のバイトを区別する方法に決める(最初のデータを落とすとおしまいだが)。画面表示のタイミングは独立したタイマーの割り込み(正確な時間表示のため)とし、センサー部からの数値データの受信とは非同期にする。いうところの設計はなるべく独立して動くようにしておくのがコツといえばコツである。しておくと、プログラムの開発が別々に出来るし、いわゆる丈夫な(Robust)なプログラムになる(バグや変更に強い)。プログラムの構造は決して簡単にはならないし、ステップ数も多くなるが、独立して動くようにしておく方が、保守性は高い。オブジェクト指向と同じである。描画のタイミングを確かめておく。画面には2周期くらいの心電波形が出るようにして、一画面300ドットが2秒、1周期なら1秒。1ドットの描画タイミングは、33~66msと極めて長い。これに対して、センサーからは、最速で0.625ms単位にデータが送られてくる。読んだ1つだけのデータをそのタイミングの値にするのでなく、平均値を計算しておいて、それを使うべきだろう。タイミングがずれた時や、バッファーの書き込みと読み出しはどちらを優先するかなど、決めておくことが多い。具体的なコーディングには入ることが出来ない。フォトカプラーの道草。TLP552はぶっちぎりに早い(11/2/2014)そんななか、また本題とは関係ないところで脱線してしまった。今度はフォトカプラーである。センサー部と、表示部の間の絶縁をする、UARTのフォトカプラーの選定で道草を食ってしまった。実際の38400bpsのUARTに試しに手持ちの汎用カプラーPS2501を入れてみた。