● 実験テーマ119

「中華製ロードセル+秋月のHX711モジュール使用のMAX500g重量計の実験」
 (ロードセルはビーム型のSC616C-500を、MPUには、
PIC18F14K50を使いました。)

※ 191204
→  2回目の更新です。
   液晶を、超小型グラフィック液晶:AQM1248Aに替えて、ベースフォントの4倍の拡大文字で重量値を表示してみました。

11月12日からの記事を参照してください。


※ 191115
→ 1回目の更新です。
   Eagle CADにより、基板設計を行い、P板化しました。

 ・11月1日からの記事を参照してください。




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

■ 2019.9.25
  ・前からロードセルを使った重量計には興味があったが、頭から高価な物との認識でいたので、
   着手までは至らなかった。
   ところが、WEBを徘徊していたら、安価(税込み540円)な中華製のロードセル:SC616C-500gが秋月で販売している事をを知る。
   また、計装アンプ+24bitADC+安定化印加電源コントロール部+SPI_I/Fが内蔵されているコントローラIC:HX711と、周辺CR・TR類が
   実装された秋月のモジュール:AE-HX711-SIPがこれまた安価の税込み350円で売られていた。
   これを使って、MAX500gの重量計を実験してみることにした。

  ・「O-Fmily」」さんサイトの、「HX711 (24bit A/D) + ロードセル [SC616C-500g] 重量計」というタイトルの記事が理論的に
   詳しい説明が載っており、機能的にも風袋引きも、校正機能も含まれている。非常に参考になりました。

   ハードとソフトは、AVRのMPU+BASECOM-AVR(AVR用の、BASIC言語)で開発されておられる。
   ほぼ同じ仕様で、これを、PIC18F1K50+C言語(C18又は、XC8コンパイラ)に移植する形で作業を進めることにした。

  ・とりあえず水魚堂のCADで「HX711モジュール内部回路と 総合接続図」を作成した。
   末尾のリンクを参照してください。   


■ 2019.9.26
  ・ロードセル出力電圧と、AD変換値からのグラム換算式について自分なりに解釈整理してみた。
   @ 印加電圧:Vexcについて
      ・HX711モジュール内部ブロックを見ると、明記はされてないが、定電圧安定化回路が内蔵されている模様。
      ならば基準電圧:Vrefと、出力電圧を比較するコンパレータが内蔵されているはずである。
      Vref= 1.25Vのようである。
      そして、外付けの出力電圧センスのための分圧抵抗は、R1=20k,R2=8.2kなので、バランス状態の時
      コンパレータに入力されるフィードバック電圧:Vfb= Vref= Vexc x R2/R1+R2になるので、
      Vexc= Vref x R1+R2/R2= 1.25V x 20k+8.2k/8.2k= 4.298≒ 4.3V ということにる。

   A ロードセル定格出力= 0.7±0.15[mV/V]、これを、Gain= 128倍で使用。
      (この記載についてデータシート上では、0.8±0.15[mV/V]となっていたが、殆どのサイトの記載は0.7±0.15[mV/V]
       となっていたので、こちらを採用した。)
     ・±0.15[mV/V]のバラツキがあるので、校正が必要となる。
     ・最大500荷重時の、ロードセル出力電圧:Vcell= 0.7mV x 4.3V= 3.01mV
      AD入力電圧= Vcell x 128= 3.01mV X 128= 385.28mVになる。

   B Aから、ロードセルに、1gの荷重をかけた場合の、Vcellは?
      1g x 3.01mV/500g= 0.00602mVになる。

   C 1bit当たりの入力換算電圧:Vbitは?
      ADCの分解能は、24bitなので、1/2^24= 1/16777216
      また通常、重量計のADCに印加する基準電圧は、Vexc(レシオメトリック方式)なので、
      Vbit= 4.3V x (1/16777216) x 1/128= 0.000002002343535423279mV

   D 1gに対する、AD変換値は?
      Vcell/Vbit= 0.00602mV/
0.000002002343535423279mV= 3006.4771072

   E 計算誤差を少なくする為に、Dを、10倍して、30065にする。
   F 重量表示を、0.1g単位にする為に、さらに
