HX711 自作電子はかりでロードセルの使い方を詳しく紹介

HX711電子はかりでロードセルの使い方アイキャッチ

重さを計る時に便利な「電子はかり」ですが、荷重(重さや力)を測定できるセンサ、ロードセルを使うと簡単に自作できます。
今回は電子はかりの製作を通して、ロードセルの使い方について詳しく紹介します。

ロードセルは物の変化を電気信号に変換できるセンサで、重さだけでなく圧力やトルクの測定等、幅広い分野で使用されています。

ロードセルを使いこなせれば様々な物の変化を測定できるようになります。
ロードセルの理解には、電子はかりの自作が最適です。
ロードセルを理解するために、まずは安価なキットを使って電子はかりを自作して、プログラムでの扱い方も確認しながら、仕組みを理解してロードセルを使いこなせるようになりましょう。
スポンサーリンク

1.キットで簡単電子はかり

まずは安価で入手できる「電子はかりキット」を使って動作確認をしてみます。

動作確認と言っても「はかり」ですから、物を置くとその重さが表示されるだけです。
しかし、今回使用するのは「キット」なので重さを測定する「しくみ」はあるものの、正しい数値を表示させるには「校正」を行う必要があります。

ここでは「キット」の使い方や校正方法、重さを測定するために必要な構成部品やその働きを確認していきます。

・電子はかりキットの紹介

今回使用したのは以下の「キット」になります。
非常に安価ですがこれだけで電子はかりとしての構成部品が全て揃って、組み立て後すぐに動作確認できます。


キットの構成部品は以下写真のようになります。

電子はかりキットについて
はかる物を置く円盤状の台と、重さを測定するためのセンサ(ロードセル)、センサの値を読み取るA/D変換基板、重さを表示するための表示基板や電源供給のためのUSBケーブルも付属していています。

「キット」が完成したものは以下になります。
円盤の上に載せた物の重さを表示させることができます。

電子はかりキットについて

このままでは、まだ正確な重量を測定できないので、まずは重さがわかっているものを置いて、置いたものの重さが表示されるように、以下の写真の基板上の「ボタン」を押して調整するという「校正」が必要です。

電子はかりキットの使い方
「重さがわかっているもの」を基準にして表示を調整する必要があるので、ここでは500mlのペットボトルに水を入れたものを500gとして使用しています。
より正確な数値を表示させたい場合は別途基準のおもりを準備してください。

基板上の「ボタン」の表示は中国語表記になっていますが、以下のような機能があります。

  • 去皮:0リセットします。重量の表示を0にするために使用します。
  • 校正加:載せた物の重さの表示が低い時に数値を大きくしたい時に押します。
  • 校正減:載せた物の重さの表示が低い時に数値を小さくしたい時に押します。

実際に測定している様子は下写真のようになります。

HX711電子はかりの校正

電源を接続したら、まずは何も載せない状態で「去皮」ボタンを押して0リセットします。

HX711電子はかりの校正

次に水の入った500mlのペットボトルを置いて、表示が500になるように「校正加/校正減」ボタンを押して調整します。
調整できたら、他のものを置いて色々な物の重さを測定してみましょう。

・構成部品について

電子はかりの構成部品として、主なものは「ロードセル」と「A/Dコンバータ」です。
今回紹介したキットにも使用されているので以下で紹介します。

ロードセル

重さを測定するためのセンサは「ロードセル」と呼ばれ、キットの中の以下写真のものです。
今回使用したものはアルミの棒状のもので、この棒にかかる「力の変化」を「電圧の変化」として出力してくれます。

電子はかりキットについて

上写真のアルミの棒が「ロードセル」です。
十分な強度を持ちながらも変形しやすいように中央に穴が開けられています。

電子はかりキットについて

今回のキットに使用しているものは5kg用で、この棒の「5kg」と書かれた部分に載せた物の重さによる「形状変形(ひずみ)」を「電気信号」として測定するために使用されます。

「ロードセル」の仕組み等については、この後の「2.ロードセルとは」で詳しく紹介しています。

A/Dコンバータ

ロードセルから出力された「電圧の変化」を処理するために使用するのが「A/Dコンバータ(アナログ-デジタル変換器)」で、キットの中の以下写真の基板になります。

電子はかりキットについて

この基板に搭載されているA/DコンバータICは「HX711」で「ロードセル」からの電気信号(アナログ値)を重量としての数値(デジタル値)に変換しています。

