● 実験テーマ94

「dsPIC33F_QVGA心電計の、P板化」 
(PIC16F1983(8bit/16MHz)でQVGAを扱うには、多少無理があったので、16bit/40MHzのPICで、P板化し実験してみました。)

以下、この実験の顛末記です。

■ 2017.7.4
  ・メモリに余裕のある、dsPIC33FJ64GP802(FLASH:64kB/SRAM:16kB)を使用して
   QVGA表示心電計の実験をしてみることにした。
   今回は、P板設計→ FUSION PCBへ発注手配から先に行うことにした。
   (実験に使い易い適当な、ユニバーサル実験基板が無い。最初に、ユニバーサル作る位なら
   最初から、試作ということで、P板にした方が良い。とにかく格安の、FUSION PCBなので、
   気楽にオーダー出来る。)


■ 2017.7.5〜 2017.7.7
  ・今回のCAD作業の方針
  → アナログ部のパターンは、そのまま動かさないで前回(PIC16F_ECG_BOARD)のを流用できそう
     なので、回路図を最初から作成するようなことはしない。

  ・この今迄の回路パターンを流用して作業を進める方法は、Eagleでは初めて。
   自分なりに試行してみることにした。
    @ プロジェクト名:ECG_BOARD_V4にして、ワークフォルダを作成
    A PIC16F_ECG_BOARD.sch→ ECG_BOARD_V4.sch
       PIC16F_ECG_BOARD.brd→ ECG_BOARD_V4.brd
       にリネームして、@のフォルダ下に保存
    B 回路図を立上げる。(自動的にボードも立上る。)
    C 回路図から、PICを削除。
       その他、変更になる液晶コネクタも削除。
       使うパーツのみ残し、ネットを極力カット。

    →<ここまでの結果>
      ・カットしながらボードを見ると、連動して消えてゆく。
      ・この時点で回路図をセーブ→ 何もエラーは出なかった。
      ・そしてボードを閉じる。ここでもエラー無し。
      ・一回、Eagleを立下げる。
      ・再び、Eagleを立上げる。ここでもエラー無し。

    D デジタル部は、パーツを残してネットも削除。変更するJ1も削除。
       デジタル部のビア打ちも削除。
       IC4の電源を、3.3Vに変更するので、8pinの+5Vネットも削除。

    D ここで、回路図に追加部入力。
       全て追加したら、ERCを掛ける。
       エラー:14個(Supply pin overwritten with more than one signalと、Unconnect INPUTエラー)
       ワーニング:38個(overlaps pin等)
       が出たが、全て承認できる内容なので、OKとした。
       この後の、ネットリスト目視チェックで問題無し。
    E 3.3Vレギュレータ追加と、J1の変更、QVGA化により以下のパーツの移動が必要になった。
       これらの位置決めを行い、予めX-Y座標を計算しておく。
       QVGAコネクタ・READY SW・AUTO/SING.SW・SEC/D SW・READY LED

       以下にここまでの、ボード状態を示す。


■ 2017.7.8
  ・変更・追加部品の配置まで終了した。

  ・QVGA液晶のフット・パターンが合っているか確認。


■ 2017.7.10
  ・AUTOルータ+手直し+ビア打ち+ベタ+DRCチェックまでOKになる。


■ 2017.7.11
  ・今回の一番の懸念は、J1の長穴(メッキ有り)3個が、FUSION PCBの方で問題無く製造出来るか?である。
   今迄、国内の基板屋さんに発注していた時は、Eagleライブラリに付いてくるパッケージをそのまま使うと
   ボード及びガーバービューア上では、長丸Padの中心に、1個のスルーホールが表示されるだけあるので、
   別途、長穴スルーホールである旨、その寸法を指示した図を添付して製造して頂いてた。
   しかし、FUSION PCB提供の、CAMプロセッサを使うと、GMLファイルに外形データと共に、長穴(ミーリングレイヤ)
   データも生成されるようなので(自分で確認した。)このまま、ガーバーデータを生成して、一度、gerbvと、
   FUSION PCBサイトのビューアで、長穴表示されるか確認してみようと思った。
   gerbvでの、J1部の拡大図を以下に示した。
   御覧の通リ、長穴にはなってない。
   しかし、見ずらいが、薄い紫で、ミーリングレイヤの、四角い枠が表示されている。(このままで製造してくれるだろうか?)

   FUSION PCBサイトのビューワでも確認してみたが同じだった。

  ・不安だったので、FUSION PCBに、このガーバーデータ一式を添付して、問合せのメールを出してみた。
   夜回答のメールが届いた。
   「長穴スルーホールには1個だけの円穴があるので、できるだけドリルレイヤでもっと多くの円穴をあけ、
    長穴スルーホールのイメージを表すのをお勧めします。ファイルを直してください。」
   とのこと。


