「日記」カテゴリーアーカイブ

密林から、重量センサー買ってM5STACKに繋いでみた

経緯

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

以上、ご参考までに