10倍するので、結果的には、100倍してから以下のようにグラム換算する。

      測定グラム値(0.1g換算)= (AD変換値 x 100)/30065 になる。
      ※ 分母の、30065が、
換算値の係数になる。
      ※ ただし、ロードセルの出力電圧は±0.15 mV/Vの個体差があるので、換算値の係数は、[23,622]〜[36,507] の範囲で
         個体差を校正する必要がある。


■ 2019.10.7
  ・プログラムを、AVRのBASIC記述から、PICのC言語(最初はC18コンパイラ使用)記述に変換するのだが、私にとっては、
   何点か懸念事項がある。
   それは、AD変換値・重量値等、long型(符号付32bit整数)変数の液晶への表示と、内蔵EEPROMへのグラム換算値(16bit整数)
   の読み書きである。

   後者は、PIC18Fの内蔵EEPROMへは、8bit単位でしか読み書き出来ないので、16bitを上位と下位8bitに分割して読み書きする
   工夫が必要そうである。
   通常の読み書きであれば、その手順通リ関数を書けば良いのだが、HEX書込み時に行う初期値の書込み方法が不明である。
   C18でなく、XC8コンパイラであれば、そのマクロ記述の実績があるので、それで書けば良いのだが・・
   この辺の迷いがあるので、とりあえずは、EEPROMアクセス無しで、C18で動かしてみることにした。
   (C18の方が、MPLAB IDEの立上りも速いし、コンパイルも安定しているので。)

   前者であるが、標準関数ライブラリ(stdio.h)に用意されている、sprintf関数に、お世話になることにした。
   メモリーは食うが・・・なんとか収まるでしょう。


■ 2019.10.17〜 2019.10.20
  ・最初のソース書き上げる。
  ・ロードセルと、HX711モジュールが届いているので、秤量台治具の製作をした。
   2mm厚アクリル板を、2枚使って、4本のスタッドを付けたビーム型ロードセルを、アクリル板でサンドする形で固定する簡単なもの
   を作った。(O-Fmilyさんの写真を参考にしました。)

  ・早速、ロードセルと、HX711モジュール、PIC18Fトレーニング基板間の、ケーブル接続をし、動作検証開始。
   @ まずは、VCCと、Vexcl実測
      Vexc= 4.21V (VCC= 5.06V)で、OK
   A 高速ロジアナで見たいところだが、自作の低速(100KHz程度が限界)のしかないので、SCLKの周期を拡げて
      DATとのタイミングを確認したところ、クロックに同期したデータがPIC側に送り込まれているので、HXモジュール
      は一応動いてはいるようである。
   B 重量値だけ見ると、1円玉荷重で、1.0gを表示して取り去ると、0.0gになる。
   C ただ、生のAD変換値表示(無荷重時):FFFD96xxと、移動平均値(無荷重時):FFFD9A2xが正しいかは検証が
      必要である。(無荷重なので、上位バイトは少なくとも、00になるのでは?と思っていたので・・・)
      まあ移動平均値表示の方は、下位4bitは別として、その上の8bitの動きはかなり少なくなっているので、
      フィルタリングはされているようである。

      アナログがらみで調べてみた。
      無荷重時の、ブリッジ出力電圧は、マイナス側にズレていた。→ -0.2mV(ADC入力は計算上128倍して、-25.6mV)
      ロードセルの仕様を見ると、ゼロ出力= ±0.1mV/Vとある
。あまり良く無さそう。
      実測の印加電圧が、4.21Vなので、±0.421mVの範囲でズレることになる。
      テスターのオートレンジで、mV測定しているので、0.01mV単位の測定は不可。
      そこで、アバウトだが手で上アクリル板に荷重を掛けて(分銅は手配中)表示を、500gにし
て測定してみた。
     
