👏
HX711で重量計測
やったこと
Arduinoで重量が測れるか検証してみた
使ったもの
参考
比較的最近更新しているライブラリーを試してみる
手順
インストール
ライブラリマネージャーでhx711を検索し、HX711をインストール
キャリブレーション
ファイル->スケッチ例->HX711->HX_calibrationを開く
//
// FILE: HX_calibration.ino
// AUTHOR: Rob Tillaart
// PURPOSE: HX711 calibration finder for offset and scale
// URL: https://github.com/RobTillaart/HX711
#include "HX711.h"
HX711 myScale;
// adjust pins if needed.
uint8_t dataPin = 6;
uint8_t clockPin = 7;
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("HX711_LIB_VERSION: ");
Serial.println(HX711_LIB_VERSION);
Serial.println();
myScale.begin(dataPin, clockPin);
}
void loop()
{
calibrate();
}
void calibrate()
{
Serial.println("\n\nCALIBRATION\n===========");
Serial.println("remove all weight from the loadcell");
// flush Serial input
while (Serial.available()) Serial.read();
Serial.println("and press enter\n");
while (Serial.available() == 0);
Serial.println("Determine zero weight offset");
// average 20 measurements.
myScale.tare(20);
int32_t offset = myScale.get_offset();
Serial.print("OFFSET: ");
Serial.println(offset);
Serial.println();
Serial.println("place a weight on the loadcell");
// flush Serial input
while (Serial.available()) Serial.read();
Serial.println("enter the weight in (whole) grams and press enter");
uint32_t weight = 0;
while (Serial.peek() != '\n')
{
if (Serial.available())
{
char ch = Serial.read();
if (isdigit(ch))
{
weight *= 10;
weight = weight + (ch - '0');
}
}
}
Serial.print("WEIGHT: ");
Serial.println(weight);
myScale.calibrate_scale(weight, 20);
float scale = myScale.get_scale();
Serial.print("SCALE: ");
Serial.println(scale, 6);
Serial.print("\nuse scale.set_offset(");
Serial.print(offset);
Serial.print("); and scale.set_scale(");
Serial.print(scale, 6);
Serial.print(");\n");
Serial.println("in the setup of your project");
Serial.println("\n\n");
}
// -- END OF FILE --
これを実行してシリアルモニタを開いてボーレートを115200に変更
言われたとおりにEnterを押したり数値を書いたりすればよい
予めおもりの重量を計測しておき、それを載せてキャリブレーションを行う
今回は初めてであったので、3つのおもりで実験してみた
全てのおもりで同じ結果になるはず
1回目 4016g
place a weight on the loadcell
enter the weight in (whole) grams and press enter
WEIGHT: 4016
SCALE: 213.226043
use scale.set_offset(393296); and scale.set_scale(213.226043);
in the setup of your project
2回目 2029g
CALIBRATION
===========
remove all weight from the loadcell
and press enter
Determine zero weight offset
OFFSET: 393328
place a weight on the loadcell
enter the weight in (whole) grams and press enter
WEIGHT: 2029
SCALE: 213.163681
use scale.set_offset(393328); and scale.set_scale(213.163681);
in the setup of your project
3回目 307g
CALIBRATION
===========
remove all weight from the loadcell
and press enter
Determine zero weight offset
OFFSET: 393392
place a weight on the loadcell
enter the weight in (whole) grams and press enter
WEIGHT: 307
SCALE: 212.990829
use scale.set_offset(393392); and scale.set_scale(212.990829);
in the setup of your project
ほぼ同じ値になった
307gの軽いおもりの場合は精度が悪い可能性があるので、4016gのときと2029gのときの結果の平均値を入れてみることにする
ということで、下記のような簡単なコードを作って試してみた
#include "HX711.h"
HX711 scale;
// adjust pins if needed
uint8_t dataPin = 6;
uint8_t clockPin = 7;
float weight = 0;
void setup()
{
Serial.begin(115200);
Serial.print("HX711_LIB_VERSION: ");
Serial.println(HX711_LIB_VERSION);
Serial.println();
scale.begin(dataPin, clockPin);
Serial.print("UNITS: ");
Serial.println(scale.get_units(10));
// load cell factor 20 KG
// scale.set_scale(127.15);
// load cell factor 5 KG
// scale.set_scale(420.0983); // TODO you need to calibrate this yourself.
// load cell factor for 10 KG
scale.set_scale(213.195);
scale.tare();
Serial.print("UNITS: ");
Serial.println(scale.get_units(10));
}
void loop()
{
// read until stable
weight = scale.get_units(10);
delay(100);
Serial.print("UNITS: ");
Serial.println(weight);
}
// -- END OF FILE --
307gの結果
2029gの結果
4016gの結果
割といい感じで使えそう
Discussion