「A/DコンバータHX711」については、この後の「3.A/DコンバータHX711とは」で詳しく紹介しています。
スポンサーリンク

2.ロードセルとは

ロードセルとは、重さや力による「形状変形(ひずみ)」を「電気信号」に変換するセンサーで、以下から紹介する2つの要素「ひずみゲージ」と「ホイートストンブリッジ」で構成されています。

・ひずみゲージ

「ひずみゲージ」とは、金属や樹脂などの材料に貼り付けて、力が加わることで生じる形状の変化(ひずみ)を抵抗の変化として検出し、これを電圧信号に変換して利用するための素子です。

「ひずみゲージ」といってもその正体は、薄いフィルム状の「抵抗」です。

これを対象物に貼り付けることで、対象物の形状変化に合わせてフィルム状の抵抗が、延ばされたり縮められたりすることで抵抗値が変化します。

下図のように、「ひずみゲージ」を棒状の物に貼り付けた場合を例に見てみましょう。

ひずみゲージの使い方

図のように「ひずみゲージ」を裏表に貼り付けた棒に力を加えて曲げると、上側は伸びて下側は縮みます。

「ひずみゲージ」はフィルム状の「抵抗」なので、内部の導体が伸びて細くなると抵抗値は増え、縮めて太くなると抵抗値は減ります。

この「抵抗の変化」を測定することで、物の「形状の変化量」を知ることができ、その物の形状や材質から「物に加えられた力」を算出することができます。

測定対象の形状の変化は「ひずみ」と呼ばれ、「ひずみ」を測定するセンサーのため「ひずみゲージ」と呼ばれます。
「ひずみゲージ」の抵抗値の変化から物の形状変化「ひずみ」を測定できますが、「ひずみ」による形状変化は目で見て確認できないほど微小なものです。
このため、抵抗値の変化も微小で一般的なテスターでは誤差レベルで測定は困難です。
この微小な抵抗変化を測定するためには「ホイートストンブリッジ」を使用し、抵抗の変化を電圧に変換して増幅してから測定します。

・ホイートストンブリッジ


「ホイートストンブリッジ」は、下図のように4つの抵抗器を正方形に接続したものです。

ホイートストンブリッジとは

図のように抵抗器を正方形に接続して、対角(E+、E-間)に電圧を加えた時、電圧を加えていない対角(A+、A-間)には抵抗値に応じた電位差(電圧の変化)が発生します。

この時、対辺同士の抵抗値を掛け合わせた値が等しい(R1・R4=R2・R3)場合、A+、A-間には電流は流れない、というのが「ホイートストンブリッジ」の基本的な考え方です。

4つの抵抗値が同じ場合にはこの条件が成立することになります。
電流が流れないということは、電位差が発生しないということになります。

逆にいうと、4つの抵抗の1つでも抵抗値が異なると電位差が発生するということになります。

「ホイートストンブリッジ」を使用することで「抵抗の変化」を「電圧の変化」として測定することができ、「ホイートストンブリッジ」の抵抗を「ひずみゲージ」に置き換えることで、「ひずみゲージ」の「抵抗の変化」を「電圧の変化」として測定することができます。

・ひずみゲージの貼り付け方、結線方法

「ひずみゲージ」は測定対象の形状や、力がかかった時の形状の変化に合わせて貼り付け方を検討し、正しく結線する必要があります。(貼り付けには専用の接着剤を使用します。)

結線方法の基本は「ホイートストンブリッジ」ですが、4つある抵抗の一部を「ひずみゲージ」にするのか、全てを「ひずみゲージ」にするのかによって出力電圧の大きさが異なります。

「ひずみゲージ」の貼り付け方にはたくさんの種類がありますが、主なものを以下から紹介します。

1ゲージ法

「1ゲージ法」とは「ホイートストンブリッジ」の1箇所だけが「ひずみゲージ」で、その他は同じ抵抗値の抵抗で構成されたものです。

最もシンプルな構成で、主に測定対象の「引張/圧縮力」の測定に使用されます。

測定対象に貼り付けた「ひずみゲージ」は引っ張られると伸びて細くなり抵抗値が増えます。
圧縮されると縮んで太くなり抵抗値は減ります。

ひずみゲージの動作

この場合の出力電圧(e0とします)の値は以下の式で求めることができます。