■ 2017.7.12
  ・ただこの方法は手探りでやるしかない。
   WEB上では、スイッチサイエンスさんのサイトとか、ここのサイトに、長穴作成についての説明書きが
   あったが、長穴パッドを一つのデバイスとして作成するので、回路図シンボルが、J1とイメージしずらいし、
   もう一方のサイトの例は、たぶんKiCADの例で、とても面倒で、やる気にはなれなかった。

   回答メールの内容を素直に理解すると、ミーリング加工と同じように、より多くの円丸を置いて、長穴の
   イメージを表現すれば良いように思う。
   添付されてきた参考イメージを拡大すると、ミーリングレイヤに沿って円丸が多数配置されているだけ
   に見える。無限に並べている訳でないので、長穴の周囲はゴツゴツになっている。
   あくまでイメージすればよいのかな?

  ・この長穴イメージは、ボード上でやっても、J1のパッケージ上でやっても、どっちでも良い。
   後者の方が、毎回ボード上に置くだけでよいので、後者にするべきだが、最初は、実験的に、
   
Eagleのボード上で、45-Holesレイヤに、Milling枠に沿って、Hole(ドリル)を複数個配置して、
   
イメージを作った。
   本来は、メッキ有りの長穴なので、44-Drillレイヤを使って、Drill(スルーホール)を複数個並べたい
   のだが、Eagleのメニューには、Drillは無く、Pad(これには、Drillマーク?が含まれる)がこれに
   相当するが、例えば、長丸パッドを置いて、Drillレイヤを表示すると、Drillマークのようなものが
   表示される。
   ところが、これをコピーとか、infoしようと思っても出来ない。(尚、Eagle V5.11.0を使っています。)
   そこでしょうがないので、イメージなので、Hole(つまりはバカ穴)を置く方法にして、メッキ有り長穴
   ということを別途指示することにしました。
   Hole(ドリル)を複数個配置するので、druチェックで、Dimensionエラーと、Drill Disranceエラーが多数発生
   しますが、これは無視してもよいようです。(後でこのデータを送って、FUSION PCBに問合わせました。)
   以下に、別プロジェクトでこの実験をした時の、パターン図を示しました。
   実験なので、JIの長穴3個の内、1個だけイメージしてみました。(ただしベタGND無し)


■ 2017.7.13
  ・今日は、パッケージ上で長穴イメージを追加する方法(本番はこっち)を試してみた。
   現行のJ1(JACK_PLUG:SPC4077.pac)を、FUSION用長穴対応パッケージに修正。
   Pac名:「SPC4077_FUSION.pac」として、Pacを作成し、これをテスト・プロジェクトに置いて
   上手く行くか試す。(ベタなし)
   回路図上に、JACK_PLUG:SPC4077.pacの、シンボル:J2を、J1の反対側に置くだけで
   何も配線しない。これで試した。
   以下のように、綺麗に長穴パッドがイメージされた。

  ・これを、本番のボード上でやってみる。
   回路図上で、旧J1シンボル(SPC4077.pac)を削除すると、ボード上から、J1は消えるが、それに接続
   されている+5Vネットが全て、エアーワイヤに戻ってしまう。
   これはボード上で、J1を削除しても同じ。
   なのでここでは、Replaceコマンドを使う。
   ボード上で、J1を右クリック→ Replaceを選び、開いたリストから、JACK_PLUG_FUSIONを選び、
   リプレースすればよい。
   これで、ネット(パターン)が繋がった状態で置き換わる。
   ところが、Ratsnestコマンドで、ベタGND表示させると、ベタGND(DGND)に接続されている、J1のピン
   のネットのみエアワイヤに戻ってしまうのです。
   ベタ表示させた状態で、Replaceすれば、その時は、上記のようなことは起こりません。
   以下のように綺麗に、DGNDベタに接続されています。

   しかし、1度、Eagleを立下げ、再度ボードを立上げて(この時点では必ず、ベタ非表示になる)再度、
   
