ひずみゲージ奮闘記 – 改良・拡張編(Round4)

電子工作
全体回路図

はじめに

 今回は、前回のまとめで残る課題としてご紹介した、温度補償複数ゲージの同時計測について取り組んでいきたいと思います。これまではブレッドボードで試作を進めてきましたが、動作確認が無事できたということでユニバーサル基盤にまとめてみました。機会があれば次はプリント基板にチャレンジしてみたいですね。それでは、今回も宜しくお願いします。

ブレッドボード ➡ ユニバーサル基盤

 はじめに見せちゃいますが、こんな感じでまとめてみました。裏側は汚すぎたので薄いモザイクを掛けさせていただきました。慣れている人は見えるかもしれませんね。

ユニバ表
ユニバ裏

 ユニバーサル基盤からはみ出ている部分はご愛嬌ということで。(ちょうど良いサイズの基盤が家に落ちていませんでした。)

 では、もう少し構成について触れていきましょう。

For 複数同時計測

Arduino接続
めっちゃマン
めっちゃマン

オシャレ靴の構図やな

 Arduinoとの接続はこんな感じです。Arduinoにはデジタル通信の入出力ポートがいっぱいあるので、そこにHX711の信号線を接続しています。もうお分かりの通り、この基盤は上下左右の4ブロックに分かれており、そのうちの1ブロックが今までブレッドボードで検討を進めていたものと等価な回路になっています。電源とグラウンドは共通化しているので、左上のHX711のみに接続しています。そんで、上下にある青いターミナルブロックにひずみゲージの信号線をそれぞれ接続します。

For 温度補償

 勘のいいガキは気が付いたかもしれませんが、先ほどのターミナルブロックのポート数(12)とひずみゲージの信号線の数(4×2=8)が合っていません。これが温度補償のポイントになります。

前回までは1箇所に1つのひずみゲージで計測していますが、温度補償のために1箇所に2つのひずみゲージを使用して計測します。

何言ってんだこいつ、って方はこちら↓をご参照ください。

https://www.keyence.co.jp/ss/products/recorder/lab/strain/straingage.jsp

ちなみに、前回までのがこちら↓。
(何も分かってなかったので一番ベーシックなものでやってました。)

https://www.keyence.co.jp/ss/products/recorder/lab/strain/straingage.jsp

さて、どうやって12個のポートに16本の信号線を接続するか(3個のポートに4本の信号線を接続するか)、ということですが、

←の●と×のポートにそれぞれ(2つ)のひずみゲージのリード線を接続します。(●×2つが書いてあるポートに2本のリード線が接続される形です。)

詳しくはこの後の回路図をご参照ください。電気初心者なので書き方とか間違ってたらごめんなさい。教えてください。

回路図

 全体の回路図がこちら。

全体回路図

Arduino コード

 Arduinoのコードは、以下のサイトを参考にして試作のコードを修正しました。

Separating data from multiple HX711 load cell amplifiers
Hello everyone! I'm working on a project, where its needed to recieve measurments from multiple (3) load cells attached ...

そんで、修正したコードがこちらです。Pythonコードは試作のものと同様です。

/**
 *
 * HX711 library for Arduino - example file
 * https://github.com/bogde/HX711
 *
 * MIT License
 * (c) 2018 Bogdan Necula
 *
 *ひずみゲージ(L3M2R)、複数ゲージ用に修正、2024
**/
#include "HX711.h"


// HX711 circuit wiring
const int LOADCELL_DOUT_PIN_2 = 2;
const int LOADCELL_SCK_PIN_3 = 3;
const int LOADCELL_DOUT_PIN_4 = 4;
const int LOADCELL_SCK_PIN_5 = 5;
const int LOADCELL_DOUT_PIN_6 = 6;
const int LOADCELL_SCK_PIN_7 = 7;
const int LOADCELL_DOUT_PIN_8 = 8;
const int LOADCELL_SCK_PIN_9 = 9;

HX711 scale1;
HX711 scale2;
HX711 scale3;
HX711 scale4;