e0 = E/4 × Ks × ε

 e0:出力電圧(Max ±10m〜20mV目安にひずみを設定)
 E:電源電圧(一般的には5V)
 Ks:ゲージ率(約2、ひずみゲージによる)
 ε:ひずみ(物の形状や材質によって算出)

ひずみ(ε)は以下の式で求められます。
 ε = ΔL / L (μ)
 ΔL:変形量(μm)、 L:元の長さ(m)
ひずみの変化による出力電圧(e0)が希望の範囲内になるように、ひずみゲージを貼り付けるロードセルの形状を検討します。
「1ゲージ法」の出力は「1倍」と表現され、出力を「2倍、4倍」にする方法として「2ゲージ法、4ゲージ法」があります。

2ゲージ法

「2ゲージ法」とは、「ホイートストンブリッジ」の2箇所が「ひずみゲージ」で、その他は同じ抵抗値の抵抗で構成されたものです。(全てを「ひずみゲージ」で構成したものは「4ゲージ法」です。)

複数の「ひずみゲージ」を使用することで、温度による抵抗値の変化の補償用に使用したり、変化を打ち消し合うように貼り付けてひずみを消去する等、使い方は様々です。
ひずみゲージの結線方法
ひずみゲージの結線方法

上で紹介したキットで使用した「ロードセル」のように、棒状で曲げる力の測定をする場合、「ひずみゲージ」を下図のように裏表に貼り付けると抵抗値が増える箇所と、減る箇所があります。

ひずみゲージの動作

この場合の出力電圧(e0とします)の値は以下の式で求めることができます。

e0 = E/2 × Ks × ε

 e0:出力電圧(Max ±10m〜20mV目安にひずみを設定)
 E:電源電圧(一般的には5V)
 Ks:ゲージ率(約2、ひずみゲージによる)
 ε:ひずみ(物の形状や材質によって算出)

「ホイートストンブリッジ」のバランス状態「R1・R4=R2・R3」の関係を考慮して、抵抗の変化が1箇所は増え、1箇所は減る、または両方増えるというような関係にあると、電位差の変化を大きくすることができます。
「2ゲージ法」は「1ゲージ法」の2倍の出力を得ることができ、「4ゲージ法」は「1ゲージ法」の4倍の出力を得ることができます。

測定したい「ひずみ」の方向によって、並べたり、重ねたり、貼り方も変えます。
2つのひずみゲージを直角に重ねて貼ることで「ねじり」の測定もできるため、回転する軸のひずみから回転トルクの測定も可能です。

「ひずみ」は対象物の材質や形状から算出することができますが、基準となる荷重(力や重さ)がかけられれば、その荷重をかけた状態で「校正」を行うことで、より正確な測定を行うことができます。
現物合わせで「校正」することは可能ですが、力を加えた時に、対象物が破壊(永久変形せず元の形状に戻る)せず、希望の出力電圧範囲内で測定が可能かどうかは事前に計算や3DCADの解析機能で目処をつけておく必要があります。
スポンサーリンク

3.A/DコンバータHX711とは

「HX711」とは、主に「ロードセル」と組み合わせて使用される、高精度な「24ビットA/Dコンバータ(アナログーデジタル変換)」ICで、端子配列や機能は下画像のようになります。

ADコンバータHX711端子配列、機能
HX711を使用して「ロードセル」から得られる微小なアナログ電圧の変化を、増幅してデジタル値に変換することで、高精度な測定が可能になります。

主な仕様は以下表のようになります。

項目仕様
電源電圧DC2.6〜5.5V
入力チャンネル数チャンネルA、Bの2個(一般的にはAを使用)
※通信クロック端子のパルス数で切替
ゲイン(増幅率)・チャンネルA:64倍、128倍で選択(初期値128)
・チャンネルB:32倍(固定)
アナログ電圧入力範囲
(電源電圧5V)
・ゲイン128倍の場合:±20mV
・ゲイン64倍の場合: ±40mV
・ゲイン32倍の場合: ±80mV
分解能24ビット(2の24乗:0〜16,777,215)
サンプリングレート10Hz/80Hz(外部端子で切替)
通信方式独自のシリアル通信
クロックとデータ出力の2線式
消費電流1.5mA(パワーダウンモード時0.5μA)
「HX711」は周辺回路が実装された基板として、同じようなものが販売されていますが、多くの場合「チャンネルA」を使用し、アナログ電圧入力範囲は「±20mV」で、増幅率「128倍」サンプリングレート「10Hz(1秒間に10回)」で使用され、ほとんどの場合これらの基板には互換性があります。

