ベッドに敷かない「はかり式」の離床センサーを作っています(その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でおもさを記録できるようになりました。

追加終わり

コメント