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値設定)