Ratsnestコマンドで、ベタGND表示させると、ベタGND(DGND)に接続されている、J1のピン
   のネットのみエアワイヤに戻ってしまいます。

  ・ここらでPCを切り、14時頃出かけて、夜帰宅、PCを立上げたら、何やら、Windows10の大幅な更新(Creators Update)
   があるらしく、更新通知のダイアログが表示された。
   とりあえず、[再通知]のボタンをクリックして無視した。
   ここで
Eagleを立上げ、J1の修正前デバイスファイルと、長穴イメージ追加修正後のデバイスファイルに何か差異
   が無いか比較しようと思って、Eagleのメイン画面で、My_Libを立上ると、そのディレクトリ下にあるライブラリファイルが
   見えないのである。
   入力が済んでいる回路図・ボードは正常に開け表示も異常ない。
   また、Eagleの標準ライブラリは一覧が見られる。肝心の自作ライブラリが何故かこのタイミングで見れなくなった・・・
   しょうがないので、PCを再起動してみることに。
   そしたら更新があるようなので、更新して再起動を選んで、再起動。
   この後も、直ぐ新しい更新があり、再び再起動。
   この時、再通知にしたはずなのに、勝手に、
Creators Updateのインストーラがダウンロードされ、インストール
   されてしまった。(クリエータ向けアップデート。Edge機能追加・セキュリティ強化らしい)


■ 2017.7.14
  ・
勝手に、Creators Updateが実行されてしまった。(後にしようと思ったのに・・・)
   以前に比べると違和感が数点ある。webにも紹介されている。
   ブラウザ:Edgeの字体が変わってしまった。太目で、行間隔が広めのフォームに。
   まあ見易くなったと言えばそうは言えなくもないが・・・(慣れの問題か?)

  ・ところで、My_Libが見えなくなった問題だが、アップデート後は、正常に見えるし開けている。
   ほっと一安心。
   たぶん、開けなくなったのは、その作業中に、このアップデートの為の、事前ダウンロードが複数回
   重なっていた為と想像する。

  ・J1のベタGNDがエアーワイヤになる問題に戻る。
   いろいろ調べてみることに。
    @ J1ライブラリを修正して、新たに長穴イメージ追加のライブラリを作ったので、そこに差異は無いか?
    → Pin名も、Pad番号も、ネットリストも問題なし。差異は無い。
    A J1を元のJACK_PLUGに戻しボード上でGNDピンの中心のみにHOLEを重ねて
Ratsnestコマンドで、ベタGND表示
    → Padの一部とベタの十字部の一部は重なるが、丸穴とは切れる。再度Ratsnestしても、DGNDネットから
       切り離される。エアーワイヤが残る。
       しかし、他のベタGNDに繋がらないPadのネットは正常である。

   B JACK_PLUG_FUSIONの長穴イメージを作り直す。
      3個のPadともに、中心には、Holeを置かない。(ドリルのみにする。)
    → これでも同じ。
   C JACK_PLUG_FUSION修正2:GNDピンのみDRILLに重なる度合いを少なくするため中心から上下2個のHOLEを削除
    → これでリプレースし、
Ratsnestすると、エアーワイヤにならず、Ratsnet:Nathing to doになる。
      但し、中心までは十字に突っ切らないが、Padとベタの一部が上下左右の一部で重なっている状態。
      エアーワイヤにはなってないので、DGNDネットにはベタ接続していると判断。(DGNDネットをハイライトすると繋がっていた)

  ・ようやく、J1長穴化の、Eagle作業終了。
   ガーバー出力→ FUSION PCBのビューワで確認した時に、シルクの位置が悪い個所発見。
   液晶コネクタの、CN8と、その上にあるSW4の枠シルクが重なっている。
   また、液晶の内側に部品番号があると、液晶を装着した時にそれが見えなくなるので、外側に修正した。
   修正後の、ボード画面は以下。

  ・ガーバー出力〜 gerbvと、FUSION PCBのビューワで確認。

  ・これでよさそうなので、正式発注を済ませる。


