経緯
『M5STACKとHX711を使って、重量を測定してみた』の記事を書くまでに、なかなか動かせずに困っているときに、Amazon(密林)から、『デジタルロードセル 電子スケール ロードセル計量センサ 重量センサ5KG + HX711 24BIT精密ADモジュール Arduinoと互換、ナイロンガイドポストとネジ付き、教育DIY』を購入していました。
これが届いたので、これを使って、M5STACKと繋いで、重量を測定できました。
ある意味、完成品なので、重量をすぐに測定したいのであれば、これを買ってしまえばOKですね。
購入した商品の特徴
商品が届いてビックリするんだけど、既に全ての部品が半田付けされているし、組立も完了しているので、センターについているピンヘッダにGROVE端子に変換するケーブルをつなぐだけで、M5STACKと簡単に接続できます。
検証コード
商品販売されているサポートに、HX711のモジュールの回路図を送って貰ったところ、秋月のAE-HX711とロードセルの入力の抵抗が100Ωから、1kΩになっているぐらいしか変化が無かったので、ロードセルのパラメータのみを変更しただけでOKでした。販売元にロードセルの型番教えてと聞いたけど、わからないみたいなので、公式な値はわからないですが、校正用に購入した『NEEWER はかり校正用分銅セット200g(100g, 50g, 20g, 10g, 5g) デジタルジュエリースケール用』の値に近づくようにした際の値をプログラムに埋め込んでいます。
// M5STACK にロードセル HX711をGROBE-B端子接続して、重量を測定するプログラム
// Programed by Kazuyuki Eguchi
#include <M5Stack.h>
void AE_HX711_Init(void);
void AE_HX711_Reset(void);
long AE_HX711_Read(void);
long AE_HX711_Averaging(long adc,char num);
float AE_HX711_getGram(char num);
//---------------------------------------------------//
// ピンの設定
//---------------------------------------------------//
// Amazon HX711
// VCC Red
// SLK White
// DT Yellow
// GND Black
#define pin_dout 36 // GROVE-B Yellow
#define pin_slk 26 // GROVE-B White
//---------------------------------------------------//
// Amazonで購入デジタルロードセル 電子スケール ロードセル計量センサ 重量センサ5KG + HX711
//---------------------------------------------------//
#define OUT_VOL 0.00091f //定格出力 [V]
#define LOAD 5000.0f //定格容量 [g]
float offset;
void setup() {
M5.begin();
M5.Lcd.clear(BLACK);
M5.Lcd.setTextSize(2);
M5.Lcd.setTextColor(YELLOW);
M5.Lcd.setCursor(50,10);
M5.Lcd.print("HX711 Example");
Serial.println("HX711 Example");
AE_HX711_Init();
AE_HX711_Reset();
offset = AE_HX711_getGram(50);
M5.Lcd.setCursor(0,90);
M5.Lcd.print("The weight:");
}
void loop()
{
float data;
char S1[20];
char s[20];
data = AE_HX711_getGram(10);
sprintf(S1,"%s",dtostrf((data-offset), 5, 1, s));
Serial.println(S1);
M5.Lcd.fillRect(150,90,100,20,BLACK);
M5.Lcd.setCursor(150,90);
M5.Lcd.print(S1);
}
void AE_HX711_Init(void)
{
pinMode(pin_slk, OUTPUT);
pinMode(pin_dout, INPUT);
}
void AE_HX711_Reset(void)
{
digitalWrite(pin_slk,1);
delayMicroseconds(100);
digitalWrite(pin_slk,0);
delayMicroseconds(100);
}
long AE_HX711_Read(void)
{
long data=0;
while(digitalRead(pin_dout)!=0);
delayMicroseconds(10);
for(int i=0;i<24;i++)
{
digitalWrite(pin_slk,1);
delayMicroseconds(5);
digitalWrite(pin_slk,0);
delayMicroseconds(5);
data = (data<<1)|(digitalRead(pin_dout));
}
//Serial.println(data,HEX);
digitalWrite(pin_slk,1);
delayMicroseconds(10);
digitalWrite(pin_slk,0);
delayMicroseconds(10);
return data^0x800000;
}
long AE_HX711_Averaging(long adc,char num)
{
long sum = 0;
for (int i = 0; i < num; i++) sum += AE_HX711_Read();
return sum / num;
}
float AE_HX711_getGram(char num)
{
#define HX711_R1 20000.0f
#define HX711_R2 8200.0f
#define HX711_VBG 1.25f
#define HX711_AVDD 4.2987f//(HX711_VBG*((HX711_R1+HX711_R2)/HX711_R2))
#define HX711_ADC1bit HX711_AVDD/16777216 //16777216=(2^24)
#define HX711_PGA 128
#define HX711_SCALE (OUT_VOL * HX711_AVDD / LOAD * HX711_PGA)
float data;
data = AE_HX711_Averaging(AE_HX711_Read(),num)*HX711_ADC1bit;
//Serial.println( HX711_AVDD);
//Serial.println( HX711_ADC1bit);
//Serial.println( HX711_SCALE);
//Serial.println( data);
data = data / HX711_SCALE;
return data;
}
以上、ご参考までに