ゆるく楽しむプログラミング

M5Stack用 計量ユニットでキッチンスケールを作ってみた

M5Stack用 計量ユニットを使って、キッチンスケールを作ってみました。



GROVEコネクタでの接続ですが、インターフェイスはI2Cですので、Arduino等でも使用できます。

構成はこんな感じで、ロードセルとADCをSTM32でアクセスしてg単位の重量に変換。
I2Cで、重量値を送信しています。

HX711の操作ではなく、STM32に対するI/Fなので、扱いが簡単です。

I2Cレジスタ

STM32とのI/Fになるレジスタマップは公式(製造元)ドキュメントに記載されています。
テキストではなく、なぜかイメージデータなので見づらいですが…
▼クリックで拡大


各レジスタの意味は大体わかりますが、Filter レジスタは意味が謎です。
名称からの推測ですが・・・多分、合ってると思います。
LPFilter(Low-Pass Filter): 設定値 0~1

低域通過フィルターであり、指定した周波数以下の信号成分のみを通過させるものです。
主に高周波ノイズを除去するために使用され、急激な変化(高周波成分)を抑制する効果があります。
過度に敏感なロードセル信号を平滑化するために利用されることが多いです。
AvgFilter(Average Filter): 設定値 0~50 ディフォルト値10

移動平均フィルターと思われます。
一定数の最新データを平均することで、ランダムノイズを平滑化し、安定した出力値を得る方法です。
短期間のノイズ除去に有効で、計測データが急激に変化しない場合に安定した結果が得られます。
EmaFilter(Exponential Moving Average Filter): 設定値 0~99 ディフォルト値10

指数移動平均フィルターと思われます。
最新データに対して過去のデータよりも高い重みを与えながら平滑化を行います。
応答速度が速く、データ変化への追従性とノイズ低減のバランスが取れるため、計測値がある程度変動する場合にも対応できます。

RawADCはロードセルの読み取り値と思われます。
キャリブレーションに使用します。

キャリブレーションの方法は
(1) Reset Offset
(2) RawADCを取得、RawADC_0gとする。
(3) 100gの重りを乗せてRawADCを取得、RawADC_100gとする。
(4) GAP=(RawADC_100g-RawADC_0g)/100 を計算する。
で得られたGAP値を GAPレジスタに設定します。
※校正用の分銅が必要なので、下手に弄らない方が吉

ライブラリ

レジスタに値を読み書きするだけなので、ライブラリと言うほどのモノは不要ですが、
自前で組んでも公式のライブラリとほとんど同じになりそうなので、
公式のライブラリのUNIT_SCALESクラスをそのまま使用した方が手っ取り早いです。

UNIT_SCALES クラスメソッド
メソッド 備考
bool begin(TwoWire *wire = &Wire, uint8_t sda = 21, uint8_t scl = 22,uint8_t addr = DEVICE_DEFAULT_ADDR)
float getWeight() 重量読み取り g単位
int32_t getWeightInt() 重量読み取り 1/00g単位
String getWeightString() 重量読み取り g単位 最大15文字(末尾null)
void setOffset(void) 0表示セット
int32_t int32_t getRawADC() ADCの読み取り値
float getGapValue() キャリブレーション値読み取り
void setGapValue(float offset) キャリブレーション値設定
bool setLEDColor(uint32_t color) RGB-LED色設定 : RGB各1Byte
uint32_t getLEDColor() RGB-LED設定色読み取り
uint8_t getBtnStatus() ボタン状態読み取り
bool setLPFilter(uint8_t en) ノイズ除去フィルター設定 0~1
uint8_t getLPFilter(void) ノイズ除去フィルター設定値読み取り
bool setAvgFilter(uint8_t avg) 移動平均フィルター設定(0~50、ディフォルト値10)
uint8_t getAvgFilter(void) 移動平均フィルター設定値読み取り
bool setEmaFilter(uint8_t ema) 指数移動平均フィルター設定(0~99、ディフォルト値10)
uint8_t getEmaFilter(void) 指数移動平均フィルター設定値読み取り

スケッチ

M5Stack BASIC用
 計量ユニットの全てのレジスタを表示するスケッチ GettingRegister
 動画で使用した キッチンスケールのスケッチ GettingWeight
 どちらも公式のサンプルスケッチをベースに表示を変えているだけです。

MiniScaless.zip
 ・GettingWeight:キッチンスケール(大型表示)
 ・GettingRegister:全レジスタ表示
 ・calibration:キャリブレーション(GAP値設定)

解説動画