■ 2017.7.20
  ・FUSION PCBからの、P板待ち状態。
   本日の夕刻、ステータスが、出荷済になり、運送業者の、FedEXにその情報が送信されたとの
   ステータス更新があった。
   データに問題は無く、無事製造してくれたようだ。

  ・ソフトが未だなので、dsPIC33FJ64GP802での、ソフトを検討する。
   
PIC16F1938とは、だいぶハード構成が異なるので、大幅な変更になる模様。
   とは言え、WAVPlayer, easy_audio_fft_analyzerプロジェクト等で、使用実績があるので、
   それらのソースを思い起しながら記述していけば、何とかなりそうである。
   変更が必要な事柄を整理してみた。
    @ 液晶へのポート割付けが、大幅に変更になる。
    A QVGAライブラリの適用
    B アスキーフォント・データ(ASCII12dot.h)に、心拍を示す、ハート・キャラクタを追加
    C ADC設定変更
       T3タイマーに同期した、繰り返しAD変換を使う。
    D T3タイマーの設定
    E SW割込みを、CN割込みで記述(割込みは、これと、ADC割込みの、2種類になる。)
    F トリガ検知のアルゴリズムが異なるので、心拍数表示までの手順が異なる。


■ 2017.7.21
  ・昨日までに、心拍数表示以外は書き上げた。
   今日は、Bをやって、心拍数表示の部分を追加してみた。
   以下の計画図のようなハート・キャラクタをテーブルに追加した。

  ・ソフトの記述が全て済み、ビルドOK〜 HEXまで準備できた。


■ 2017.7.26
  ・午前10:30に、P板が届いた。
   発注から12日で届いた。前回と同じである。


   早速、開封して目視チェックしたが、前回よりも何故かシルクが、全体的に薄い。
   (一番懸念していた、長穴(メッキ有り)3個は、問題無く綺麗に仕上がっていた。その他問題ない模様)



  ・写真では判りずらいかもしれないが、前回のと比較すると、シルクが薄い(シルク文字・線の太さが細い?)
   のが判ります。
   送信したガーバーデータ(GTOファイル)を再確認したがシルク文字・線の太さは、前回と同様に
   最小サイズ=7mil(0.007inch)に指示してあることを確認。
   気になったので、「つくり直しサービス」の対象になるか、
Fusion Japanに確認のメールを出した。


■ 2017.7.27
  ・
夜、7時頃、Fusion Japanから回答があった。
   「
確認した結果、やり直しサービスの適応は無理です。
    基板の生産はロットごとに製造を行うから、ロットが違うと、シルク用のインクは少し違います。
    そうすると、生産した基板もちょっと違います。
    この点について、何卒ご了承ください。」

   とのこと。
   データには問題無いようなので、一安心。
   シルクの太さが細くなってたのではなく、インクの質にバラツキがあり、今回のは、薄目だったようだ。
   個人的な実験基板として使うので問題なし。このことを了承した。


■ 2017.7.28
  ・今朝から部品実装に入り、午前中には終了。

  ・実装については大した問題は無かったが、QVGA液晶に、UL024TFを使うことを頭に置いて、
   部品配置を決めていたせいで、JA1WBYさんの、代替PT基板を使った場合、幅が若干広い
   (両サイド約1mmほどだが、これには今迄、気が付かなかった)せいで、一部、電解コン:C2=47uの
   頭が、QVGAボードの角に接触してしまう。
   また、ICSPコネクタと、QVGAボードのクリアランスが狭く、液晶を装着した状態では、PICkit2を
   差せない。
   UL024TFなら問題ないので、このまま進めることにした。(ただ、相変わらず、aitendoの、この液晶は、在庫無し状態が続いているが・・)
   JA1WBYさんの、代替PT基板を使った場合は、一部電解コンを寝かせて実装したり、ICSPコネクタは実装
   しないで、書き込み時は、PICkit2の方に、ピンヘッダを装着して、それを基板のランドに差して、
   書込みを行うことが必要になると思う。

  ・ハードチェック開始
   (1) 電源チェックと、ハードウエア・テスト(SW,LEDを絡ませた、QVGA液晶表示テスト)
    @ まず、液晶は実装しないで、ICは、LTC1144のみ実装
       +5V→ 5.22V
       -5V→ -5.20V
       VCC→ 3.30V
       AVCC→3.28V
      各IC、CNの電源ピン全て正常供給を確認した。
    A 次に、dsPIC33F実装(未だ、OP AMPは未実装)
       @と同じ、測定結果 OK
      この状態で、PICkit2を装着して、HEX(ハードウエア・テスト用:dsPIC33F_ECG_HW_TEST.hex)
      を書込んだ。ここで注意が必要なのは、必ず、SEC/D SWと、TRG_LEVEL SWは、下(open)の位置
      にして、共用にしているPGCと、PGDラインが、DGNDに落ちないようにして書込むこと。
      → PIC認識・書込みOK
         ロジック部のハードウエアは、全てOKを確認した。
         尚、動作中の電源電圧は、以下の通り。
         +5V→ 5.20V
         -5V→ -5.19V
         VCC→ 3.29V
         AVCC→3.27V


