しばらく休みをとった後、本ブログSeason 2の開始です(後からですみませんが、第1回のブログで全体の予定目次を更新しておきました)。しばらく、いろいろなセンサーの使用法について紹介していこうと思います。今回は、力学センサーを多く扱う土木系でおなじみのひずみゲージ型センサーからデータを取得する方法を紹介します。

 

 ひずみゲージ型センサーは、ご存じの通り、ブリッジに数Vの電圧を印加すると、圧力・力・トルク・変位などが(ひずみゲージの曲げを通して)数mVの電圧として返ってくるもので、計測する物理量の変化と出力電圧が比例しています。数mVという出力は非常に小さいので、普通はこれをアンプを通して増幅し、ADを介してデジタル化してPCで記録するか、あるいはアンプ・AD・記録装置が一体化したデータロガーで記録します。ここでは、後者を自作しようというものです。

 

ロードセルコンバータ(ひずみゲージ型センサー用アンプ・AD変換モジュール)HX711

 

 といっても、大した工作は必要なく、HX711というチップを利用するだけです。例によって、ブレークアウトモジュールとして基板実装されたものを使うと便利です。AmazonなどでHX711を検索すると、1枚300円くらいのものが出品されています。

 

 

HX711のブレークアウトモジュールには、出力側が「RED/BLK/WHT/GRN/YLW」のもの(赤い基板のものが多い:上写真右)と「E+/E-/A-/A+/B-/B+」のもの(緑の基板のものが多い:上写真左)がありますが、どちらも基本的に同じで(載っているチップは同じですので)、ピンアウトが微妙に違います。このチップは2つのひずみゲージ型センサーをつなぐことができ、それぞれチャネルAとチャネルBとしています。チャネルAのほうはゲイン(利得)が64倍あるいは128倍から選べる一方で、チャネルBはゲインが32倍に限られています。ゲインは大きいほうがよいという場合が多いので(128倍でもレンジオーバーはしない)、例えば4つのセンサーを扱う必要がある場合は、モジュールを2つ買ってA・Bチャネル両方使うよりも、チャネルBは使わずに4つ買ったほうがよいと思います(どうせ安いものなので)。このチップはアンプに加えて24bitのADコンバータが内蔵されており、センサーの出力をデジタルデータとしてマイコン(Arduino)に送ります。

 

接続方法

 

 まずセンサーの接続について説明します。上記写真の右のモジュールの場合、端子に色が書かれているので、その通りにセンサーからの印加+、印加-、出力+、出力-、グラウンドをそれぞれRED、BLK、WHT、GRN、YLWにつなぎます。共和電業や東京測器の製品なら、色のまま(シールド線はYLWに)つなげば大丈夫です。基板には特段に書いてありませんが、これが上記の「チャネルA」に接続したことになります。チャネルBは、写真のCLK・GND端子の下にある二つの穴が出力+、出力-の端子になっているようです(使ったことがありませんが)。なお、緑の基板のモジュールのタイプでは、センサー接続端子がE+, E-, A-, A+, B-, B+となっているため、チャネルAを使いたければ最初の4つに印加+、印加-、出力-、出力+をつなぎます。シールドを接続する端子がありませんが、Arduino接続側のGND端子につないでおけばよいでしょう(赤い基板のモジュールでも、YLWは単にGNDに直結されているようです)。

 

 次に、マイコン(Arduino)側ですが、VCC、DAT、CLK、GNDの4本を使います。VCCは5Vあるいは3.3V、GNDはGNDにつなぎます。DAT、CLKはそれぞれデータ線とクロック線だと思いますが、これらは任意のアナログピン(Arduino UNOならA0-A5)あるいはデジタルピン(0-13)につなぐことができ、ソフトウェアのほうで指定します。これはI2CともSPIとも異なる通信プロトコルのようです。

 

 赤い基板のモジュールのほうを例にした接続図が以下になります。

 

 

 

 なお、センサーをいちいちモジュールにはんだ付けするのは大変なので、端子台とユニバーサル基板などを組み合わせたものを作っておくとよいです。

 

 

スケッチは以下のようにします。HX711用のライブラリをダウンロードしてincludeしてください(第7回参照)。

https://github.com/bogde/HX711

 



#include <HX711.h>

 

HX711 channel1;

 

void setup() {

  Serial.begin(9600);

  channel1.begin(A0, A1);  // HX711.DOUT  - pin #A1, HX711.PD_SCK - pin #A0

}

 

void loop() {

  Serial.println(channel1.read_average(20));       // print the average of 20 readings from the ADC

  delay(1000);

}

 

 

