スポンサーリンク

ベッドに敷かない「はかり式」の離床センサーを作っています(その2:M5StickCで重さを測るプログラム)

スポンサーリンク

前回は、重さを測るセンサーであるロードセルの準備と、それを固定するためのケースを3Dプリンターで印刷して、「はかり」のハードウェアが完成しました。

今回は、ロードセルの信号をマイコンに接続して、液晶モニターに表示したいと思います。

スポンサーリンク

M5StickCに接続する

M5StickC

今回の目的は、離床してしばらくしたらSNSなどでお知らせすることなので、マイコンに無線LANの機能が必要です。あと、動作の確認のため液晶モニターも付いていると便利です。

そんなWiFi機能と、ちょこっとモニターが付いている、便利なマイコンモジュールM5StickCがあります。

2000円程度で買えるので、自分で部品を買ってきて作るよりも断然お得です。

プログラムはArduinoで作ります。内蔵しているマイコンはESP32なので、ライブラリなども豊富にあり、あれこれ組み合わせることで比較的簡単にプログラムが作れます。

M5StickCのIO

ロードセルの値をA/D変換してくれるHX711モジュールとマイコンとは、2本のIOピンで通信します。M5StickCには2カ所、IOが出ています。

 

M5StickCの上部。こちらにピンヘッダが刺さるソケットがあり、そこに電源と3本のIOピンが出ています。

反対側には、電源供給用や書き込みを行うためにUSB-Cコネクタと、その下にGROVEコネクタがあります。GROVEコネクタには、電源とIO2本が来ています。GROVEコネクタは、一般的にはI2C通信をして、たくさんのセンサやサーボモーターなどの機器をマイコンとつなぐために使います。

今回はこちらのGROVEコネクタをはかりと接続し、規格を無視して普通のIOとして使いたいと思います。

M5StickCとXH711モジュールを接続

HX711モジュールをGROVEコネクタとはこのように接続しました。

  • GND -- 黒 --  G
  • DT   -- 白 --  G32
  • SCK -- 黄 --  G33
  • VCC -- 赤 --  VOUT

GROVEコネクタのついたケーブルが売っているので、これを使います。

このケーブルの、片方のコネクタを切って、HX711モジュールにつなぎます。

コネクタなので、何か引っかかって抜けたりしません。

スポンサーリンク

キャリブレーション

HX711のライブラリ

HX711ジュールを制御してくれる便利なライブラリがあります。このライブラリを使うことで、HX711から簡単にデータを取得することができます。

ロードセルの値から重さに変換するには

ライブラリによってロードセルの値を取得できるようになりますが、その値はただのA/D値であって、重さの値ではありません。そこで、A/D値を重さに変換する必要があります。

オフセットを除去する

ロードセルに何も物を載せなくても、A/Dした値にはロードセル固有の値が出力されています。例えば、何も載せていない状態でも、5000という値(オフセット値)がA/D値に常に加算されているといった感じです。これは、ロードセルそれぞれ異なっていて、さらには、取り付け具合やセンサーの傾き、環境の温度などでも変わってきます。

そこで、固有のオフセット値をあらかじめ測定し記録しておいて、重さを測定するときにはその値を差し引く必要があります。

補正係数を決める

オフセットを除去すれば、その値が重さになるかというと、そうではありません。オフセットを除去した値は、重さと比例関係にはありますが、まだ1:1で対応していません。

例えば、重りが載っていない時は0だけど、100gの時は5000、200gの時は10000という具合です。この場合は、5000と測定された時は100g、10000と測定された時は200gと変換してあげます。

どう変換すればいいかというと、上記の例では、「測定値/50」とすることで、重さに変換できます。測定値が5000の時は、5000/50=100[g]、測定値が10000の時は、10000/50=200[g]という具合です。

この「50」が補正係数です。

実際には、例えば1kgのペットボトルを載せて測定し、オフセットを除去した値が補正係数になります。

係数を求めるプログラム

先ほどのライブラリを使って、オフセットと、オフセットを除去した測定値を、M5StackCの液晶モニタに表示するプログラムを作りました。

日本語表示のためにtanakamasayuki氏のefontを利用しています。

M5StackCに書き込むと、プログラムが開始されます。

何も載せないで数秒待ちます。

「重りを載せてください」と表示されたら、キッチンスケールで1kgになるよう水を入れたペットボトルを載せます。

オフセット値が表示され、重りの重さを測定します。30秒ほど測定します。

1kgの補正係数が得られました。

この「はかり」の場合、オフセット値は「-554173」、補正係数は「-23619」となりました。

スポンサーリンク

重量を表示するプログラム

最小構成のプログラム

bogde氏のライブラリに、先ほど得られた、オフセット値と、補正係数をセットするとで、重さの値を直接取得できるようになります。

もっともシンプルなプログラムがこちら。

#include <M5StickC.h>
#include "HX711.h"

const int DT_PIN = 32;
const int SCK_PIN = 33;

HX711 scale;

void setup() {
  Serial.begin(115200);
    
  scale.begin(DT_PIN, SCK_PIN); //ライブラリの初期化
  scale.set_offset( -554173 );   //オフセット値をセット
  scale.set_scale( -23619 ); //補正係数をセット
}

void loop() {
  float weight = scale.get_units(10); //10回平均の重さを取得
  Serial.println(weight);  //シリアルへ出力
}