■ 2017.7.29
  ・
ハードチェック続き。
  (2) アナログアンプ部の単体テストと、電源確認
    OP AMP 3個全て実装(PICは実装したままで、液晶は外す)
   @ この状態で電源チェック OK
       +5V→ 5.21V
       -5V→ -5.01V
       VCC→ 3.29V
       AVCC→3.24V

   A 数mVオーダーの小電圧出力で、比較的、ノイズの少ない自作FG_V2を使い、アナログアンプ部の単体テスト
      を行った。以下の通りこれも、OK(PICの、AN1ピンで波形を取得確認した。)

  ・本番ソフトを書込み、本番動作チェック開始
  <最初の結果>
   @ FG_V2で、サイン波入力
     条件: 4.9Hz入力・250mS/D・TRG LEVEL= 2.5V
     結果:
 
        ・ 波形の周期・トリガレベルは、OKだが、bmp表示が正しくない。
          サイン波入力に対しトリガ検知(立上り検知)をしているせいもあるが、多少表示が出力レベルの
          変化でバラツキ、157〜 162bpmになる。正解は、294bpmなので、約半分の表示である。

        ・ 500mS/D、TRGレベル= 0Vの切替え動作はOK
        ・ ややHOLD SWが効きにくい。
          波形描画が速くなったので、表示中に合わせて押すのが多少、難しいが、長押しして離せば
          OKなので良しとする。
        ・ デジタル・フィルタは、OK(50Hz入力で完全に消える。)
   A 先ほども書いたが、心拍数表示が、約半分になる。
      これは、あきらかなプログラムの誤りがあった。
      GLCDの時の、sample周期で、bpmを計算していた。
      GLCDの時は、500mS/D→ 10mS/ 1S→ 20mSだったが、
      QVGAの時は、250mS/D→ 5mS/ 500mS/D→ 10mS でないと駄目。
      これを修正してみた。
      表示のバラツキが気になるが、約倍の表示にはなった。
      例えば、FG_V2では、最小4.9Hzまでしか出せないので、
      自作DDS_OSC(出力に、1/100のATTを入れて、DDS本体のレベルを上げることによってノイズを抑えた。)から
      1Hzを入力すると、表示は、60〜 62bpm、又、2Hzを入力すると、表示は、124〜 126bpmになる。
      (DDS出力を微妙に変化させると、bpm表示もわずかに変化する。)


