M5STACKとHX711を使って、重量を測定してみた


経緯

とあるハッカソンのお手伝いをしていて、参加者から重量を測定したいという話があって、とりあえず、ロードセルとHX711を使えば重量が計れるはずということで、秋葉原に買い出しに行ってきて、部品を提供し、軽く試作したところ、重量に応じて数字が上がっていていたので、これでいいではないか?ということで、その時はこれで終わらせたのだけど、せっかくなので、正確な重量を計測してみたいなあなんて思い始めて、この週末の土日、格闘しておりました。
やっと、500円玉(約7g)が測定できました。

ロードセルって

ロードセルは歪みゲージと呼ばれていて、よじれることで、抵抗値が変わるデバイスです。ただし、抵抗値が微少に変化するので、ホイーストンブリッジ回路を使って、その抵抗値の変化を読み取り、重量に変換するHX711というICを使って見える化を行います。HX711搭載の基板が秋月電子から、
HX711使用 ロードセル用ADコンバータ モジュール基板と、ロードセル シングルポイント(ビーム型) SC616C 500gを使って、M5STACKで値を表示してみようという内容です。

ロードセルは、MDF板で挟み込みました。

写真にあるように、上に載せた物体の重さを測るので、重力方向が矢印方向になるようにセッティングします。このとき、M3のネジとワッシャで固定しています。ちなみにロードセルには、ちゃんと、ネジ穴がちゃんとあります。

AE-HX711の配線は

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;
}

以上、ご参考までに