経緯
とあるハッカソンのお手伝いをしていて、参加者から重量を測定したいという話があって、とりあえず、ロードセルとHX711を使えば重量が計れるはずということで、秋葉原に買い出しに行ってきて、部品を提供し、軽く試作したところ、重量に応じて数字が上がっていていたので、これでいいではないか?ということで、その時はこれで終わらせたのだけど、せっかくなので、正確な重量を計測してみたいなあなんて思い始めて、この週末の土日、格闘しておりました。
やっと、500円玉(約7g)が測定できました。
ロードセルって
ロードセルは歪みゲージと呼ばれていて、よじれることで、抵抗値が変わるデバイスです。ただし、抵抗値が微少に変化するので、ホイーストンブリッジ回路を使って、その抵抗値の変化を読み取り、重量に変換するHX711というICを使って見える化を行います。HX711搭載の基板が秋月電子から、
HX711使用 ロードセル用ADコンバータ モジュール基板と、ロードセル シングルポイント(ビーム型) SC616C 500gを使って、M5STACKで値を表示してみようという内容です。
写真にあるように、上に載せた物体の重さを測るので、重力方向が矢印方向になるようにセッティングします。このとき、M3のネジとワッシャで固定しています。ちなみにロードセルには、ちゃんと、ネジ穴がちゃんとあります。
AE-HX711の配線は
写真の左側には、GROVE端子を接続、右側はロードセルから出てきた線を接続しています。赤と黒は電源になります。白と緑は、まさに、ホイーストンブリッジ回路の差分電圧が出てくる端子になります。自分の場合は、上記のように接続して、物体を載せたときに+の方向で重量が測定できました。もし、逆の値になった場合は、反対に接続することで、良くなる場合もあるかもしれません。
ソースコード
基本的には、秋月電子のHPのArduinoのソースコードのままです。
// M5STACK AE-HX711をGROBE-B端子接続して、ロードセル500gで重量を測定するプログラム
// 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);
//---------------------------------------------------//
// ピンの設定
//---------------------------------------------------//
// AE-HX711-SIP
// 1 pin Red
// 2 pin Yellow
// 3 pin White
// 4 pin Black
#define pin_dout 36 // GROVE-B Yellow
#define pin_slk 26 // GROVE-B White
//---------------------------------------------------//
// ロードセル S字型 SC301A 100kG [P-12036]
//---------------------------------------------------//
//#define OUT_VOL 0.002f //定格出力 [V]
//#define LOAD 100000.0f //定格容量 [g]
//---------------------------------------------------//
// ロードセル シングルポイント( ビーム型) SC601 120kG [P-12035]
//---------------------------------------------------//
//#define OUT_VOL 0.001f //定格出力 [V]
//#define LOAD 120000.0f //定格容量 [g]
//---------------------------------------------------//
// ロードセル シングルポイント( ビーム型) SC133 20kG [P-12034]
//---------------------------------------------------//
// #define OUT_VOL 0.002f //定格出力 [V]
// #define LOAD 20000.0f //定格容量 [g]
//---------------------------------------------------//
// ロードセル シングルポイント(ビーム型) SC616C 500g[P-12532]
//---------------------------------------------------//
#define OUT_VOL 0.0007f //定格出力 [V]
#define LOAD 500.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("AE-HX711 Example");
Serial.println("AE-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;
}
以上、ご参考までに