■ 2017.7.31〜 2017.8.4
  ・心拍数表示のバラツキは、疑似的にサイン波入力で実験していて、非直線部でエッジ検知を
   しているせいとも思われるが、最終的に、PICの、AN1ピンの波形ノイズの影響もあると思う。
   ノイズが多いと、AD生データを読込む際、読み値がバラツクはずである。
   また、これを元に、デジタルフィルタの計算を行っている為、結果的に、波形の歪具合も変化し、
   エッジ検知点が、ズレることによってもバラツクと考えられる。

   この期間は、そのことについて確証を得るため、色々と試してきた。
   下写真は、比較的出力ノイズの少ない、自作FG_V2で、確認した例を示した。
   PICの、AN1ピンの波形に、ノイズは殆ど乗ってない。
   このFGの最小出力周波数は、4.9Hzと中途半端なので、10.0Hz出力に設定した。
   ECGとしての、心拍数表示は、現実的ではないがバラツキも少なく、上手くトリガが取れると、
   両レンジ(500mS/D・250mS/D)で、600bpmと表示し、OKである。

  ・一方、信号源に、自作DDS_OSCを使用し、出力に、1/200のATTを入れて、ECG入力をした場合
   (このOSCは、小出力時のノイズが多いので、ATTを入れて出来るだけ本体のレベルを上げるようにしてみた。)
   PICのAN1入力には、御覧のように、これでも目立つノイズが乗っている。
   しかし、ECG入力後は、デジタルフィルタの効果で、綺麗な波形が表示されている。
   まあ、上手くレベルが合ってトリガが掛かると、1Hz入力で、60bpm表示なので、これもOKとして良いだろう。
   また、時々波形は見た目、正常に表示されているのに、0bpmと表示されるのが気になる。

  ・心拍数表示だが、時々0bpmになるのが気になる。
   デバッグ用に、このルーチンに使われている変数の、x, n, p(Point)を表示するようにして、もう少し
   プログラムの挙動を確認してみることにした。
   pは、初回のトリガ検知ポイント・ xは、2回目のエッジ検知ポイント・ nは、x-pで両検知点の間隔数である。
   500mS/Dの場合、心拍数bpm= 6000/nで算出される。

   今度は、さらに、DDS_OSC本体の、レベルを出来るだけ上げて入力しようと思い、DDS_OSC出力の、ATTは
   1/100にし、ECG側の、GAINを、1倍に設定した。(今迄は、本番と同じ約3倍に設定してた)

   これで何とか、時々0bpmになる理由が解った。
   これが起きた時の各変数は、p= 189, x= 190, n= 1になることが確認出来た。
   この時6000 bpm表示が正解だが、3桁表示としているので、0bpmとなる。
   n= 1ということは、初回検知から、1サンプルの時間で次が、検知されたことを示す。
   通常では起こらない現象だが、ノイズの影響で、起こっていると推測する。
   この現象を避けるために、2回目の検知成立かつ、2回目検知が、1サンプル分の時間で起きたなかった場合のみ
   心拍数表示をするようにソフトを修正した。

   後、改善点として、最初のトリガか、2回目のエッジが検知されなかった場合は、心拍数が表示されていると
   不自然なので、表示しないようソフト修正した。

   以下に、1Hz及び、2Hz入力時の、各変数を確認した時の写真を示した。
   1Hz入力、250mS/Dレンジの時、n= 197(理論値は、200)となっていて、60bpmと表示しているが、
   これは、
bpm= 6000/(5 * n)= 6000/(5 x 197)= 60000/985= 60.913 のところ、整数計算しているため
   小数点以下が切捨てられる為である。
   余り精度には、こだわってないので、これで良しとする。    

  ・これで大方、ソフトも良さそうなので、シングルトリガにも、この心拍数表示アルゴリズムを適応し、
   動作確認してOKとなる。

  ・稼働状態での電源コンディションを取ってなかったので取る。
  <条件>
   @ 500mS/D
   A 2.5Vトリガ
   B FG_V2より、4.9Hz入力

  <測定結果>
   +5V→ 5.20V
   -5V→ -5.01V
   VCC→ 3.29V
   AVCC→3.14V

   ※ 入力消費電流≒ 0.13A(モバイルBAT使用: 4.97V 0.13A)

  ・最後に、人体に電極をセットして、ECGとしての動作確認をした。
   心電波形も、心拍数表示(私の場合、平均して85bpm程度)も良いようである。


<回路図>
 ・こちらから、どうぞ→ 「ECG_BOARD_V4」

<最終ソース及びヘッダファイル>
 ・こちらから、どうぞ→ 「ECG_Scope_V4.c」

                  /// GLCDライブラリ
                  colorlcd_libdsPICVH.c
                  
colorlcd_libdsPICVH.h

                  /// アスキーフォント
                  
ASCII12dot.h


← 実験テーマ1に戻る   TOP PAGEに戻る   実験テーマ95へ →