set_offset()でオフセット値をセットし、set_scale()で補正係数をセットします。これで設定は完了。

get_units(n)を呼ぶと、n回平均した値が返ってきます。1回の測定は0.1秒なので、n=10だと測定に1秒かかります。またnを大きくするほど、誤差が小さくなります。ただし、nの値はByteの型となっているため、最大は255となります。

また、1日中測定してみると、オフセットが変動してしまうようで、±200gくらいはオフセットが乗ります。

実行すると、シリアルに測定結果を出力します。

スポンサーリンク

M5StickCに表示するプログラム

基本的なことはできるようになったので、あとはM5Stickの液晶画面に重量を表示したり、後からオフセット値のキャリブレーションができるようにプログラムを拡張します。

できたプログラムがこちらです。

M5StickCにプログラムを書き込むと、今の重量を表示します。

[M5]のボタンを4秒以上長押しすると、オフセット値のキャリブレーションをしてくれます。何も物を置かない状態で、0にならなくなった時に使います。オフセットキャリブレーションの時は、はかりに何も置かないでください。

オフセット値は、M5StickCのフラッシュメモリに保存されるので、電源を入れ直しても、以前キャリブレーションした状態に復帰できます。

2019.10.7 追加 Ambientでおもさを記録できるようになりました。

追加終わり

コメント

  1. 有難うございます
    検証してみます。

    M5StickCやArduinoに関するそのような知識はどのようにして勉強されたのでしょうか?

    • M5StickCについては
      https://lang-ship.com/blog/
      このサイトがとても詳しいです。m5stickCで検索するといいが記事がたくさん出てきますよ。
      同サイトの非公式リファレンスもとても便利です。
      https://lang-ship.com/reference/unofficial/M5StickC/

      • ありがとうございます
        参考にさせていただきます
        ロードセルについてはどのようにして勉強しましたか?

        • ロードセルは今回の実験で初めて扱いました。

        • そうなんですね
          ありがとうございます

  2. 分かりやすい説明有難うございます。
    最後のkgを表示させるプログラムを書き込んでも0.00kgのまま動かないのですが解決策などがあれば
    教えて欲しいです。
    よろしくお願いします。

    • ダーマンさん 記事を読んでいただいてありがとうございます。
      最小構成のプログラムは動作しましたでしょうか。最小構成のプログラムが動作すれば、最後のプログラムも動作するはずなのですが...
      オフセットや補正係数を求めるプログラムで、得られたオフセットと補正係数を12,13行目にセットしてありますでしょうか。

      • 返信有難うございます
        オフセットと補正係数は直接書き込めばよろしいのでしょうか?
        完全な初心者でして基礎的なことも分からず質問が下手で申し訳ないです

        • わかりにくくてすみません。
          係数を求めるプログラムの項を実際に試していただき、オフセット値と、補正係数の値を求めます。
          これらの値は、センサーや設置方法によって異なります。

          最小構成のプログラムでしたら13,14行目の値を、先程のオフセット値と、補正係数の値に書き換えます。

          M5stick_scale.inoでしたら、の12,13行目、
          DefaultScaleOffsetと、DefaultScaleFacyorの数字を、得られた値に書き換えて下さい。

          • 測定値が0になることはあり得ますか?

          • HX711との通信が正しくできていないのかもしれません。
            電源とDTとSCLKなど、それぞれ正しいピンに接続されていますか?
            または、ロードセルがHX711モジュールと正しく接続されていないのではないでしょうか。

          • 回路を再度繋ぎ直したところオフセットと測定値が表示されました。
            1キロの重りを乗せて得られたオフセット値と測定値をM5stick_scale.ino内のプログラムに書き込むだけで重量を載せることはできるのでしょうか?
            最小構成のプログラムも必要なのでしょうか

          • 動作してよかったですね。
            M5stick_scale.inoにオフセット値と補正係数を設定して正常に動作するのであれば、最小構成のプログラムは不要です。
            HX711を使ったプログラムの仕組みを理解したいのであれば、最小構成のプログラムを参考にして頂ければと思います。

          • ボードESP32 Pico Kitに対するコンパイル時にエラーが発生しました
            というふうにエラー?が出てしまいます

          • ボードの設定をM5Stick-Cにしてください
            [ツール]→[ボード:****]→[ESP32 Arduino]→[M5Stick-C]
            と選択します。
            これでM5Stick-C用にコンパイルできます。

        • やってみたのですが、依然「ボードM5Stick-Cに対するコンパイル時にエラーが発生しました」と出てきてしまいます。

          • 私の環境では問題なくコンパイルできました。プログラムではなくArduino IDEの問題のようなので、Aruinoを再セットアップされてはどうでしょうか。
            または、他にもエラーメッセージは出ていないのでしょうか?そのエラーに問題の解決のヒントがあるかもしれません。

          • もう一度最初から設定し直したところ、計測できました。
            しかし、1㎏の重りを乗せて計測すると、1.37kgや0.6kgと誤差が大きいです。
            そんなものなのでしょうか?

          • 測定できるようになってよかったですね。

            正しく計れないのは、4つのロードセルに、均等に重さが加わっていないからかもしれませんね。
            ロードセルの下に硬い金属(5mmくらいのアルミ板や3mmくらいの鉄板など)を敷いて全てのロードセル同士を水平にし、
            ロードセルの上に載せる板も先程同様に硬い金属板にして、その上に測定対象を載せてみてはいかがでしょうか。