ویژگی های سنسور وزن GML692
لود سل ها حسگر هایی الکترونیکی هستند که برای اندازه گیری وزن و نیرو مورد استفاده قرار می گیرند. ساختار یک لود سل از بدنه ی آلیاژی و تعدادی مقاومت کششی است که با اعمال نیرو تغییر مقدار میدهند و با برداشتن نیرو، دوباره به مقدار اولیه ی خود باز میگردند. ظرفیت یک لود سل حداکثر میزان نیروی قابل تحمل برای آن است.
نکته 1
برای اندازه گیری تغییرات مقاومت کششی از ماژول HX711 استفاده می کنیم که یک مبدل آنالوگ به دیجیتال با دقت بالا می باشد. این ماژول از ارتباط I2C استفاده نمی کند.
نکته 2
برای راه اندازی این سنسور نیازمند استفاده از حداقل 2 یا 4 عدد از این سنسور ها هستیم و یا اینکه می توانیم از 2 عدد مقاومت 1 کیلو اهم برای کامل کردن پل وتسون استفاده کنیم.
جهت دریافت دیتاشیت ماژول وزن GML692 اینجا کلیک کنید.
GML692 Load Cell Sensor Datasheet
معرفی پایه ها (Pinout) سنسور وزن GML692
سنسور GML692 دارای 3 پایه به شرح زیر است:
- VIN: تغذیه ماژول –5 ولت
- GND: زمین
- OUT: خروجی ماژول به صورت دیجیتال
پین اوت (Pinout) این سنسور را می توانید در تصویر زیر مشاهده کنید.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
راه اندازی سنسور وزن GML692 با آردوینو
گام اول: سیم بندی
مطابق مدار زیر، سنسور را به آردوینو وصل کنید.
توجه
سیم سیاه سنسور اول به سیم سفید سنسور دوم و بالعکس متصل شود.
گام دوم: نصب کتابخانه
ابتدا کتابخانه زیر را بر آردوینوی خود نصب کنید.
توجه
اگر نیاز به راهنمایی بیشتر برای نصب کتابخانه بر روی آردوینو دارید، می توانید به آموزش نصب کتابخانه بر آردوینو مراجعه کنید.
گام سوم: کد
کد زیر را روی برد آردوینوی خود آپلود کنید.
/*
modified on Sep 21, 2020
Modified by MohammedDamirchi from https://github.com/sparkfun/HX711-Load-Cell-Amplifier base on https://circuitjournal.com/50kg-load-cells-with-HX711
Home
*/
/*
This example file shows how to calibrate the load cell and optionally store the calibration
value in EEPROM, and also how to change the value manually.
The result value can then later be included in your project sketch or fetched from EEPROM.
To implement calibration in your project sketch the simplified procedure is as follow:
LoadCell.tare();
//place known mass
LoadCell.refreshDataSet();
float newCalibrationValue = LoadCell.getNewCalibration(known_mass);
*/
#include <HX711_ADC.h>
#include <EEPROM.h>
//pins:
const int HX711_dout = 3; //mcu > HX711 dout pin
const int HX711_sck = 2; //mcu > HX711 sck pin
//HX711 constructor:
HX711_ADC LoadCell(HX711_dout, HX711_sck);
const int calVal_eepromAdress = 0;
long t;
void setup() {
Serial.begin(57600); delay(10);
Serial.println();
Serial.println("Starting...");
LoadCell.begin();
long stabilizingtime = 2000; // preciscion right after power-up can be improved by adding a few seconds of stabilizing time
boolean _tare = false; //set this to false if you don't want tare to be performed in the next step
LoadCell.start(stabilizingtime, _tare);
if (LoadCell.getTareTimeoutFlag() || LoadCell.getSignalTimeoutFlag()) {
Serial.println("Timeout, check MCU>HX711 wiring and pin designations");
while (1);
}
else {
LoadCell.setCalFactor(1.0); // user set calibration value (float), initial value 1.0 may be used for this sketch
Serial.println("Startup is complete");
}
while (!LoadCell.update());
calibrate(); //start calibration procedure
}
void loop() {
static boolean newDataReady = 0;
const int serialPrintInterval = 0; //increase value to slow down serial print activity
// check for new data/start next conversion:
if (LoadCell.update()) newDataReady = true;
// get smoothed value from the dataset:
if (newDataReady) {
if (millis() > t + serialPrintInterval) {
float i = LoadCell.getData();
Serial.print("Load_cell output val: ");
Serial.println(i);
newDataReady = 0;
t = millis();
}
}
// receive command from serial terminal
if (Serial.available() > 0) {
float i;
char inByte = Serial.read();
if (inByte == 't') LoadCell.tareNoDelay(); //tare
else if (inByte == 'r') calibrate(); //calibrate
else if (inByte == 'c') changeSavedCalFactor(); //edit calibration value manually
}
// check if last tare operation is complete
if (LoadCell.getTareStatus() == true) {
Serial.println("Tare complete");
}
}
void calibrate() {
Serial.println("***");
Serial.println("Start calibration:");
Serial.println("Place the load cell an a level stable surface.");
Serial.println("Remove any load applied to the load cell.");
Serial.println("Send 't' from serial monitor to set the tare offset.");
boolean _resume = false;
while (_resume == false) {
LoadCell.update();
if (Serial.available() > 0) {
if (Serial.available() > 0) {
float i;
char inByte = Serial.read();
if (inByte == 't') LoadCell.tareNoDelay();
}
}
if (LoadCell.getTareStatus() == true) {
Serial.println("Tare complete");
_resume = true;
}
}
Serial.println("Now, place your known mass on the loadcell.");
Serial.println("Then send the weight of this mass (i.e. 100.0) from serial monitor.");
float known_mass = 0;
_resume = false;
while (_resume == false) {
LoadCell.update();
if (Serial.available() > 0) {
known_mass = Serial.parseFloat();
if (known_mass != 0) {
Serial.print("Known mass is: ");
Serial.println(known_mass);
_resume = true;
}
}
}
LoadCell.refreshDataSet(); //refresh the dataset to be sure that the known mass is measured correct
float newCalibrationValue = LoadCell.getNewCalibration(known_mass); //get the new calibration value
Serial.print("New calibration value has been set to: ");
Serial.print(newCalibrationValue);
Serial.println(", use this as calibration value (calFactor) in your project sketch.");
Serial.print("Save this value to EEPROM adress ");
Serial.print(calVal_eepromAdress);
Serial.println("? y/n");
_resume = false;
while (_resume == false) {
if (Serial.available() > 0) {
char inByte = Serial.read();
if (inByte == 'y') {
#if defined(ESP8266)|| defined(ESP32)
EEPROM.begin(512);
#endif
EEPROM.put(calVal_eepromAdress, newCalibrationValue);
#if defined(ESP8266)|| defined(ESP32)
EEPROM.commit();
#endif
EEPROM.get(calVal_eepromAdress, newCalibrationValue);
Serial.print("Value ");
Serial.print(newCalibrationValue);
Serial.print(" saved to EEPROM address: ");
Serial.println(calVal_eepromAdress);
_resume = true;
}
else if (inByte == 'n') {
Serial.println("Value not saved to EEPROM");
_resume = true;
}
}
}
Serial.println("End calibration");
Serial.println("***");
Serial.println("To re-calibrate, send 'r' from serial monitor.");
Serial.println("For manual edit of the calibration value, send 'c' from serial monitor.");
Serial.println("***");
}
void changeSavedCalFactor() {
float oldCalibrationValue = LoadCell.getCalFactor();
boolean _resume = false;
Serial.println("***");
Serial.print("Current value is: ");
Serial.println(oldCalibrationValue);
Serial.println("Now, send the new value from serial monitor, i.e. 696.0");
float newCalibrationValue;
while (_resume == false) {
if (Serial.available() > 0) {
newCalibrationValue = Serial.parseFloat();
if (newCalibrationValue != 0) {
Serial.print("New calibration value is: ");
Serial.println(newCalibrationValue);
LoadCell.setCalFactor(newCalibrationValue);
_resume = true;
}
}
}
_resume = false;
Serial.print("Save this value to EEPROM adress ");
Serial.print(calVal_eepromAdress);
Serial.println("? y/n");
while (_resume == false) {
if (Serial.available() > 0) {
char inByte = Serial.read();
if (inByte == 'y') {
#if defined(ESP8266)|| defined(ESP32)
EEPROM.begin(512);
#endif
EEPROM.put(calVal_eepromAdress, newCalibrationValue);
#if defined(ESP8266)|| defined(ESP32)
EEPROM.commit();
#endif
EEPROM.get(calVal_eepromAdress, newCalibrationValue);
Serial.print("Value ");
Serial.print(newCalibrationValue);
Serial.print(" saved to EEPROM address: ");
Serial.println(calVal_eepromAdress);
_resume = true;
}
else if (inByte == 'n') {
Serial.println("Value not saved to EEPROM");
_resume = true;
}
}
}
Serial.println("End change calibration value");
Serial.println("***");
}
پس از آپلود کد، نتیجه را می توانید در سریال مانیتور مشاهده کنید.
وزنه های روی ماژول را برداشته و حرف t را ارسال نمایید.
سپس یک وزنه با مقدار مشخص بر روی سنسور قرار داده و مقدار وزن آن را وارد نمایید.
حال ماژول آماده کار می باشد.
Comments (2)
سلام چنتا سوال داشتم ممنون میشم جواب بدین
اول این که خروجی این سنسور دیجیتاله و اگه وصل بشه به ماژول آنالوگ به دیجیتال HX711 آیا مشکلی پیش نمیاد؟
و سوال دوم اگر طبق دیتاشیت این سنسور وزن، چهار تا سنسور وزن رو به هم متصل بکنیم آیا میانگین وزنی را به ما میدهد؟ چون سیم ها خیلی پیچیده به هم وصل شده است آیا واقعا به این صورت کار میکند؟
و سوال آخر اینکه دقت این سنسور وزن چند گرم است ؟
با سلام
خروجی این سنسور ها دیجیتال نمی باشد و دقیقا آنالوگ می باشد اما چون تغییرات ولتاژ بسیار پایین دارند نیاز به ADC با دقت بالا می باشد که بتواند این تغییرات را اندازه گیری کند.
نحوه کار کرد این سنسور ها پل وتسون می باشد. از این رو برای اندازه گیری میزان تغییرات فشار مقاومت را اندازه گیری میکند تا به شما وزن را اعلام کند.
دقت سنسور به حداکثر میزان اندازه گیری سنسور برمیگردد.
این مدل 50 کیلویی میباشد و وقتی شما 4 عدد استفاده کنید میتواند تا 200 کیلو را برای شما اندازه گیری کند. دقت اندازه گیری نیز در حدود 0.5 کیلو فکر میکنم باشد (تا جایی که یادم میاد امکان دارد بیشتر نیز به شما دقت بدهد)