今回使用したキットに使用した基板にも「HX711」が搭載されており、端子配列は下画像のようになります。

A/DコンバータHX711実装基板

「E+、Eー、A+、Aー」端子はロードセルに接続します。
「VCCーGND」間に電源電圧(DC2.6〜5.5V)を供給し、シリアル通信端子「DT(データ出力)、SCK(クロック)」へ専用の表示器やマイコンボードの端子を接続します。

同等品が多く存在しますが、ほとんどの場合同様の端子構成で使用でき、互換性があります。

4.マイコンボードで自作電子はかり

ここまで「電子はかり」の構成部品の「ロードセル」や「A/DコンバータHX711」の紹介をしてきましたが、ここからはこれらを使用して「電子はかり」を製作する方法について詳しく紹介します。

最初に紹介したキットに付属の表示器を、液晶表示器付きのマイコンボード「M5StickC Plus2」に置き換えて、プログラムで制御して重量データを表示する方法について紹介します。
コピペ用のサンプルプログラムも準備してますので、書き込んで動作確認してみましょう。

・動作紹介

キットに付属の表示器の代わりに「M5StickC Plus2」を使用して動作確認している様子は下画像のようになります。

HX711を使用した自作の電子はかり

電子はかりキットの表示器を「M5StickC Plus2」に置き換えて「GROVEコネクタ配線(メス)」で「HX711」と接続します。

HX711を使用した自作の電子はかり

はかりの上に載せたものの重量(g)が液晶画面に表示されて確認できます。

重量(g)の表示は「HX711」で測定した「ロードセル」からの電圧A/D変換値を「スケール」という補正値で割ったもので、「スケール値」は事前に測定してプログラム内で指定しておきます。

「スケール」は下画像の「M5StickC Plus2」の画面下の「Scaling:」で確認できます。

HX711を使用した自作の電子はかり


「Scaling」は以下の手順で「M5StickC Plus2」の各ボタンを使用して調整して設定します。

  1. はかりの上に何も置かずに電源を入れます。
  2. 基準となるおもり(500mlのペットボトル500g)をはかりの上に置きます。
  3. 表示が「500g」になるように「Scaling」値を調整します。
    「Scaling」値は「ボタンA」を押すと増え、「ボタンB」を押すと減ります。
  4. 「500g」になった時の「Scaling」値を確認して、プログラム内で指定して書き込みます。
  5. 以上で設定は完了です。「Scaling」値は必要に応じて微調整してプログラム内の変数に再設定します。
「M5StickC Plus2」の電源ON時には表示が0リセット(オフセット設定)されるため、はかりの上には何も置かずに電源ONしてください。
手動で0リセットするには「ボタンA,B」を同時に押します。
電源ボタンを押すとシリアル出力で「HX711」のA/D変化値やオフセット値をシリアルモニタで確認することができます。

・マイコンボードM5StickC Plus2

「M5StickC Plus2」は「M5Stackテクノロジー社」のマイコンボードで、1.14インチTFT液晶画面や入出力端子、ボタン、LED、赤外線送信、ブザー、3軸ジャイロ+3軸加速度センサ、マイク、RTC(リアルタイムクロック)、バッテリーが内蔵されています。

M5StickC Plus2端子配列

他にもシリアル通信はもちろんWiFiやBluetooth通信にも対応しており、これらの機能をプログラムで自由に使用することができます。

「M5StickC Plus2」については以下のリンクで詳しく紹介しています。

M5StickC Plus2の使い方、初期設定、旧モデルとの違い等サンプルプログラムで詳しく紹介
M5StickCの最新版M5StickC Plus2について、旧モデルとの違いを確認しながら、初期設定や端子配列、機能、使い方をサンプルプログラムで詳しく紹介します。
M5StickC Plus2
共立電子産業株式会社 KYOHRITSU ELECTRONIC INDUSTRY CO.,LTD.

・配線図

配線図は下画像のようになります。
今回紹介した電子はかりキットの表示器を「M5StickC Plus2」に置き換えたものです。

ロードセルとHX711、マイコンボードの配線図

「A/DコンバータHX711」は色々なものが販売されていますが、ほぼ同じ端子構成で互換性があります。

下画像は「M5Stack」社製の「Weight Unit」との配線図です。
同じように「HX711」が使用されているため、そのまま置き換えて使用できます。

ロードセルとHX711、マイコンボードの配線図

・開発環境(ArduinoIDE)

