前回組み立てたキッチンスケールキットに含まれていたAD変換器HX711モジュールの制御方法を調べて行きたいと思います。
まず、ロードセルとセットになっているAD変換器HX711のデータシートを検索しておきましょう。
HX711データシートを検索(別ウインドウが開きます)
データシートを参照しながら、HX711の使い方を明らかにしていきます。
データシートによると、HX711の電源電圧DVDD=2.6〜5.5[V]の規定でした。3.3V定格のマイコンボードで使うなら、DVDD=3.3Vを接続するのが使い易いですね。5V給電もできるので、Arduino UNO等5V定格のマイコンでも使用可能です。
問題は、アナログ用の電源電圧AVDD=2.6〜5.5[V]をどうするか?です。
HX711は24ビットの差動入力AD変換器ですので、1LSBに相当する電圧は電源電圧AVDDの224分の1と、非常に微小な電圧です。ちょっとしたノイズであっても、大きな影響を受けてしまいます。少しでもノイズの影響を低減したいと思うなら、AVDDを定格内の可能な限り高い電圧で使うのが定石です。
データシートによると、HX711にはアナログ電源用のレギュレータが内蔵されている様です。以下図にHX711データシートに記載された応用回路例を引用します。
※HX711データシートから引用。
今回入手したHX711モジュールに実装された素子等を眺めた限り、恐らく上の回路例に近い回路が実装されている物と推測します。
上図の応用回路例では、フィードバック入力VFB端子と内蔵VBG(バンドギャップ基準電圧)が等しくなる様に、BASE端子が制御されます。BASE端子を適切なPNPトランジスタのベースに接続すると、注入型のLDOレギュレータを構成できます。
ただし、PNPトランジスタQ1と、出力電圧調整用の抵抗器×2個(R1,R2)を外付けする必要があります。HX711モジュールには、その外付け回路が搭載されている模様です。
チップ抵抗のマークとデータシートより:
アナログ電源電圧AVDD=2.6〜5.5[V]の規定なので、ノイズの影響を最小化するためには、AVDD=5Vを使うのが理想的です。理想的なAVDDを生成するための抵抗値を算出してみると、R2=R1÷(AVDD÷VBG−1)≒6.7kΩだと解りました。
実際の回路では、R2=8.2kΩ、AVDD=4.3Vと、中途半端な値に設定されているようです。近い値のチップ抵抗が無かったのか??設計の意図は不明です……。
更に、肝心なレギュレータの電源電圧VSUPは、DVDDと同じ電源が接続されています。
Arduino DUE等3.3V定格のマイコンを使う場合、DVDD=3.3Vですので、レギュレータで出力できる最大電圧は以下の通りです。
少なくともAVDDがDVDDより上昇する事は無いので、DVDD=3.3Vの場合はR1,R2で決まる4.3Vまで上がることはありません。
AVDD=5Vとまで言わないまでも、せめてAVDD=4.3Vで使いたいなら、Arduino UNO等の5V定格マイコンを使い、DVDD=VSUP=5Vを給電する必要があります。もしくは、Arduino DUE等の3.3V定格マイコンを使う場合、DVDD=5Vを給電した上で、通信信号線(PD_SCK,DOUT)にレベルシフタL/Sを挿入して使う事になります。
なんだか、「帯に短し、襷に長し」な感じです。中華の臭いがします……。
※使い方を考慮するなら、HX711モジュールの電源DVDDとVSUPを分離して、個別に印可できるようにしておくべきだと思われます。この辺りの設計思想と言うか意図は計りかねます。
チップ抵抗には、3桁ないし4桁の数字がマークされています。いずれも、最後の数字が10の冪数になっています(以下例を参照)。
例)チップ抵抗のマーク
ここまでは、インターネットで調べたら出てきます。
では問題、「E02」の抵抗値は、いくらでしょうか?
答え: 20kΩ
何でよ?って言うと、180°裏返っているのです。「E02」に見えたものは、180°裏返すと「203」ということで、20×103Ω=20kΩが答えです。
普通、「2」が裏返っていたら判るでしょ?
「3」だって、裏返っても「E」には読めないよね?
仰る通りなのですが、何分、小さなチップ抵抗にマークされた小さなフォントなので、天地を判別できるほどの解像度が無いのです。さすがに「E」は数字ではないので「違う」と判りますが、「822」は、どうでしょうか?180°裏返ると「228」と読めてしまいますが、抵抗値22×108Ωで矛盾しません。このケースでは、2.2GΩが常識的に大きすぎるので、候補から排除するのでしょうか??
180°裏返っても判別できない「2」や「5」、「8」、「0」、「1」、裏返ると区別のつかない「6」と「9」等が曲者です。って、10個の数字の内、7個が曲者って、ダメじゃん。何とかならなかったんですかねぇ〜?
上図でR1,R2が、問題の「203」と「822」ですね。では、R3の抵抗値は、いくらに読めますか?
「102」なら、10×102=1,000Ω
「201」なら、20×101=200Ω
こちらの応用回路例だと、R3=100Ωですから、どちらも違いますね。性善説に立てば200Ωの方が近いですが、「100Ω」で指示したのに出来上がったボードは「1,000Ω」に間違っていた、のだとすると、「如何にもありそうな間違い」ですよね。さてどっち?
HX711モジュールの通信インターフェイス信号は、クロック入力PD_SCKと、データ出力DOUTの2線式シリアル通信です。制御方法をデータシートより読み解き、以下にまとめます。
制御方法:
API関数の仕様を、C言語を前提として以下の様に策定しておきます。
API目標仕様:
前節の通り、HX711の使い方としては理解できました。続いて、歪みセンサ(ロードセル+HX711モジュール)としての使い方を理解しておきましょう。
HX711の作動アナログ入力は2チャンネル(A,B)搭載されています。ロードセルのホイートストンブリッジ🌉は、チャンネルA側に接続されているので、モード1または3にて、チャンネルA側を選んで使えば良さそうです。
モード1または3でゲインが異なるので、そこは使って見て決定します。特に問題無ければモード1のゲイン×128で良いはずです。ホイートストンブリッジからの微小な信号をAD変換するためです。万一、オーバフロウするようなら、モード2のゲイン×64に落とす、という対応で良いでしょう。
ロードセルは生じた歪みに応じて電気抵抗が変化する素子です。
何グラムの負荷に対して、どの程度の変化があるか?については個体差があるので、校正して使う必要があります。
ロードセルを校正するためには、重量の神様となる原器が必要です。以下の様なオプションを考えています。
項番の小さい方が高精度な校正が可能ですが、高々キッチンスケールの校正なので、費用対効果も鑑みて、本ページでは2)を選択します。手元に大量の1円硬貨が在った事が幸いしました。長年の小銭貯金の成果です(1^−^)v。
正確な重量測定に使用する目的で校正するのであれば、心行くまで精密さと正確さを追求してみると宜しいと思います。
自作キッチンスケールの校正手順を以下に示します。
引き続き、AD変換値から重量への換算手順を示します。
この換算が正しいためには、ロードセルにかかる負荷(歪み)の大きさと、AD変換値がリニア(直線関係)であることが前提です。次回、実験で確かめます。
AD変換器HX711モジュールの使い方が判りました。残るは、適切なマイコンと接続して、実際に物体の重量を測定してみるだけです。次回完結です。