ブリッジ出力電圧= 3.01mV(ADC入力は計算上128倍して、-385mV)。
      その時の生のAD変換値表示は、0015xxxxになっている。
      無荷重時は、FFFD9600(変動しているxxは0とする)で、10進では、-158208
      もし無荷重時、ゼロが理想的に、0mVの場合は、変換値も、0になり、
      500g荷重時は、計算上、0016EBC2(1502146)になるはずである。
      ところが、-158208のオフセットがあるので、理想値の、1502146のオフセット分を足すと、1343938(001481C2)
      なのでアバウトな計算ではあるが、合っていそうである。良しとしました。

   D CAL機能についてはオリジナルと少し変えました。
      グラム換算値加算SW及び、グラム換算値減算SWを長押しした時は、それぞれ連続可変するようにしました。
      オリジナルは長押しタイマーが用意されていて1秒以上押すと、10単位で加減算するようになっていましたが、
      その必要もないと考え簡易的な方法に変更しました。
      C18版では内蔵EEPROMへのアクセス無し(換算値のEEPROMへの読み書き無し)としたので、最初から校正を
      行って重量値が合うような換算値を変数:Sensorcalに設定しておくことにしました。
      未だ注文した分銅が届いて無いので、50円玉2枚(7g x 2=14g)で校正したところ、Sensorcal= 32340で合いました。

  ・これで、C18版のプロジェクトは良さそうです。
   AD変換値が、プラス領域になった写真を以下にアップします。
   これは、工業高校機械科に在学中、実習で作った真鍮製の文鎮です。


■ 2019.10.21〜 2019.10.23
  ・C18版を、MPLAB X IDEを使ったXC8版に変換すると共に、内蔵EEPROMへのグラム換算値の読み書き保存を
   試してみる。
   XC8コンパイラでの、内蔵EEPROMの、16bitデータの読み書き手順は大方、次のようなイメージで考えれば良さそう。
    @ 16bitデータを、バイト単位に分解し、上位バイト、下位バイトの順に書込む。
    A 読出し時は、まずバイト単位に、2バイト読出した後、16bit変換する。
   この考えで上手く行きました。
   詳細は、末尾にアップしたソースを参照してください。(hex書込み時のみに行う、初期値書込みについてもソース参照のこと。)

  ・上記以外の、XC8版に変換する際の主な事柄(詳細は、ソースを参照してください。)
    @ delay記述変更
    A 液晶のカーソルOFFは不要になる。(ライブラリ側に移した。)
    B カーソル位置指定関数の追加(ライブラリに、lcd_posyx関数を追加した。)

  ・XC8版も何とか上手く行ったので、以下に電源ONからの全体の流れを項目別に示しました。


---<「Eagle CADで、基板設計〜P板化した記事>-------------------------------------------