開発環境「ArduinoIDE」のインストールやライブラリの準備方法は以下のリンクで詳しく紹介しています。

Arduino IDE 2のインストール方法、初期設定、使い方
バージョンアップして使いやすくなったArduino IDE 2のインストールから使い方まで詳しく紹介、便利な機能やM5Stack、ラズパイPicoでの使用方法も紹介します。

・ライブラリ

使用するライブラリは以下表のようになります。
「ArduinoIDE」で事前にインストールしておいてください。

ライブラリ名用途バージョン検索名
M5StickCPlus2M5StickC Plus2制御用1.0.1stickcplus2
HX711 Arduino LibraryA/DコンバータHX711制御用0.7.5711 bog

5.サンプルプログラム

サンプルプログラムは以下になります。
コピペで貼り付けて書き込んでください。コピーは下の黒塗り部右上のアイコンクリックでもできます。

#include <M5StickCPlus2.h>  // M5StickC Plus2制御用
#include "HX711.h"          // A/DコンバータHX711用(HX711 Arduino Library)

#define LED 19                // 本体LED
#define HOLD 4                // ホールド(電源ボタン)端子
#define LOADCELL_DOUT_PIN 33  // HX711 データ出力端子
#define LOADCELL_SCK_PIN  32  // HX711 クロック端子   

HX711 scale; // HX711のインスタンス作成

// 変数宣言
float weight; // 重量測定値格納用(g)
float scaleValue = 414.6; // スケール値(測定した重量が正しくなるように調整)

// 初期設定 -----------------------------------------
void setup() {
  auto cfg = M5.config(); // 本体初期設定
  StickCP2.begin(cfg);
  Serial.begin(9600);     // シリアル通信初期化

  // HX711初期化(DAT端子, SCK端子, ゲイン[増幅率]:チャンネルAは64,128 チャンネルBは32固定)
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN, 128); // ゲインは省略可(初期値は128)

  // HX711初期設定
  scale.set_scale(scaleValue); // SCALE値を設定
  scale.tare(5);               // A/D平均値 を OFFSET に設定(0リセット)

  // 出力端子設定
  pinMode(LED, OUTPUT);     // 本体LED赤
  pinMode(HOLD, OUTPUT);    // ホールド(電源ボタン)端子
  digitalWrite(LED, LOW);   // 本体LED初期値OFF(LOW)
  digitalWrite(HOLD, HIGH); // ホールド(電源ボタン)端子初期化(HIGH)

  // ベース画面の初期設定
  M5.Lcd.fillScreen(BLACK); // 背景色
  M5.Lcd.setRotation(1);    // 画面向き設定(USB位置基準 0:下/ 1:右/ 2:上/ 3:左)
}

