Chapter 30

⚖️HX711ロードセルモジュールを使って、重さを測る - ⭐

kotaproj
kotaproj
2021.06.06に更新

💡やること

ロードセル計量センサを使って、デジタルはかりをつくります。

🏁デモ

🔧パーツ一覧

no 部品名 個数 備考
1 ラズベリーパイ 1 今回は4Bで確認
2 電子スケール ロードセル計量センサセット(重量センサ+HX711) 1 Amazon
3 ジャンパー線 適量 -

接続図

ピンの接続

Pin HX711 備考
5V VCC 赤色ケーブル
GND GND 黒色ケーブル
BCM5 DT 黄色ケーブル
BCM6 SCK 緑色ケーブル

💻環境

開発環境

  • ラズベリーパイ
    • Linux rpi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux
  • Python
    • Python 3.7.3 (default, Jan 22 2021, 20:04:44)

ラズベリーパイの設定

特になし

モジュールのインストール

apt

特になし

pip

Pythonに関するモジュールをインストールします。

$ python3 -m venv env
$ source env/bin/activate
(env) $ pip install RPi.GPIO
(env) $ git clone https://github.com/tatobari/hx711py

📝手順

  • キャリブレーションの実施
  • 動作の確認

キャリブレーションの実施

センサーのばらつきや筐体の差などがあるため、キャリブレーション(校正)を行う必要があります。
tatobariさんが公開されているモジュールのサンプルに従って、キャリブレーションを実施します。

以下の手順で行います。

  • 何も載せていない状態で、プログラムを実行
  • 分銅(重さが分かっているもの)を置いて、データを取得する
  • データからキャリブレーション値(referenceUnit)を算出

何も載せていない状態で、プログラムを実行

以下がキャリブレーション用のコードとなります。

samp_calibration.py
import time
import sys
import RPi.GPIO as GPIO
from hx711py.hx711 import HX711

PIN_DAT = 5
PIN_CLK = 6

referenceUnit = 1 # <=これを決めたい

def cleanAndExit():
    print("Cleaning...")
    GPIO.cleanup()
    print("Bye!")
    sys.exit()

def main():
    hx = HX711(PIN_DAT, PIN_CLK)

    # データの並び順を指定
    hx.set_reading_format("MSB", "MSB")

    # キャリブレーション値を設定
    hx.set_reference_unit(referenceUnit)

    hx.reset()

    hx.tare()

    print("Tare done! Add weight now...")

    while True:
        try:
            # Prints the weight.
            val = hx.get_weight(5)
            print(val)

            hx.power_down()
            hx.power_up()
            time.sleep(0.1)

        except (KeyboardInterrupt, SystemExit):
            panel.display_clear()
            cleanAndExit()


if __name__ == "__main__":
    main()

プログラムを実行します。

(env) $ python samp_calibration.py 
Tare done! Add weight now...
18.333333333328483
-3.6666666666715173
16.333333333328483
...

何も載っていない場合は、小さな値が行ったり来たりするようです。

分銅(重さが分かっているもの)を置いて、データを取得

今回、手持ちの分銅(200g)を使用しました。

分銅を載せると、プログラムの結果が以下のように変わります。

(env) $ python samp_calibration.py 
Tare done! Add weight now...
18.333333333328483
-3.6666666666715173
16.333333333328483
-7.444444444437977
61824.55555555556   # <=分銅を載せた
92595.55555555556
94617.55555555556   # <= データが安定している
94591.55555555556   # <= データが安定している
94584.55555555556   # <= データが安定している
94592.55555555556   # <= データが安定している
94591.55555555556   # <= データが安定している
94613.55555555556   # <= データが安定している
94639.55555555556   # <= データが安定している
94630.55555555556   # <= データが安定している94621.55555555556   # <= データが安定している
94621.55555555556   # <= データが安定している

データからキャリブレーション値(referenceUnit)を算出

"データが安定している"から平均値を算出し、リファレンスの重さ(g)で割ります。

[キャリブレーション値] = [データの平均値] / [リファレンスの重さ(g)]

今回の例だと以下となります。

cal_ref.py
# 分銅の重さ
REF_OMOSA  = 200

# データの取得
SAMP_DATAS = [
    94617.55555555556,  94591.55555555556,  94584.55555555556,  94592.55555555556,
    94591.55555555556,  94613.55555555556,  94639.55555555556,  94630.55555555556,
    94621.55555555556,  94621.55555555556,  94615.55555555556,  94643.55555555556,
    94611.55555555556,  94614.55555555556,  94628.55555555556,  94596.55555555556,
    94626.55555555556,  94600.55555555556,  94589.55555555556,  94591.55555555556,
    94621.55555555556,  94618.55555555556,  94596.55555555556,  94622.55555555556,
    94621.55555555556,  94548.55555555556,  94601.55555555556,  94595.55555555556,
    94627.55555555556,
]

print("referenceUnit is ", sum(SAMP_DATAS) / len(SAMP_DATAS) //REF_OMOSA)

実行すると、

(env) $ python cal_ref.py 
referenceUnit is  473.0

473であることが分かりました。

これでキャリブレーションが完了です。

動作の確認

hakari.pyにて動作を確認します。

コード - 計測と表示

samp_calibration.pyのファイルの以下を修正します。

referenceUnit = 1

 ↓

referenceUnit = 473 #<=算出した値 

実行手順

(env) $ python samp_calibration.py  # <=referenceUnitを変更したもの
-0.32910500352361843
-0.32064834390416813
-0.4326990838618848
-0.37773079633545775
-0.32699083861875583
-0.33967582804793134
49.74277660324171                 # <=50gの分銅をのせた
49.68780831571528
49.70472163495418
49.64552501761803
49.723749119097945

約50gが測定されていることが確認できます。

🔎ポイント

ロードセルモジュールの動作

ロードセルとは、力(質量、トルク)を検出するセンサーです。
今回は、ビーム型の5kgのモノを使っています。

を使用することもできます。

精度メモ

今回のリファレンスで確認したところ以下のような結果でした。

分銅の重さ 取得データ
10g 10.01~10.03
20g 19.97~20.05
50g 49.94~50.04
100g 99.92~100.07
200g 199.99~200.06
500g 499.98~500.12

かなりの精度で取れています。
筐体がしっかりしていれば、様々なアプリケーションに応用できそうです。

表示機と組み合わせる

表示機と組み合わせた例を下記に記載してあります。

https://zenn.dev/kotaproj/articles/f0e0337c68a0057ec21c