■ 2019.11.1
   ・時間があるので、Eagleで、P板化することにしました。
   HX711モジュールは、以下のように、秤量台の隅に絶縁マットを、ひいてその上に厚手の両面テープで
   固定することにしました。(モジュール側には取付け穴が開いていません。)


   なので、P板側の配線量は少なくシンプルなものになりました。
   またできるだけ小さなサイスにしようと思い、電源ジャックと電源SWの位置は、液晶の右上側にしました。   

  ・部品配置は、以前作った「2BAND DSP RADIO 2018-8」とほぼ同じで良さそうなので、この時の、
   SCHデータ及び、BOARDデータを呼出して修正する形で作業を進めることにしました。
   主な修正点は以下です。
    @ 基板サイズの変更: 100x80mm→ 87x65mm
    A 液晶は同じドライバで視覚性の良い、バックライト付きの、青バック白抜き文字のものに変更。
       (SC1602BBWB-XA-GB-G
    B RESETを除く、操作ボタンを1個削除(4個から3個になる。)

  ・元回路図から不要部分を削除し、バックライトLEDの電流制限抵抗を追加。
   
全てエアーワイヤに戻す。(不要禁止帯・穴+ベタ設定も削除)
   ここまでの、BOARD編集画面を以下に示しました。

  ・回路図の、ERCチェックでは特に問題無し。


■ 2019.11.2〜 2019.11.3
   ・基板サイズ+シルク修正も含め、部品配置修正完了。

  ・例の電源ジャック:J1のGNDピン(長穴SH)とベタGNDとの接続の懸念が相変わらずあり、最初は繋がらなかったが、
   GNDピンの近傍に2個ビア(DGNDネット)を配置してその部分を手配線で繋げてから、Ratsnetコマンドを実行したら
   上手くベタ接続された。(サーマルPAD形状になる。)
   以下にEagle作業最終版の、BOARD状態を示した。


■ 2019.11.5
   ・ガーバーデータを、CAMプロセッサで作成し、gerbv及び、FusionPCBサイトの、ビューワにて確認した。

  ・これでよさそうなので、正式発注を済ませる。(運送業者はDHL)
   尚、前回25%OFFのクーポン取得済なのでこれを使って、何時もより若干安くオーダー出来ました。


■ 2019.11.12
   ・今回は部品点数も配線量も少なかったせいか、P板製造期間が短くて済み、発注から丸1週間での納品となりました。
   DHLのドライバによって、P板が無事到着しました。


■ 2019.11.13
   ・部品実装が完了した。

  ・動作チェック開始
    @ 電源ラインショートしてないか?→ OK
    A IC・LCD未実装で電源電圧確認→ 5.00V OK
    B PICのみ実装して、HEX書込み→ OK

    C LCD実装+秤量台(HX711モジュール)を接続して動作確認。
      ・バックライトLEDが暗い?
       回路図に間違いはない。
       LCDの裏側を見ると、バックライト側の、5pinコネクタのピン番号は数字でなく、上側がA(アノード)、下側がK(カソード)
       と印刷されている。
       回路図の、1pin側は+5V、5pin側は100Ωを介してGNDへ接続されているのに、Eagle設計時、BOARD上に置く時
       逆さに置いたため、A(アノード)と、K(カソード)に対し逆接続になってしまっている。
       P板側でテレコ修正するには、カット2箇所とストラップ2本が必要になるので、P板側では、100Ω未実装にして+5Vライン
       をカットすることにし、LCD側でバックライト有りの設定(R9に100Ωを実装と、ジャンパーJ3の半田ブリッジ)にして対処
       することにした。
       これに関しての詳細は、下の写真と、このページ末尾の、Eegle回路図中の<修正履歴>のコメントを御覧ください。

  ・この他は問題無く動いた。
   稼働時電源電圧= 4.99V
   ブリッジ印加電圧= 4.22V

   HEX書込みで、校正値(グラム換算値)が、デフォルトに戻ったので、100gの分銅で再校正しました。
   以下に動作模様を示しました。


---<AQM1248Aに拡大文字で重量値を表示した記事>-------------------------------------------

■ 2019.11.12
   ・AD変換値の表示はデバッグ的な物なので無くてもよい。
   重量表示を、もっと大きな文字で表示させたいという思いが有り、超小型グラフィック液晶:AQM1248A
   を使って、ベースフォントの拡大文字で表示させようと考えた。
   元々借用していた「初めてのPIC入門」サイトの当該ライブラリには、2倍・3倍拡大文字の関数が用意
   されているので、3倍文字を使って重量値を表示させたら、どんな感じになるかデモを作って試してみた。
   ハード的に問題なのは、トレーニング基板の、PIC18F1K50のVCCが、5V設定なので、そのままだと
   AQM1248Aの、3.3V動作と整合が取れないことになる。
   トレーニング基板ということもあり、PIC18F1K50のVCCを、ジャンパピンで、5V/3.3Vの選択が出来るように
   改造することにした。
   3.3V電源は、以前からトラ技の付録(2008年1月号)についていた「USBマルチ電源」の、3.3Vレギュレータ部
   のみ実装(ヒューズ部にはSWを実装・給電プラグは別のものを実装)して使うことにしました。
   下写真のような重量表示の感じになりましたが、液晶中央にもっと大きな文字(4倍拡大)を表示させたいなと
   思い、4倍拡大の関数を、ちょと考えてみたのだが、面倒くさそう。


■ 2019.11.19
   ・4倍拡大の関数だが、WEBを徘徊している内に、やっておられるサイトを偶然見付けた。
   「未来ガシェット研究所(仮)」さんのもの(pic16f1823使用)が使えそう。
   一つの関数で引数により、等倍・2倍・3倍・4倍が選べるように記述されている。
   自分なりに記述を整理して試してみた。
   同じデモ画面だが、よさげな感じである。
   尚、フォントも等サイトのもの(全て、5x8サイズ)を、そのまま使いました。
   ところが、4倍でマイナスを含めた重量値を表示させてみると最下位桁が画面に入り切りません。


■ 2019.11.25
   ・小数点のみ幅狭フォント(0xff終端)にしたらマイナスを含め最下位まで表示できた。


   ただ、単位のグラム'g'までは表示できないので、それはラベル・プリントソフトで印字したラベルを外に
   貼ることで対処することにした。


■ 2019.11.26
   ・4倍文字表示実験のメドがたったので、これを、HX711重量計の表示器として採用してみる。
   もう一枚P板実装して、いくつかの改造を行い、それで進めることにした。
    @ ハードSPI(mssp)を使うので、1部ポート割付けが変更になる。
       空ポート:RB4を、SW2(g+)に使い、前SW2ポートとしていた、RB6は、SCLKピンとして使うことにする。
    A HX711系の電源は、PICを含め、5Vなので、AQM1248A(VCC=3.3V)をそのまま接続出来ない。
       そこでレベル変換が必要になる。
       入力5Vトレラントのバッファ:TC74VHC32(4個のORゲート:VCC=3.3V)を使えばOK。
       今の、液晶:SC1602サイズの小基板(ユニバーサル)の上に、3.3V 100mAのレギュレータ部+
       レベル変換ゲート+AQM1248Aを実装して、本体とドッキングする形を取る。


■ 2019.11.29
   ・P板改造と、AQM1248A側の小基板の実装・製作が完了した。

  ・動作チェック開始
   @ MAINボードの、PICにHEX書込みOK
   A AQM1248A小基板をドッキングして動作確認。
      特に問題は無かったが、安定表示用の緑LEDがやけに明るい。
      何時もは回路図に記載通リ、Linkmanの、HT204GD(普通の光度:95mcd)又は、秋月で以前は売っていた
      20個入りの、LT3K8Bを1kの制限で使っていて丁度良い明るさだったのだが、今回はこれで良いだろうと
      軽い気持ちで、OSG5TA3Z74Aというものを秋月で購入している。
      後から当該商品のページを開くと、やけに明るく点灯している写真が目に留まった。
      高輝度タイプとは書いて無かったが、視界が広いタイプのようで、光度スペックもかなり高い(1120mcd)
      ようだ。1kで、2mAほどしか流してないのにかなり明るい。
      結局、見た目で丁度良い明るさになるように調整したところ、10kで収まったので、10kにしてある。
   B 稼働時の電源電圧は以下
      +5V→ +5.00V
      +3.3V→ +3.30V
      Vexc= 4.22V

  ※ 動作の様子(測定画面・校正画面)は、本ページ冒頭の写真を参照してください。  


<回路図>
 ・こちらからどうぞ 
「HX711モジュール内部回路と総合接続図」
             「HX711 重量計テスト回路」

             「HX711重量計」 (Eagle回路図) ※ 191115 更新
                                  尚、ソフトは下記テスト版で、そのまま動きます。

<最終ソース・ヘッダファイル>
 ・こちらから、どうぞ
    /// メインソース
     HX711_TEST_XC8.c

     /// 液晶ライブラリ
     LCD_Lib_xc8.c
     LCD_Lib_xc8_V1a.h


● 以下は、AQM1248Aに拡大文字で重量値を表示したプロジェクト:HX711_TEST_2_XC8 の回路図及び各ファイルです。191204更新              

<回路図>
 ・こちらからどうぞ 「HX711重量計_2」

<最終ソース・ヘッダファイル>
 ・こちらから、どうぞ
    /// メインソース
     HX711_TEST_2_XC8.c

     /// 液晶ライブラリ
     spi_glcd.c
     spi_glcd.h

     /// フォント
     font.h


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