// メイン -----------------------------------------
void loop() {
  M5.update(); //本体ボタン状態更新

  // 重量データ取得(g)
  if (!M5.BtnA.isPressed() && !M5.BtnB.isPressed()) {  // ボタンA,Bが押されていなければ
    weight = scale.get_units(5); // 重量データ取得g(ADC値平均(回数) から OFFSETを引いた値を SCALEで割った値)
  } else {
    delay(100); // スケール値 増減時間調整用
  }

  // スケール値 設定
  if (M5.BtnA.wasReleased() || M5.BtnB.wasReleased()) { // ボタンAまたはBが離されたら
    scale.set_scale(scaleValue);   // SCALE値を設定
  }

  // スケール値 加算
  if (M5.BtnA.isPressed() && !M5.BtnB.isPressed()) {  // ボタンAが押されてボタンBが押されていなければ
    scaleValue = scaleValue + 0.1; // スケール値 +0.1
  }

  // スケール値 減算
  if (M5.BtnB.isPressed() && !M5.BtnA.isPressed() && scaleValue > 0.1) {  // ボタンBが押されてボタンAが押されていない、かつスケール値が0.1より大きければ
    scaleValue = scaleValue - 0.1; // スケール値 -0.1
  }

  // オフセット値の再設定(0リセット)
  if (M5.BtnA.wasPressed() && M5.BtnB.wasPressed()) { // ボタンAとBが同時に押されていたら0リセット
    digitalWrite(LED, HIGH);  // 本体LED点灯
    scale.tare(5);				    // ADC値平均値 を OFFSET に設定(0リセット)
    digitalWrite(LED, LOW);   // 本体LED消灯
  }

  // 電源ボタンONでシリアル出力(HX711 情報表示)
  if (digitalRead(35) == (LOW)) {  // 電源ボタンが押されていれば
    Serial.println("\nHX711 infomation"); // 情報表示
    Serial.printf("A/D ave : \t%d\n", scale.read_average(5));  // A/D変換値の平均(5回)
    Serial.printf("OFFSET : \t%d\n", scale.get_offset());      // OFFSET値
    Serial.printf("SCALEVALUE : \t%.1f\n", scale.get_scale()); // スケーリング値
    Serial.printf("value(A/D ave - OFFSET) : %5.1f\n", scale.get_value(5)); // A/D平均値 から OFFSET を引いた値
    Serial.printf("units(value / SCALE) = wight(g) : %5.1fg\n", scale.get_units(5)); // get_value(回数)の値を SCALE で割った値(重量換算値)
  }

  // LCD表示処理
  M5.Lcd.setFont(&fonts::Font4);     // フォント
  M5.Lcd.setTextColor(WHITE, BLACK); // 文字色, 背景
  M5.Lcd.drawCentreString("HX711 DISPLAY", 120, 5, &fonts::Font4); // タイトル表示

  M5.Lcd.drawFastHLine (0, 35, 240, WHITE);  // 指定座標から水平線
  M5.Lcd.drawFastHLine (0, 100, 240, WHITE);

  M5.Lcd.setTextColor(CYAN, BLACK); // 文字色, 背景
  M5.Lcd.setCursor(200,65);         // 座標設定(x, y)
  M5.Lcd.printf("g\n");             // 重量単位表示

  M5.Lcd.setFont(&fonts::Font7);    // フォント
  M5.Lcd.setCursor(25, 43);         // 座標設定(x, y)
  M5.Lcd.printf("%05.0f", weight);  // 重量表示

  M5.Lcd.setFont(&fonts::Font4);           // フォント
  M5.Lcd.setTextColor(GREENYELLOW, BLACK); // 文字色, 背景
  M5.Lcd.setCursor(30, 105);               // 座標設定(x, y)
  M5.Lcd.printf("Scaling:  %.1f     \n", scaleValue); // スケール値表示
}

・プログラムの詳細

初期化

まず「HX711」の初期設定として、サンプルプログラム「22行目」でシリアル通信の「DAT(データ出力)SCK(クロック)」端子の番号と、ゲイン(アナログ電圧の増幅率)を指定して「scale.begin()」を実行します。

// HX711初期化(DAT端子, SCK端子, ゲイン[増幅率]:チャンネルAは64,128 チャンネルBは32固定)
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN, 128); // ゲインは省略可(初期値は128)

初期設定

次に「HX711」の初期設定として、測定したA/D変換値を重さ(g)として換算するための「スケール値」と、おもりを載せない状態を0表示にするための「オフセット値」を設定します。

サンプルプログラムでは「13行目」で以下のように「scaleValue」として「スケール値」を設定しておきます。

float scaleValue = 414.6; // スケール値(測定した重量が正しくなるように調整)

25行目」で「スケール値」を指定して「scale.set_scale(scaleValue)」を実行することで「スケール値」が設定されA/D変換値が重量に換算されて取得できるようになります。
続けて「26行目」で「scale.tare(5)」を実行するとA/D変換値の 5回平均値が「オフセット値」として設定され、現在の状態を重量0gとして取得できるようになります。

// HX711初期設定
scale.set_scale(scaleValue); // SCALE値を設定
scale.tare(5);               // A/D平均値 を OFFSET に設定(0リセット)
初期設定時に「オフセット値」が設定されるため、はかりには何も載せない状態で電源をONしてください。

重量データの取得

重量データの取得には「45行目」で以下のように「scale.get_units(5)」を実行します。
引数の「5」は平均回数のため、必要に応じて変更してください。

weight = scale.get_units(5); // 重量データ取得g(ADC値平均(回数) から OFFSETを引いた値を SCALEで割った値)

スケール値の調整

