HX711モジュールは5V仕様
Amazonで売っているHX711モジュールは5V電源で動作する仕様となっています。ESP32は電源電圧が3.3Vであるため、HX711を3.3Vで動作させる必要があります。
本当はもっと低い電圧で動作する
HX711のIC自体は、データシートによると2.7Vから5.5Vの範囲で使えます。
そのため3.3Vでも動作させることができます。しかし、条件があります。データシートの「Power Supply Option」の項目です。
内蔵のアナログ電源用のレギュレータを使う時は(略)その電圧を最低でも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モジュールとは以下のように接続します。
- 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.オフセット除去
歪みゲージは、自分の重さや、はかり自体の重さによって、既に歪んでいます。そのため、はかりに何も載せていなくても、何かしらの一定の値が得られます。
そのため、この値(オフセット)を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 追加 つづきはこちら
追加終わり
コメント