公開日:2025/07/19
title.png

35th Season


#35-7 重量測定

 前々回組み立てたキッチンスケールを使って、重量を測定してみましょう。

キッチンスケールの設計

 ハードウェアとしては、「#35-5 キッチンスケールを組み立てる」で以上、終了しています。後は、制御するマイコンの選定と、その上で走らせるソフトウェアの設計が残っています。

 こちらで指摘した様に、ノイズの影響を最小化する一番手軽な方法は、Arduino UNOを使ってHX711モジュールを5V駆動する事です。今回は測定した重量を表示する表示器も使いたいので、ノイズ対策には目を瞑り、Cmod A7ボード(FPGA)で開発しているオリジナル16ビットCPUコアMoscoviumを使おうと思います。

 Moscoviumシリーズの設計データは、以下バナーより、GitHubにアクセスすると取得可能です。

btn_moscovium.png

 開発環境はBlockly for Moscoviumです。24ビットAD変換データを取り扱う必要があるので、オリジナル32ビットCPUコアNihoniumを使います。浮動小数演算も使うので、S-FPUが必須です。TFTディスプレイは、こちらのSPI-TFT⇔PMODアダプタSPI接続TFT表示器を使います(下図)。

a331_expr.jpg

 これらの条件を満たすマイコンは、NHOC113DB9808等です。デザイン(回路)をCmod A7ボードに書き込む手順については、こちらをご確認ください。

 校正するために必要なスイッチなどのU/Iは必要に応じて将来追加するとして、今回はシリアルモニタコマンドによって校正を実行する事とします。開発環境は、Blockly for Moscoviumです。

移動平均

 予備実験してみたところ、24ビットAD変換器の読み出しデータには、ホワイトノイズらしきばらつきが観測されました(下図)。

a357_adnoise.png

 横軸にAD変換のサンプル数、縦軸に24ビットAD変換器の読み出し値[LSB]を取ったグラフです。青色プロットが測定したままのAD変換値[LSB]、赤色線は測定値の64区間移動平均です。
 青色プロットの様な測定ばらつきをそのまま放置すると測定値が常にワラワラと変化してしまって使い難いので、移動平均を取ることにしました。移動平均(赤色線)により、だいぶ安定して読み取る事ができそうです。

 移動平均の区間数は以下の定数hx7_mva_maxで指定可能です。

a357_const.png

 デフォルトでは、64区間の移動平均にしてあります。HX711のAD変換時間は10sps(Samples per second、RATE端子=LOWの場合)なので、64区間の移動平均を取るのに約6.4sかかります。被測定物を載せたら、測定値が安定するまで最低6.4s以上待ってください。

 取捨選択するしか無いので、安定までの時間が気になった方は、良さそうな値を模索してみてください。

※普通に割り算して移動平均を算出しているので、hx7_mva_maxは2冪数にこだわる必要ありません。

プログラム

 以下に完成したプログラムをリンクします。

  完成プログラム:kitchen_scale.xml

※ブラウザによっては、XMLファイルをレンダリングして表示してしまうので、「右クリック ⇒ リンク先を保存」などしてください。

 Blockly for MoscoviumXMLタブに貼り付けてご利用ください。完成プログラムのコードは、こちらからも閲覧可能です。

 コンパイルしてMoscoviumへ転送すると、シリアルモニタから以下のコマンドを受け付けています。

  シリアルモニタコマンド仕様:

 校正するためには、シリアルモニタを接続する必要があります。一度校正を済ませて、プログラム中の定数に設定しておけば、キッチンスケールとしてはシリアルモニタ無しで自立できます。以下に校正用定数の意味を示します。

  校正用定数:

 上の校正値は全て整数です。

実験の重さ

 Cmod A7ボード、SPI-TFT、AD変換器HX711モジュールを、以下表の様に接続してください。

SPI-TFTアダプタ 接続 Cmod A7ボード 接続 HX711モジュール
PMODピンヘッダ PMODコネクタ  
3V3 VCC
  GND GND
port_iop[6] SCK
port_iop[7] DT

※「3V3 → VCC」の代わりに「VU(5V) → VCC」とした上で、Cmod A7ボードとHX711モジュールの間にレベルシフタL/Sを挟む接続も有効です。


 以下図が実験中の様子です。

a357_expr.jpg

校正実行

 ロードセルには、歪みの大きさによって変動する抵抗値に個体差があるため、最初に使う前に校正が必要です。以下実験サンプルに従って校正を実施して行きます。

 まず、天板に何も載せない状態で、シリアルモニタから以下のコマンドを実行してください。

  実験サンプル:【 】内はシリアルモニタからの送信データ
  【cali,0】
  OK+ hx7_load_lsb_0=16263640
  OK+ hx7_load_lsb_w=18271316
  OK+ hx7_load_g_w=5000
  OK: cali

 読み出し値A0=16,263,640=0xf8_29d8という事は負数ですね。24ビット符号付整数として見ると、A0=−513,576です。HX711のアナログ入力は差動入力なので、入力信号の大小によっては負数が返ることもあります。ホイートストンブリッジの接続次第では正の値が返ることもあるのでしょう。
 今回のプログラムでは24ビット符号無整数として受信し、そのまま使っています。

 続いて、天板に303[g](※)の物体を載せた状態で以下のコマンドを実行します。

  【cali,303】
  OK+ hx7_load_lsb_0=16263640
  OK+ hx7_load_lsb_w=16393480
  OK+ hx7_load_g_w=303
  OK: cali