「スケール値」は初期設定で「scaleValue」の値を設定していますが、「M5StickC Plus2」の本体ボタンを使用して微調整できます。
「スケール値」の調整方法はサンプルプログラムの「50〜63行目」で以下のように、「ボタンAで加算」「ボタンBで減算」され、いずれかのボタンを離した時に「スケール値」が再設定されるようにしています。

  // スケール値 設定
  if (M5.BtnA.wasReleased() || M5.BtnB.wasReleased()) { // ボタンAまたはBが離されたら
    scale.set_scale(scaleValue);   // SCALE値を設定
  }
  // スケール値 加算
  if (M5.BtnA.isPressed() && !M5.BtnB.isPressed()) {  // ボタンAが押されてボタンBが押されていなければ
    scaleValue = scaleValue + 0.1; // スケール値 +0.1
  }
  // スケール値 減算
  if (M5.BtnB.isPressed() && !M5.BtnA.isPressed() && scaleValue > 0.1) {  // ボタンBが押されてボタンAが押されていない、かつスケール値が0.1より大きければ
    scaleValue = scaleValue - 0.1; // スケール値 -0.1
  }
再設定した「スケール値」は記録されません、「スケール値」を変更するにはプログラム内の「13行目」で「sacaleValue」の初期値を書き換えてください。

オフセット値の再設定(0リセット)

「オフセット値」の設定は電源ON時に行われますが、「68行目」で以下のように「scale.tare(5)」を再度実行することで「オフセット値」の再設定を行うことができます。

scale.tare(5); // ADC値平均値 を OFFSET に設定(0リセット)
サンプルプログラムでは「ボタンA,B」を同時押しすることで 0リセットできるようにしています。
オフセットが実行されると「本体LED(赤)」が点灯し、オフセットが完了すると消灯します。

HX711取得データのシリアルモニタ出力

サンプルプログラムの「72〜80行目」のように、電源ボタンを押すことで「HX711」で取得した「A/D変換値」や、設定されている「スケール値」「オフセット値」をシリアルモニタで確認できます。
これについては、次の「6.ロードセル校正値の確認」の中で詳しく紹介しています。

6.ロードセル校正値の確認

ロードセルの校正とは、ロードセルにかかる力と測定して表示される値が等しくなるように「スケール値」と「オフセット値」を調整する作業です。

上で紹介した「サンプルプログラム」の動作では、「スケール値」を少しづつ調整して表示が正しくなるように調整しましたが、「スケール値」が大きい場合は設定が大変です。
校正手順を正しく行えば基準のおもりに対する「スケール」値をすぐに求めることができます。

・校正値の確認方法

校正値を確認するためには、「A/Dコンバータ HX711」の測定値や設定値の情報を確認します。
サンプルプログラムでは以下のように「電源ボタン」を押すと「シリアルモニタ」でこれらの情報が確認できるようにしています。

// 電源ボタンONでシリアル出力(HX711 情報表示)
if (digitalRead(35) == (LOW)) {  // 電源ボタンが押されていれば
  Serial.println("\nHX711 infomation"); // 情報表示
  Serial.printf("A/D ave : \t%d\n", scale.read_average(5));  // A/D変換値の平均(5回)
  Serial.printf("OFFSET : \t%d\n", scale.get_offset());      // OFFSET値
  Serial.printf("SCALEVALUE : \t%.1f\n", scale.get_scale()); // スケーリング値
  Serial.printf("value(A/D ave - OFFSET) : %5.1f\n", scale.get_value(5)); // A/D平均値 から OFFSET を引いた値
  Serial.printf("units(value / SCALE) = wight(g) : %5.1fg\n", scale.get_units(5)); // get_value(回数)の値を SCALE で割った値(重量換算値)
}

「シリアルモニタ」の出力結果は以下のようになります。

HX711 infomation
A/D ave :       11283
OFFSET :        -25331
SCALEVALUE :    414.6
value(A/D ave - OFFSET) : 36628.0
units(value / SCALE) = wight(g) :  88.4g

上記の場合「value / SCALE = units(重量g)」なので「36628.0 / 414.6 = 88.4g」 となります。

value / units(重量g)= SCALEVALUE」で「スケール値」が求められるため、基準となる錘が「100g」だった場合は以下のようになります。
 36628 / 100 = 366.28 ≒ 366.3
求められた「スケール値」は「366.3」となり、「SCALEVALUE」を「414.6」から「366.3」に書き換えて再度実行すると、「100g」と表示されるようになります。
あとは「スケール値」を手動で調整して誤差を修正します。

・校正の実行

校正作業は以下の手順で行います。

  1. はかりにおもりを載せずに電源をONします。
  2. HX711を初期化します。
  3. set_scale() を実行(カッコ内「スケール値」は設定無しでも良い)します。
  4. tare() を実行(カッコ内平均回数は設定無し)します。
  5. 基準となるおもりを載せて、get_value(5) を呼び出します。
  6. ステップ5の結果を載せたおもりの重量gで割ると「スケール値」が求められます。
  7. 求めた「スケール値」を設定して、set_scale(スケール値)を実行します。
  8. tare(5)を実行すると、「オフセット」が設定され表示が0になります。
