趣味で土壌水分のデジタル負圧測定に取組中ですが、そちらは試作までに期間がかかりそうです。息抜きにストレーンゲージのデジタル測定をしてみました。最近の測定精度やコスパの向上はどんな感じかと・・。
やってみたら、ずいぶん簡単・正確・低コストになったものです!精密な測定が今や簡単、0.1グラム単位の秤などがたやすくできます。以下、これを紹介したいと思います。0.01グラム単位でもできそうです。
昔からあるストレーンゲージですがゲージ自体の改善はもちろん、測定がデジタル化でおおいに進歩。ただ、僅かな伸び縮みを検出する抵抗なので直接扱うとそれなりに手間がかかります。エポキシ等での接着も、細いリードの扱いなども。また場合によっては、熱膨張率によるごく僅かな「見かけの歪」を防ぐため貼付対象に合うゲージ選択(1例:アルミ系なら約24ppm/℃、鉄系なら12ppm/℃)など。伸びる側と縮む側各2か所ずつ計4枚でホイートストーンブリッジにして測ります。
手持ちの1例は次で、7.5 x 4mmほどの大きさ(写真下に1mmの目盛り)で抵抗値は1000Ωでアルミ系材料用。基本型は同じものを4枚使ってフルブリッジ回路にします。基本型用以外に目的に応じパターンが複数あるものや45度のもの、より小さなゲージなどもあります。
現代では検出場所の近くでデジタル化し、結果をデータで出力することでノイズの影響などが少なくなっています。HX711はそのための便利なICです。ADCは実に24ビット精度で、それに入力する高精度のアンプを内蔵。ブレークアウトモジュールが次の写真。
精密なAD変換やその温度補正など、頼れるこのらくちんなモジュールは、海外ネットでは僅か50円台で売られています!これを使わない手はありませんね。
ネットで探すと貼る相手の材料(ロードセル)も数十円からあります。さらに「ストレーンゲージ貼付済のロードセル + HX711モジュール」で、な、な、なんと百数十円で売られています。それは助かるなあ^^ これならすぐできて相当楽でしょう。
販売済数や評価コメントなどを一応よくみて、信頼できそうな出品元からポチりました。次です。
1kg用を求めましたが、今回のテスト結果からみると10kg用などの丈夫なものであっても、測る単位が0.1gなら十分精密に測れそうです。
入手したゲージ貼付済ロードセルは次です。
中心辺りに双眼鏡型の空洞があり、「ダブルベンディングビーム型ロードセル」とか、「バイノキュラーデュアルビーム型ロードセル」と呼ばれるようです。
ところで、この空洞によって、単なる直方体の単一ビームとは違う伸び縮みをします。力によるひずみを大げさに描けば次の図のようになると思います。手書きですみませんが。
下の形だとPに荷重がかかったときに沈む方向はまっすぐ下です。というより、P点付近の天端は傾かず平行移動し、片持ち梁のような梃の原理は働きません。また、荷重の位置が中心線から左右にずれても、測定値が変化しないしくみです。それによって秤の皿を少し浮かしてとりつければかなり大きい面積が使えるというわけです。
用途に応じて、棒状でなくS型や丸型のロードセルも色々売られています。
さて、ありあわせの材料だけでテスト用のデジタル秤をチョコっと作ってみましたが、なんと楽なことか^^。秤量表示用のTM1637ディスプレイもセットしました。
まずは簡単なテストからやってみます。
①ゲージ側との接続
ロードセルのストレーンゲージから出ている赤,黒,緑,白の4つのワイヤーをHX711のE+,E-,A+,A-に接続。注意として、ストレーンゲージの配線は華奢(きゃしゃ)ですから、このときワイヤーの扱いに気を付けないといけませんね。私はロードセルから出ているワイヤーの根元を念のため事前にホットメルトで補強し、上の写真のようにワイヤークリップで台に固定してあまり動かないようにしました。
②マイコン側との接続
Arduino Unoからの5VとGndをHX711の電源に供給します。信号線はどのデジタルピンでを選んでもよいですが、近くのピンを使うことにして、UnoのA1(=D15として使う)からHX711SCKのSCKへ、そしてDT(またはdOut)からUnoのA0(=D14として使う)へとつなぎました。
そしてArduino Unoへ次の簡単なスケッチを書き込み、シリアルモニターでテストしました。
/********************************************************************************
* Load Cell and HX711 testing for Arduino Uno V.00 *
* modified sample on Oct. 2, 2021 by Akira Tominaga *
* Remarks: There are several libraries for HX711 *
* for the library used here, refer to; *
*https://www.instructables.com/How-to-Interface-HX711-Balance-Module-With-Load-Ce/
*********************************************************************************/
#include "HX711.h"
#define OUT 14 // Data from HX711 to A0=14
#define SCK 15 // SCK to HX711 from A1=15
#define CalF 1885.F // individual LC caliblation factor
HX711 LC(OUT, SCK); // construct class LC (gain = default 128)
void setup() { // ***** Arduino setup() *****
Serial.begin(9600);
Serial.println(F("* Load Cell *"));
LC.set_scale(CalF); // set calibration factor(divider)
LC.tare(); // set zero for tare
}
void loop() { // ***** Arduino loop() *****
Serial.println(LC.get_units(10), 3);
LC.power_down(); // set HX711 sleep mode
delay(1000);
LC.power_up(); // wakeup HX711
}
// ***** end of test program *****
HX711用のArduinoライブラリーは各種ありますが、次のチュートリアルで紹介されているものが、今回のような秤を作る目的には一番楽そうでした。
Tutorial to Interface HX711 Balance Module With Load Cell : 9 Steps (with Pictures) - Instructables
これでテストし、おもり(大きな長ナットですが、校正済精密秤で19.385g)を途中で載せておろしたのが次のシリアル出力です。
* Load Cell *
-0.004
0.008
0.009
0.004
0.010
0.008
0.002
0.013
0.007
-0.006
0.007
0.004
0.008
0.004
16.990
19.385
19.383
19.387
19.385
19.388
19.377
19.392
19.393
0.005
0.008
0.005
0.008
0.010
0.013
0.021
0.011
0.005
0.014
0.007
0.003
0.008
0.003
これをグラフにすれば次の通り。横軸は秒数で、今回はほぼ1秒間隔、(delayを外せば設定計測サイクルx10回ぶんの間隔)。
上は通常表示ですが、下は重さを対数軸にしたものです(よって負の点は表示されませんが)。これなら0.1g単位の表示はとても正確にできそうです。測定値は10回のサンプリング平均としていますが、これを増やせば0.01g単位での表示も可能だと思います。
なお、スケッチ中の
#define CalF 1885.F // individual LC caliblation factor
はロードセル毎のキャリブレーション値で、測定値をこれで割り算して重さ(g)に変換する除数(フロート型)です。重さの分かっている錘をあらかじめ計ることで値を決めます。
実に簡単とはいえ、とくに問題なく動いています。事前のネットでの簡単な調査ではノイズ問題の報告が色々みられました。一例は次のリンクです:
ひずみゲージADC HX711 のナゾシグナル | ココアシステムズ
ここで確認してみました。指摘時(2017年11月)はあった問題なのでしょうが、今では解決済みかと思われます。念のため在庫分の回転が速そうなセラーを選んたわけですが、シグナルをオシロで点検しておきました。
該当のノイズはどこにも出ていません。それをアナライザー(SCKをチャネル1、DataOUTをチャネル2)で記録したのが次です。
測定値の読取り部分(24ビット)を拡大すると次。
データシートによれば、以下が守られないといけません(守らないと誤読に至ります)。
①ADCが完了してから読取りを開始
Channel 1のクロック信号はArduino側から出しますが 、HX711がAD変換を終えてReadyになる(Data信号がLowになる)のを待ってから最初のHighを出して読取に入る。
②クロック信号のHighは60μS未満でなければならない。
観察結果は9.5μSですが時々最大15μSになります。しかし十分に収まっています。割り込み処理等が入る構造で1か所でもこれが守られないと誤読に至ります(60μS以上だとHX711がリセット信号とみなしリセット再開するためです)。
というわけでこれなら大丈夫。秤の簡単なテスト機を作ったのが次。本番機はもっとカッコよく、かなり小さく作れそうですね。
Arduino UnoからATmega328pだけを抜いて使っていますが、そのやり方説明が必要でしたら、次のリンク先の記事内に書いてありますのでご参照ください。
Zoom用かんたん操作ボタンをArduino-UNOで作る(その1) - 勝手な電子工作・・
本番用のスケッチは次ですが、あれっ?というほど簡単です。
/********************************************************************************
* Digital Scale with Load Cell and HX711 for Arduino Uno V.00 *
* Initial V.00 Oct.3, 2021 (c) Akira Tominaga *
* Remarks: There are several libraries for HX711 *
* for the library used here, refer to; *
*https://www.instructables.com/How-to-Interface-HX711-Balance-Module-With-Load-Ce/
*********************************************************************************/
#include "HX711.h" // see the above remarks
#include "TM1637Display.h"
#define hxOUT 14 // Data from HX711 to A0=14
#define hxSCK 15 // SCK to HX711 from A1=15
#define tmDIO 16 // DIO of TM1637 to A2=16
#define tmCLK 17 // CLK of TM1637 to A3=17
#define CalF 1885.F // caliblation factor (divider, float)
HX711 LC(hxOUT, hxSCK); // class Load-Cell (gain: default 128)
TM1637Display TM(tmCLK, tmDIO); // class TM for TM1637
float Wf = 0; // weight(gram) in float
void setup() { // ***** Arduino setup() *****
TM.setBrightness(0x0b); // set up TM
TM.showNumberDecEx(0, 0x00, true, 4, 0); // display 0000
LC.set_scale(CalF); // set LC calibration factor
LC.tare(); // set zero with tare
}
void loop() { // ***** Arduino loop() *****
Wf = LC.get_units(10); // get average measurement of 10 times
int16_t Wx10i = round(Wf * 10); // set unit 0.1 gram
TM.showNumberDecEx(Wx10i, 0b00100000, false, 4, 0); // 4digits with a dot
LC.power_down(); // set HX711 into sleep mode
delay(250);
LC.power_up(); // wake up HX711
}
// ***** end of program *****
次の動画ではこれを使って、
①錘を置く位置に関係なく重さが正しく測れること
②計測がリニアである(足し算が成り立つ)こと
をかんたんに説明したつもり^^; まずはクリックしてご覧いただくと幸い。
動画中で、分銅2つの合計の重さを計ったところがあります。
同じものを校正済の精密秤で計ると次でしたから正しいことが分かります。
その後200g~400gを測るなどテストしましたがとても正確!
計測後のCreep現象(荷重で歪みが残る現象)も、数分の計測では全く生じませんでした。やっぱり大したものです^^
以上、ごく簡単ながら、正確でコスパのよい精密秤作成のご紹介でした。
以下蛇足。ご興味ある方はご覧ください。
===============================
「ダブルベンディングビーム型ロードセル」がなぜ双眼鏡のような形で切り抜かれているかについて、少し補足させていただきたいと思います。
中に単なる直方体を切り抜けば、歪がどうなるかが直観でも分かりやすいのですが、そうやると切り抜いた角から材料にヒビが入っていく問題(応力集中)が生じます。なので、内部に角ができないように丸みをつけているもの。
この形だと力をかけた時の内部の歪(または内部応力)の計算が難解のため、50年ぐらい前から有限要素法(Fininte element method:有限の格子の集まりとしたモデルを使う構造計算)が使われています。格子の設定1例と計算結果は次です。
伸びと縮みのツボが一目瞭然です。赤と青の表面がストレーンゲージを貼るべき位置となります。今回使ったのは上下のツボ合計4か所に貼られています。
=================================
以上、ごく簡単な工作とテストでしたが、どなたかのお役に立てば幸いです。
2021.10.13追記:
①HX711のSleep modeは必要か?
スケッチのLoopの最後のところに入れましたが、これついて補記させていただきます。
Sleep mode(Power_down, Power_up)は連続的な計測での省エネと温度変化の減少が目的ですが、単なる秤に使い電源オンも短い場合ならこれを入れなくてもよいかと思います。
長時間連続的に測る場合、ゲージ1枚につき
(I^2)*R = (V^2)/R = (2.5^2)/1000 = 6.25mW
の発熱、4枚合計で25mW。しかしロードセルの熱伝導率が高いのでこれだと温度にほぼ影響ないと思われますが、HX711モジュール側の温度変化は測ってみないとわかりませんね。次の写真は、同じ板にロードセルを2つ並べ、その違いをテストしてみたものです。
計測の間に3秒のDelayをとり、左側のロードセルはその間ADCをSleepし、右側はSleepしないもの。環境は26℃で2時間後に温度を計測しました。
左右どちらのロードセルやゲージにも温度上昇はみられません。HX711モジュールは、Sleepさせていない右側だけが最大1.0℃上昇しました。ただし、測定値には何も影響はありませんでした(温度補償されているし、ゲージ側仕様でも通常の温度変化では影響がないものです)。ケースに収め長時間使うともう少し温度は上昇するとは思いますが。
②ノイズが入るものがある?
ネットで「ノイズで安定して計れない」という投稿や質問があるのですが、そういう場合は、念のために購入したゲージ貼付ロードセルを点検されることをお勧めします。私は10個求めたうちの2個で不良をみつけました。
点検と言っても、つなぐ前に赤黒緑白のどれか2つの間の抵抗をテスターで計ってみるだけです。テスターをつないだままでロードセルのワイヤー出口部分を軽く押すとノイズが出る(抵抗が変化する)ものがあります。
おそらく品質検査まではOKだったのでしょうが、とくに保護をせずに複数本をまとめて封筒で送って来るため、梱包時か送付中に引っ張られて不良を起こしたのではないかと推測します。取り出しのときもワイヤーをひっかけたりしないように注意しないといけませんね。せっかく良くできている部品なので。
この記事は次からご参照をいただいています:
©2021 Akira Tomninaga, All rights reserved.