Aliexpress で歪みゲージ (ロードセル 1kg) と、HX711 のモジュールを買ったので試してみました。

歪みゲージのつかいかた

歪ませる必要があるので、このように上下に板をつけて挟みこみます。このとき、多少すきまが必要なのでワッシャーなどをかまします。

今回使った歪みゲージのスペックは以下の通りです。(コピペ) また、M4 と M5 のネジが切ってありました。

Rated Load: 1Kg
Rated Output: 1.0mV/V±0.15mV/V
Zero Output: ±0.1mV/V
Creep: 0.03%F.S./30min
Input End: Red+ (power), Black-(power)
Output End: Green+(signal), White-(signal)
Recommended operating voltage: 3 ~ 12 VDC
Maximum operating voltage: 15 VDC
Input Impedance: 1115±10%Ω
Output Impedance: 1000±10%Ω
Protection class: IP65
Total Size: approx. 3.15 x0.50 x 0.50 inch
Cable: 0.8 x 20 cm (diameter x length)
Material: Aluminum Alloy
Weight: 30g

HX711 で読んでみる (Arduino)

手に入れたのは↑のようなモジュールです。適当に配線して読みます。

以下のライブラリを使ってみました。

README の通りにスケールを設定する必要があります。

#include <Arduino.h>
// https://github.com/bogde/HX711
#include "HX711.h"

const int DT_PIN = 2;
const int SCK_PIN = 3;

HX711 scale;

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

	Serial.print("read:");
	Serial.println(scale.read());

	scale.set_scale();
	scale.tare();

	Serial.print("calibrating...");
	delay(5000);
	Serial.println(scale.get_units(10));

	scale.set_scale(-1536.00);
	scale.tare();

	Serial.print("read (calibrated):");
	Serial.println(scale.get_units(10));
}


void loop() {
	Serial.println(scale.get_units(10), 1);

	scale.power_down();
	delay(500);
	scale.power_up();
}

このようなコードを書いて、

  1. 何ものせずに起動
  2. calibrating... が表示されたらすかさず1円玉を1枚載せる (1g)
  3. 値を読む
  4. scale.set_scale(...); に値を埋めこむ

という方法をとりました。

どんな感じか

こんな感じで値が読めました。1円玉を1つずつ増やして5枚まで載せてみました。

ref.

  1. トップ
  2. tech
  3. 歪みゲージ(ロードセル)と HX711 を使って重量計測する (Arduino)

同級生との飲み会で若干ハメをはずして飲みすぎて久しぶりに激しい二日酔いになってしまった。二日酔いになるたびに二日酔いをすみやかに解消する方法を調べてるけど、結局ないってことはわかっている。

必要なのは時間と水分(分解に必要)なので、スポーツドリンクをこまめに飲みつつ、梅干し純を舐めて、身体をあたためつつ布団で寝ていた。

アサヒグループ食品 梅ぼし純 24粒×10個 - アサヒグループ食品

アサヒグループ食品

5.0 / 5.0

梅干し純は気持ち悪いのが軽減されるうえに塩分が得られる。スポーツドリンクにも塩は入っているけど、少なめになっているらしいので、ちょっと追加するのがちょうどいいのではないかという狙い。

MH-Z19 の個体差とキャリブレーションの必要性 | tech - 氾濫原 というのを書きましたが、とりあえず 400ppm 環境は比較的簡単に作れるのだから、それでキャリブレーションしてみることにしました。

その過程でこのセンサの「ゼロキャリブレーション」について誤解していたことがわかりました。 MH-Z19 という格安 CO2 センサを読んでみた | tech - 氾濫原 に追記してありますが、ここでいう「ゼロ」は 400ppm 環境のことであるらしく、0ppm の環境は必要ありませんでした。また「スパンキャリブレーション」は最低でも1000ppm以上、2000ppm以上推奨とのことでした。MH-Z19 のドキュメントではなく MH-Z19B のドキュメントのほうが詳しく書いてあり、こちらを参考にしました。

スパンキャリブレーションはそのような特定環境をつくるのが難しいので、今回は「ゼロキャリブレーション」だけを行ってグラフにしばらく投稿してみました。

ゼロキャリブレーションの方法

窓をあけて換気扇をつけ、周辺環境をできるだけ400ppmに近付けます。最低でも30分ぐらいは換気します。室内であっても十分に換気ができていれば400ppm前後にはできるので、気をつけるのは息を吹きかけないようにする (自分が風上にいないこと) ぐらいです。人間の呼気中の CO2 は 4% (40000ppm) ぐらいなので、普通に影響します。

センサはシリアル経由で繋ぎました。起動に数分時間がかかるので放っておきます。

以下のスクリプトを実行します。

https://github.com/cho45/ruby-mh-z19/blob/master/examples/cal.rb

短いのでコピペすると

#!/usr/bin/env ruby

$LOAD_PATH << "#{File.dirname(__FILE__)}/../lib"

require 'mh-z19'

co2 = MH_Z19::Serial.new(ENV['PORT'])
# wait sensor startup
loop do
	detail =  co2.read_concentration_detail
	p detail
	case detail[:status]
	when 0
		p "booting"
	when 1
		p "startup"
	when 64
		break
	end
	sleep 1
end

co2.calibrate_zero_point

sleep 3

p co2.read_concentration_detail

こんな感じになります。この MH-Z19 はドキュメントに書いてないのですが、ステータスビットや認識している温度も返すようで、read_concentration_detail だとそれらもとれるような実装にしてあります。

グラフ

例によって1日ぐらい放置してみました。スパンキャリブレーションしていないので、やはり最大値に差があります。とはいえ 100〜200ppm 以内には入ってる感じなので、実用的にはとりあえず十分かもしれません。いずれにせよ何もしない場合よりは遥かにマシなので、必ずやったほうがよさそうです。

  1. トップ
  2. tech
  3. MH-Z19 のゼロキャリブレーションをしてみる