以上の工程を実行して求めた「スケール値」を本体のメモリに保存して、電源ON時に読み出すようにするとプログラムを書き換える手間もなくなります。
実際に「SPIFFS」を使用してフラッシュメモリに保存できるものも作りましたが、今回はロードセルの使い方紹介がメインなのでシンプルに「スケール値」は手動で書き込むようにしました。

「SPIFFS」を使用したフラッシュメモリへのデータ保存、読み込み方法は、以下のリンクで詳しく紹介していますので、チャレンジしてみてください。

SPIFFSの使い方、フラッシュメモリに簡単データ保存 ESP32
SDカード不要でマイクロコントローラの内蔵フラッシュメモリにデータ保存、読込する方法を詳しく紹介します。測定データの保存やWebページのHTMLデータ保存に便利

7.まとめ

重さを計る時に便利な「電子はかり」の製作を通して、ロードセルの使い方を詳しく紹介しました。

「電子はかり」のキットは比較的安価で入手することができ、構成部品は「ロードセル」、「A/Dコンバータ(アナログ-デジタル変換器)」、「操作表示器」の3点です。

「ロードセル」は、今回はアルミの棒状のものでしたが、用途によって色々な形があります。
「ロードセル」には「荷重(重さや力)」による材料の変形「ひずみ」を測定するための「ひずみゲージ」が貼り付けられています。

「ひずみゲージ」とは「フィルム状の抵抗」で、金属や樹脂などの材料に貼り付けて、力が加わることで生じる形状の変化「ひずみ」を抵抗の変化として検出し、これを「電圧信号」に変換して利用するための素子です。

「電圧信号」に変換するためには「ホイートストンブリッジ」を使用します。
「ホイートストンブリッジ」の抵抗を「ひずみゲージ」に置き換えることで、「ひずみゲージ」の「抵抗の変化」を「電圧の変化」として測定することができ、これを「A/Dコンバータ」で「デジタル値」に変換します。

「ひずみゲージ」の抵抗変化は微小なため「電圧の変化」も微小です。
このため使用する「A/Dコンバータ」には入力電圧を増幅する機能が必要で、さらに高精度である必要があります。

「高精度A/Dコンバータ HX711」にはこの機能が備わっており、増幅率は最大で128倍、精度(分解能)は24bit(1/16,777,215)です。

「HX711」で測定し、A/D変換した「デジタル値」が実際の「荷重(重さや力)」と等しくなるように、プログラムで「スケール値」を設定して演算して表示させます。
「荷重(重さや力)」がかかっていない「表示 0」の状態は、温度や使用する「ロードセル」のバラツキもあるため、測定前に「オフセット値」を設定し「0」表示させて使用します。

「ロードセル」に使用されている「ひずみゲージ」は「フィルム状の抵抗」で延ばされると抵抗が増え、縮められると抵抗が減るという特性を利用して、材料の「ひずみ」量を測定することができ、「ひずみ」量がわかると、材料の材質や形状から「荷重(重さや力)」を計算で求めることもできます。

今回は重さを計る方法を例に紹介しましたが、「ロードセル」は重さだけでなく、圧力やトルクの測定等、幅広い分野で使用されています。

「ロードセル」を使いこなせれば様々な物の変化を測定できるようになります。
基本は今回紹介した重さの測定方法と同じため、プログラムでの扱い方や、仕組みを理解して「ロードセル」を使いこなしていきましょう。

M5StickC Plus2
共立電子産業株式会社 KYOHRITSU ELECTRONIC INDUSTRY CO.,LTD.
M5StickC Plus2の使い方、初期設定、旧モデルとの違い等サンプルプログラムで詳しく紹介
M5StickCの最新版M5StickC Plus2について、旧モデルとの違いを確認しながら、初期設定や端子配列、機能、使い方をサンプルプログラムで詳しく紹介します。
SPIFFSの使い方、フラッシュメモリに簡単データ保存 ESP32
SDカード不要でマイクロコントローラの内蔵フラッシュメモリにデータ保存、読込する方法を詳しく紹介します。測定データの保存やWebページのHTMLデータ保存に便利

コメント

タイトルとURLをコピーしました