PR 記事には広告が含まれています
スポンサーリンク
Translate

HX711モジュールの回路を3.3Vで動作するよう改造してESP32で重さを測定する方法

スポンサーリンク

HX711モジュール

スポンサーリンク

HX711モジュールは5V仕様

Amazonで売っているHX711モジュールは5V電源で動作する仕様となっています。ESP32は電源電圧が3.3Vであるため、HX711を3.3Vで動作させる必要があります。

本当はもっと低い電圧で動作する

HX711のIC自体は、データシートによると2.7Vから5.5Vの範囲で使えます。

そのため3.3Vでも動作させることができます。しかし、条件があります。データシートの「Power Supply Option」の項目です。

デジタル電源(DVDD)はマイコンと同じ電源電圧にするべきです。
内蔵のアナログ電源用のレギュレータを使う時は(略)その電圧を最低でもVSUPピンの電圧よりも100mV低い必要があります。

HX711は、歪みゲージに印加する電圧や内部のアナログ回路の動作のためにレギュレータが内蔵されています。そのレギュレータが生成する電圧を、電源電圧よりも少なくとも100mV下げた電圧に設定しないといけないということです。そのレギュレータの電圧は、どのように決まるかというと、

アナログ電源用のレギュレータを使う時(略)その電圧は
VAVDD = VBG * (R1+R2)/R2
となります。

と書いてあります。VBGはデータシートより1.25V。R1,R2はHX711モジュールに実装されている抵抗値を読み取ると、R1=20kΩ,R2=8.2kΩでした。そのため、HX711モジュールのレギュレータの電圧は、

VAVDD = 1.25 * ( 20k + 8.2k ) / 8.2k = 4.3V

となります。そのため、HX711モジュールの動作する電源電圧は、最低4.4Vまでとなります。

試しにレギュレータの出力電圧を測定してみます。モジュールのE+とE-の間の電圧を測定します。

4.2Vと、設計よりはちょっと低いですが、まぁ設計通りの電圧になっています。

3.3V仕様に改造

3.3V電源で動作させるには、内蔵レギュレータの電圧を、3.2V以下に下げる必要があります。そこで、抵抗値を変更します。R1,R2どちらを変更してもいいのですが、今回は20kΩを変更します。20kΩに22kΩを並列に追加し、11kΩにします。すると、

VAVDD = 1.25 * ( 11k + 8.2k ) / 8.2k = 2.9V

レギュレータの生成する電圧が2.9Vとなり、3.3V電源でも正常に動作するようになります。

スポンサーリンク

HX711モジュールを3.3V仕様に改造

それでは、HX711モジュールを改造しましょう。改造する場所は、モジュールの左上の203という抵抗です。この抵抗の上に22kΩのチップ抵抗を載せてはんだ付けします。

これで、20kΩと22kΩが並列接続されて11kΩになりました。

再度レギュレータの電圧を測定してみます。

2.8Vと、まぁ設計通りの電圧になっています。ちなみに、電源電圧を5Vにしても、3.3Vにしても、レギュレータの電圧は2.8Vと一定でした。レギュレータが正常に動作していることがわかりました。

ちなみにレギュレータの電圧は、HX711モジュールを電源につないだだけでは、パルス状にたまにしか電圧が発生しませんでした。

スポンサーリンク

歪みゲージとESP32に接続する

それではESP32と接続して、プログラムで歪みゲージの値を取得できるようにしていきましょう。

HX711と歪みゲージの接続

歪みゲージとHX711モジュールとは以下のように接続します。

  • E+:赤
  • E-:黒
  • A-:白
  • A+:緑

歪みゲージは昨日作った「はかり」に取り付けてあります。

そして、HX711モジュールとESP32とは以下のように接続します。

  • GND:GND
  • DT:32
  • SCK:33
  • VCC:3V3
スポンサーリンク

HX711のプログラム

まずは生の値を測定してみる

Arduinoでプログラムを作っていきます。プログラムは、以下の通りです。

#include "HX711.h"
const int DT_PIN = 32;
const int SCK_PIN = 33;
HX711 scale;

void setup() {
  Serial.begin(115200);
  Serial.println("start");
  scale.begin(DT_PIN, SCK_PIN);
}

void loop() {
  long value = scale.read_average(5);
  Serial.println(value);
}

HX711のライブラリを使っているのでとてもシンプルです。HX711はとても便利なライブラリが公開されているので、それを利用しています。