void setup() {
  Serial.begin(38400);
  Serial.println("HX711 Demo");
  Serial.println("Initializing the scale");

  // Initialize library with data output pin, clock input pin and gain factor.
  // Channel selection is made by passing the appropriate gain:
  // - With a gain factor of 64 or 128, channel A is selected
  // - With a gain factor of 32, channel B is selected
  // By omitting the gain factor parameter, the library
  // default "128" (Channel A) is used here.
  scale1.begin(LOADCELL_DOUT_PIN_2, LOADCELL_SCK_PIN_3);
  scale2.begin(LOADCELL_DOUT_PIN_4, LOADCELL_SCK_PIN_5);
  scale3.begin(LOADCELL_DOUT_PIN_6, LOADCELL_SCK_PIN_7);
  scale4.begin(LOADCELL_DOUT_PIN_8, LOADCELL_SCK_PIN_9);

  Serial.println("Before setting up the scale:");
  Serial.println("read:");
  Serial.println(scale1.read()); // print a raw reading from the ADC
  Serial.println(scale2.read());
  Serial.println(scale3.read());
  Serial.println(scale4.read());

  Serial.println("read average:");
  Serial.println(scale1.read_average(100));  // print the average of 20 readings from the ADC
  Serial.println(scale2.read_average(100));
  Serial.println(scale3.read_average(100));
  Serial.println(scale4.read_average(100));
  
  Serial.println("get value:");
  Serial.println(scale1.get_value(20));	 // print the average of 5 readings from the ADC minus the tare weight (not set yet)
  Serial.println(scale2.get_value(20));
  Serial.println(scale3.get_value(20));
  Serial.println(scale4.get_value(20));

  Serial.println("get units:");
  Serial.println(scale1.get_units(20), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided
  Serial.println(scale2.get_units(20), 1);
  Serial.println(scale3.get_units(20), 1);
  Serial.println(scale4.get_units(20), 1);

  scale1.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README for details
  scale1.tare(); // reset the scale to 0
  scale2.set_scale(2280.f);
  scale2.tare();
  scale3.set_scale(2280.f);
  scale3.tare();
  scale4.set_scale(2280.f);
  scale4.tare();

  Serial.println("After setting up the scale:");
  Serial.println("read:");
  Serial.println(scale1.read()); // print a raw reading from the ADC
  Serial.println(scale2.read()); 
  Serial.println(scale3.read()); 
  Serial.println(scale4.read()); 

  Serial.println("read average:");
  Serial.println(scale1.read_average(100)); // print the average of 20 readings from the ADC
  Serial.println(scale2.read_average(100));
  Serial.println(scale3.read_average(100));
  Serial.println(scale4.read_average(100));

  Serial.println("get value:");
  Serial.println(scale1.get_value(20));	 // print the average of 5 readings from the ADC minus the tare weight, set with tare()
  Serial.println(scale2.get_value(20));
  Serial.println(scale3.get_value(20));
  Serial.println(scale4.get_value(20));

  Serial.println("get units:");
  Serial.println(scale1.get_units(20), 1);  // print the average of 5 readings from the ADC minus tare weight, divided
  Serial.println(scale2.get_units(20), 1);
  Serial.println(scale3.get_units(20), 1);
  Serial.println(scale4.get_units(20), 1);

  Serial.println("Readings(average(10)):");
}

void loop() {
  // Serial.print("one reading:\t");
  // Serial.print(scale.get_units(), 1);
  // Serial.print("\t| average:\t");
  Serial.print(scale1.get_units(10), 1);
  Serial.print(",");
  Serial.print(scale2.get_units(10), 1);
  Serial.print(",");
  Serial.print(scale3.get_units(10), 1);
  Serial.print(",");
  Serial.print(scale4.get_units(10), 1);
  Serial.println();
}

まとめ

 今回は今まで試作を進めてきたものの集大成として、ブレッドボードからユニバーサル基盤に整理しながら複数計測と温度補償の機能を追加しました。次回はいよいよ、本丸の計測対象に対して使ってみた結果を報告したいと思います。(何も報告がなければ、そういうことなので、そっとしておいてあげてください。)

では、今回も最後まで読んでいただきありがとうございました。また次回もよろしくお願いします。

コメント