重さを測る その1 20kgが測れるロードセル

 0.01g単位で測れる秤はアマゾンで千円ぐらいで購入できます。重さを測るセンサはロードセルです。少し前まで、産業用は大変高価でした。最近安価に入手できるようになったロードセルを使います。

ロードセルの設置

 ビーム型のロードセルの端面に、矢印のシールが貼ってあります。これを目印に取り付けます

 入手した「ロードセル シングルポイント(ビーム型) SC133 20kG」のおもな仕様は次の2点です。

  • 定格容量;20kg
  • 定格出力;1mV/V

 ロードセルにはひずみゲージが貼ってあり、ブリッジ回路で構成されています。電圧を10Vかけると、最大荷重20kgのときの出力電圧は10mVです。印加する電圧が異なれば、補正します。

ロードセル専用のA-DコンバータHX711

 ブリッジ回路に印加する電圧が基準となって荷重によって抵抗値が変わりバランスが崩れ、電圧として現れます。その電圧は大変低いので、HX711にはアンプが内蔵されています。A-D変換は24ビットです。サンプリング周期は10/80SPSの2種類が選択できますが、入手した秋月電子通商のモジュールでは10SPS(1秒間に10回変換)固定です。
 出力は独自方式の24ビット・ディジタル出力です。

モジュールの組み立て

 

 2Pのターミナルは、二つを連結してからプリント基板に挿しこんではんだ付けします。取扱説明書にあるように、基板裏にあるJ3とJ4ははんだでショートします。

接続

 ロードセルの接続ケーブルの色分けは統一されていないようです。

  • 赤色;AVdd(CN2)
  • 黒色;GND(CN2)
  • 緑色;A-(CN3)
  • 白色;A+(CN3)

 Arduinoはディジタル・ポートを二つ使います。

HX711モジュール Arduino
6番GND GND
3番CLK 9番
2番DAT 8番
1番Vdd 5V

テスト・スケッチ

 秋月電子通商のWebから「Arduinoサンプルソース」をダウンロードします。Web EditorのNew Sketchをクリックし、サンプルをメモ帳で開き、全選択しコピーしたのち貼りこみます。
 スケッチの内容を見ると、今回入手した「 ロードセル シングルポイント( ビーム型) SC133 20kG [P-12034]」が選択されています。定格出力値が間違っていますが、このまま書き込みます。Monitorを開くと、読み出した値と重量が表示されています。ロードセルを指で押すと値が変わります。

 HX711の独自ディジタル出力は、ArduinoからCLK端子をHigh-Lowとすると、24ビットのMSBから1ビットずつ"1'/'0'を送ってきます。クロックCLKの立ち上がり0.1us以内にデータは用意され、クロックの立ち下がりから次のクロックの立ち上がりの間データは維持されます。
 検索して見つかる海外のスケッチでは、クロックのHighの間にデータを読み取るようになっていますが、このスケッチでは立ち下がった後に読んでいます。どちらの読み取りもデータシートのタイミングを満たしています。

スケッチ

 テスト・スケッチをベースに、必要最小限の記述にしました。setupでは荷重がかかっていないという前提でRead()で読み込んだ数値を初期値と考え、変数offsetにセットします。
 Read()関数では、30回の平均データを使って電圧voltを求めています。dataは読み出した24ビット・データ、16777216は2^24、128はPGAの増幅度、4.2987は印加電圧です。HX711は内部の安定化電源の出力がVbg端子に出ています。20kと8.2kを経てAVddへ出てくる電圧が4.2987Vです。

 求まった電圧に、定格容量20kgと定格出力1mV/Vでスケール変換をして荷重gramを得ます。最初に測ったときのoffsetを引いて戻ります。
 おもりを載せるとマイナスの値が得られます。指で矢印の反対の上方向へ軽く動かすと正の値が得られます。したがって、マイナス符号をつけて重量の値としました。

#define DAT 8
#define CLK 9
float offset=0;

void setup() {
Serial.begin(9600);
Serial.println("start");
pinMode(CLK, OUTPUT);
pinMode(DAT, INPUT);
offset = Read();
}

void loop() {
float data;
data = Read();
Serial.print(-data,2);Serial.println("g");
delay(1000);
}

float Read(void){
long sum = 0;
for (int i = 0; i < 30; i++) {
long data=0;
while(digitalRead(DAT)!=0);
for(char i=0;i<24;i++) {
digitalWrite(CLK,1);
delayMicroseconds(1);
digitalWrite(CLK,0);
delayMicroseconds(1);
data = (data<<1)|(digitalRead(DAT));
}
digitalWrite(CLK,1); //gain=128
delayMicroseconds(1);
digitalWrite(CLK,0);
delayMicroseconds(1);
data = data^0x800000;
sum += data;
}
float data = sum /30;
float volt;float gram;
volt =data*(4.2987/16777216.0/128);
gram=volt/(0.001*4.2987/20000.0);
return gram-offset;
}

 実行中です。フルスケール20kgなので、10gなどでは小数点の位の変動は大きめです。

前へ

温度を測って異常を検知 その1 1-Wire温度センサ

次へ

温度を測って異常を検知 その2 複数1-Wire温度センサ