srcフォルダの中のHX711.cppとHX711.hを、上記のプログラムを保存したフォルダにコピーします。

これで準備は完了です。コンパイルしてESP32にプログラムを書き込みます。

測定結果は、シリアルモニターに出力されます。

420000くらいで安定して測定できています。この値は、歪みゲージの種類や作ったはかりの重さで変わります。値が安定しているというところが今回の重要なポイントで、正常に測定できているということになります。

重さを測定する

先ほど得られた値は、歪みゲージが歪んだことにより発生した電圧をADした値なので、まだ何gという重さの値にはなっていません。そこで、この値から、重さに変換していきます。

重さに変換するプログラムがこちらです。

#include "HX711.h"
const int DT_PIN = 32;
const int SCK_PIN = 33;
const int SW_PIN = 0;

HX711 scale;
long offset = 0;
double gradient = 1.0;
double baseWeight = 200.0;

void setup() {
  Serial.begin(115200);
  Serial.println("start");
  scale.begin(DT_PIN, SCK_PIN);
  pinMode(SW_PIN, INPUT_PULLUP);
}

int swLowCount = 0;
void loop() {
  long value = scale.read_average(5);
  
  double weight = (double)(value - offset) * gradient;
  Serial.printf("%ld\t offset:%ld\t gradient:%.10f\t weight:%.2f[g]\n", value - offset, offset, gradient, weight );

  if ( digitalRead(SW_PIN) == LOW )
    swLowCount++;
  else
  {
    //short push(2sec) and release is enter the Offset value measuring mode
    if ( swLowCount > 0 && swLowCount < 4) { 
      Serial.print("Offset value measuring..."); 
      offset = scale.read_average(50); 
      Serial.printf(" Done. Offset value = %ld\n", offset);
    }

    //long push(6sec) and release is enter the Gradient value measuring mode
    if ( swLowCount > 6 )
    {
      Serial.print("Gradient value measuring...");
      long baseValue = scale.read_average(50);
      baseValue -= offset;
      gradient = baseWeight / (double)baseValue;
      Serial.printf(" Done. Gradient value = %.10fd\n", gradient);
    }

    swLowCount = 0;
  }
}

HX711から得られた値から重さに変換するには、以下のステップが必要です。

  1. 何も物が無い状態の値を差し引く(オフセット除去)
  2. 既知の重さの物を置いた時の変化量を知る(比例係数の算出)

1.オフセット除去

歪みゲージは、自分の重さや、はかり自体の重さによって、既に歪んでいます。そのため、はかりに何も載せていなくても、何かしらの一定の値が得られます。

そのため、この値(オフセット)をAD値から常に差し引く必要があります。

プログラムを実行し、まずははかりに何も置かない状態にします。

だいたい418000くらいの値が出ています。これがオフセットです。

ESP32のBootボタン(IO0)を2,3秒押した状態を保持してから離します。

オフセットを測定するモードになります。

5秒くらいオフセットが測定され、その後は結果からオフセットが除去されるようになります。

これで、はかり自体の重さが差し引かれるようになりました。

2.比例係数の算出

オフセットを差し引かれた値は、はかりに何も置かない時を0としたAD値でしかありません。そこで、AD値から重さに変換するための比例係数を算出します。

AD値は、重さに比例して大きくなります。このため、1AD値の時に何gなのかがわかれば、測定したAD値に掛け算することで、重さに変換することができます。

具体的には、重さのわかっている物、例えば200gの物を置いて、AD値がいくつになるか調べます。そして200/AD値をすることで、重さに変換するための比例係数を算出します。

水を容器に入れるなどして、200gの重りを用意します。

はかりの上に載せます。

ESP32のBootボタン(IO0)を6秒以上長押しして離します。

比例係数を算出するモードになります。

5秒くらいで比例係数が測定されます。比例係数は0.000311...となりました。

算出された比例係数を使って、AD値から重さに変換されるようになります。200gの水なので、重さも200gとなっています。

これで、重さが測れる「はかり」となりました。

もし200gではなく100gでキャリブレーションをしたいのであれば、プログラムの9行目を100.0としてください。

この過程で得られた、オフセットの値と、比例係数の値を、予めプログラムの7行目のoffsetと、8行目のgradientにセットしておけば、リセットしても最初から重さを測定できるようになります。

2021.3.21 追加 つづきはこちら

追加終わり