※お手元の原器の重量に合わせて、数値を変更してください。

 100円硬貨300枚を詰めた袋で校正しました。【cali,300】ではなく、【cali,303】としたのは、袋の重さ約3gを加算したためです。袋の重さも誤差になるという事ですね。本来なら、裸の1円硬貨×300枚を使いたかった所ですが、それは取り回しに難があり、断念せざるを得ませんでした。
 以上の手順で校正完了です。たった今、校正した値が有効なので、そのままキッチンスケールとして使い続ける事も可能です。毎回校正してから使い始めるのは面倒なので、【cali】コマンド実行時に表示された定数値をプログラムに設定した上で、コンパイルし直して使うのがお勧めです。

相関グラフ

 前節で校正した結果を使って、試しに1円硬貨100枚と200枚、300枚入り袋の重量を計測してみました。

被測定物 測定値 備考
AD変換値[LSB] 重量[g]
何も載せない(0g) 16,263,640 0.000  
1円硬貨×100枚(100g) 16,307,380 102.073 茶封筒(約2g)含む
1円硬貨×200枚(200g) 16,350,197 201.993 茶封筒(約2g)含む
1円硬貨×300枚(300g) 16,393,557 303.180 ビニル袋(約3g)含む
1円硬貨×600枚(600g) 16,523,138 605.575 300枚×2袋
1円硬貨×900枚(900g) 16,635,260 867.228 300枚×3袋
1円硬貨×1,200枚(1,200g) 16,735,383 1,100.879 300枚×3袋+200枚+100枚

 特に、×900枚以上の計測で誤差が大きい点に関しては、負荷(従って歪み)の大きさと、AD変換器からの読み出し値がリニアではない可能性を疑わせます。上表の測定結果を使って相関グラフを描いてみたところ、以下図のようになりました。

a357_calgph.png

 入手したロードセルの定格は5kgだと思われます。5kgと言ったら、筆者がいつも購入しているお米1袋の重さです。少なくとも、今回作成したキッチンスケールの天板(直径約10cm、厚さ約2mm)に、お米1袋を載せる事は不可能です。これが、フルスケール近辺まで相関を取れなかった理由です。
 耐荷重付近まで測定したいのであれば、もっとしっかりした材質で、もっと大きな測定台を作り上げる必要があります。

相関グラフを使って再校正

 こちらに示した方法だと、0gと303gの2点で校正を実施しました。もし前節の様に、複数の重量に対して相関を取ったのであれば、一次回帰直線を使って校正した方がより正確で確からしい校正が可能です。
 前節の相関グラフより、一次回帰直線の傾きA=401.53540、切片B=16,263,640なので、以下の様に校正用定数値を決定できます。

 ただ、相関グラフの所で指摘した通り、ロードセルの特性自体に直線からの偏差が存在しています。一次回帰直線による校正は、この偏差を無視して「一番確からしい直線」で校正したことに他ならず、重さのレンジによっては、実際の重さからの誤差が大きく観測される場合があります。
 手間を惜しまず正確さを最優先とする場合は、測定したい物体(被測定物)と同じくらいの重さの原器を使って校正し、その直後に被測定物を計測する、と言うのが一番だと思われます。その場合は原器にも市販の分銅など、正確な重さの判る物を使いましょう。

 最後に以下動画で、実際にキッチンスケールを使っている様子をご確認ください。



 64区間移動平均による安定時間約6.4s等に着目して、ご覧ください。比較的長めの移動平均を取ったお陰で、小数点以下1桁くらいまではピタッと決まっていると思います。

 なお、昨今何かと話題のお米ですが、上の動画で最後に測ったお米の真空パックは約300gと言う事で、およそ2合に相当します。筆者は、まだ随意契約の安い備蓄米が購入できていませんm(1x_x)m。輸入米でも良いので、以前の様に2,000円/5kgで購入したいものです。先日安く購入した台湾米は、今、美味しく頂いております。

※毎日食す主食故に安く入手したいので、国産には全く拘りません。備蓄米が無理なら、次の狙い目はカリフォルニア米です。慌てず、騒がず、安いお米を探求して行きます。

 と言う事で、小泉氏の奮闘も筆者の手元には結果として届いておりませんので、「非与党への投票」は、継続します(2025年参議院議員選挙)。結果を出せない政党に未来は託せないのです。

※消費税廃止とか言ってる野党に任すのもどうかと思うが、それ以上に、円安を是認して輸出企業だけ優遇、輸入物資(エネルギ、食材)の高騰から物価高を招き、国民に負担を被せる政府・与党に任すことは自滅行為。


 キッチンスケールとしては、充分に使用可能な精度を得られる事が確認できました。動画で示した通り、0.1gオーダの解像度で測定可能なので、材料を正確に計量する必要のあるケーキやパンなどを作る場合でも問題なく使用可能だろうと思われます。


btn_arduino.png

btn_prev.png btn_next.png

home