Avance.Lab

実験

第3回 IoTを活用した社内備品管理システムを作る / 実際に重量測定してみる

公開日:2024.05.24 更新日:2024.09.27

tag: IoTクラウド組み込み

こんにちは。Matsuです。
社内備品管理システム、前回はユースケースのお話をしました。
ところで、当初「備品を重量で管理しよう!」と言いましたが、そもそも重量で管理するにはそれなりの精度で重量の測定ができなければいけません。今回は実際に重量計とマイコンを使って重量の測定を試してみましょう。

マイコンで重量を測ってみる

重量計のモジュールはこちらにしました。5Kgのロードセル(金属の棒状の重量計本体)とAD変換モジュールHX711(緑の基板)、さらに上下のアクリル板までセットになっているものなので、お試しで使ってみるにはお手頃なセットです。

ロードセル + AD変換モジュールのセット

上の画像のように、ロードセル(金属棒)の上側は左のみが上のアクリル板に、下側は右のみが下のアクリル板にネジ止めされています。金属棒の中央には∞の形に穴があけられ、上と右に歪みゲージがついています。上のアクリル板に物を乗せると、重みで金属棒が歪み、その歪みを測定して重量を測る仕組みです。

緑色の基板はHX711というAD変換モジュールです。これがロードセルのセンサーから送られたアナログ値をデジタル値に変換してくれます。

これに、今回はArduino UNO R4 WiFiを組み合わせて動作させてみます。

Arduino UNO R4 WiFi

全体はこんな感じになります。

全体像

配線図

HX711とArduino間の配線は以下のようになります。

配線図

Arduinoのプログラム

プログラム作成の準備

それでは、Arduinoのプログラムを作っていきます。
Arduinoの開発環境はArduino IDEを使いますが、細かい手順は割愛させていただきます。

Arduino UNO R4 WiFiを使いますので、Arduino IDのボードマネージャからArduino UNO R4 WiFi Boards を追加。
さらに、HX711のライブラリを追加します。
実際の手順は検索すればいろいろ見つかるかなと思います。

プログラム

以下が今回作成したプログラムです。

#include <Arduino.h>
#include "HX711.h"

const int DT_PIN = 2;
const int SCK_PIN = 3;
const float SCALE1_PARAM = 414.93; // キャリブレーションで算出した値を入れる

HX711 scale1;

void setup() {
  Serial.begin(9600);
  Serial.println("START");
  scale1.begin(DT_PIN, SCK_PIN);

// キャリブレーションする場合は以下ブロックを有効にする
#if 0
  scale1.set_scale();
  scale1.tare();

  Serial.print("calibrating...");
  delay(5000);
// キャリブレーションする場合、5秒間のうちに物を乗せる
  Serial.println(scale1.get_units(10));
// ここの数値を乗せた物の重量で割った値をSCALE1_PARAMに入れる
#endif

  // キャリブレーション値設定
  scale1.set_scale(SCALE1_PARAM);
  // 0リセット
  scale1.tare(); 

}

void loop() {
  String weight = String(scale1.get_units(10)) + "g";
  Serial.println(weight);

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

測定した重量はとりあえずシリアルで出力することにしました。出力された重量はArduino IDEのシリアルモニタで確認できます。シリアルモニタのボーレートを9600baudに変更するのを忘れないようにしましょう。

プログラムを動かすと、こんな感じで0.5秒ごとに次々と重量が表示されます。
でも、最初はめちゃくちゃな重量が表示されているはずです。

ロードセルのキャリブレーション

めちゃくちゃな重量が表示されていたのは、ロードセルごとに特性が異なるため、それに併せた補正値を設定する必要があるためです。
補正値を設定する作業を一般的にキャリブレーションといいます。今回のプログラムでキャリブレーションする場合は、プログラム中 #if 0 を #if 1 に変更してArduinoに書き込みます。書込後に起動し、シリアルモニタに”calibrating…”が表示されている5秒間のうちに、重量計に何か物を乗せます。

今回はスマートフォン(約229g)を使います。

スマートフォン 約229g

ここから、Arduino IDEのシリアルモニタを見ていきます。

“calibrating…”の右に 95020.22 という値が表示されていますね。これがロードセルから出力された生の値です。ここで、「”calibrating…”の右に表示される値」 / 「乗せた物の重量(g)」を計算して出た値をSCALE1_PARAM設定します。

今回は、95020.00 / 228.9(g) ≒ 415.11 とします。

SCALE1_PARAMを修正したらもういちどプログラムを書込みます。
このとき併せて #if 1 を #if 0 に戻します。

プログラム書込後、スマートフォンを乗せる

起動後にスマートフォンを乗せると、ちゃんとそれらしい重量がとれるようになりました。
(※物を乗せたまま起動すると正しく値が表示されません。起動時は上に物が無いようにしましょう。)

228.9gからは多少誤差が出ていますのでもう少し調整が必要そうですが、とりあえずは実用になりそうな感じです。今回5Kgのロードセルを使いましたが、測定するたび±1gくらいは値が揺れるようですね。Amazonの商品ページにも精度1グラムとありましたので、だいたい仕様通りかなと思います。

許容重量の少ないロードセルのほうが制度が高いようなので、測定する対象によってロードセルの選定も必要になりそうです。

というわけで、無事に重量の測定ができることが確認できましたので、引き続き備品管理システムの作成を進めていきたいと思います。

Matsu

最近ガレージをつくってDIYにハマってしまう。
無限に欲しくなる電動工具が怖い。

関連記事