注意点として、

・ゲインはデフォルトで128。64に変えたければ、channel1.set_gain(64);の一文を加える(このスケッチでいえば、setup(){}の最後に)。

・データレートはデフォルトで10Hz。データシートによれば80Hzにも変えられるよう。

・このスケッチでは、データ取得速度よりも正確性を求めて20回平均をとっています。10Hzで20回なので、それだけで2秒待つことになります。平均をとらずに単に1回の計測値を取得したければ、channel1.read()という関数があります。

 

 なお、上記ライブラリにはいろいろな関数があります。スケールを較正する関数やゼロ点をとるtareの関数などがありますが、基本的にこれらは不要と思います。どのような数値が得られるにしろ、Arduinoに演算をさせればよいですから。センサーメーカーからの較正係数やゲインに基づいて較正係数を計算する人も多いと思いますが、このモジュールから送られてくる数値は非常に大きく、何の数値なんだかよくわかりません。24bitなのに2^24よりも大きな数値が送られてきたり。しかし、物理量と比例はしているので、なんだかよくわからずも較正してそのまま使っています。

 

計測例

 

 土質実験室ではロードセル(荷重計)や変位計を使うことが多いですが、これらを用いた計測結果の例を示します。ロードセルは共和電業のLUK-A(引張・圧縮両用、容量5kN)です。較正して物理量に直した結果を示します。線形性には問題なく、ここでは精度・安定性のみ示します。ロードセルに何も置かず、放置した結果なのですが、0.005kgf程度の精度が見られます。容量-5~+5kNに対して0.005kgfなので十分といえるでしょう。荷重を変えた後、少しドリフトが見られたのですが(ここで見せているのは、数十秒待って落ち着いた後のデータです)、モジュールのせいなのかロードセルのせいなのか、そこまでは調べませんでした。

 

 

 もう一つの例は変位計です。実験室にうっちゃってあったもので、ラベルがないのでどこの会社の製品かわかりませんが、ストロークが10mmの、ごく一般的な変位計です。東京測器CDP-Mに形が似たものです。これに少し変位を与えて固定しておいた結果が以下になります。

 

 

多少のドリフトがありますが(これはジグのクリープかもしれません。この程度の変位だと、温度変化の影響も受けます)、素晴らしい安定性・精度です。どこかのブログで、HX711はノイズに弱く安定性に問題あり、と書いてありましたが、これらの例では素晴らしい結果が得られました。そのブログの人は、違う分野の人で、もっと高い精度を求めているのか?あるいはシールドケーブルを使っていなかったのか?

 

複数のセンサーから読む

 

 先に記したように、ゲイン設定の制約などを考慮すると、センサーの数だけHX711を用意したほうが得策です。例えば2つ接続する場合、2つ目のHX711のDAT・CLKは例えばA2・A3など未使用のピンに接続します。そして、スケッチでは個別のHX711のインスタンスを作成すればよいです。

 



#include <HX711.h>   

 

HX711 channel1;

HX711 channel2;

 

void setup() {

  Serial.begin(9600);

  channel1.begin(A0, A1);  // HX711.DOUT  - pin #A1, HX711.PD_SCK - pin #A0

  channel2.begin(A2, A3);  // HX711.DOUT  - pin #A1, HX711.PD_SCK - pin #A0

}

 

void loop() {

  Serial.println(channel1.read_average(20));       // print the average of 20 readings from the ADC

  Serial.println(channel2.read_average(20));       // print the average of 20 readings from the ADC

 

  delay(1000);

}

 

 

 ちなみに、後の回で紹介する予定ですが、Arduinoからのシリアル通信はArduino IDEの「シリアルモニタ」を使わなくても、たとえばVisual BasicのSerialPort(VB6以前でいうMS Comm)などのターミナルモジュールで受け付けることができるので、HX711とArduinoがあれば、Windows PC制御の三軸試験装置がつくれるということになります。北海道大学の地盤物性学研究室では、力学試験装置にはUnipulseのロードセルコンバータLC240などをセンサー1チャネルごとに使っていますが、これは1個8万円くらいします。三軸試験装置では4~5チャネル(軸荷重、セル圧、間隙水圧、排水量、軸変位)の計測が必要になるので、これだけで40万円くらいになってしまいます。もちろん、高いぶんの価値はある仕様なのでしょうが、ちょっとした装置なら、HX711×5個+Arduino互換品で、3000円くらいでやってみるということもできます。実際に、同研究室の一次元凍結融解繰返し装置や連続加圧式水分特性曲線測定装置は、このような自作モジュールで動いています。後の回で紹介したいと思います。