Giao tiếp cảm biến Loadcell và HX711 với Arduino

Giao tiếp cảm biến Loadcell và HX711 với Arduino

Trong hướng dẫn lần này, bạn sẽ tìm hiểu cách tạo một cân điện tử với Arduino sử dụng cảm biến Loadcell và mạch chuyển đổi ADC HX711. Đầu tiên, bạn sẽ học cách kết nối cảm biến Load cell và mạch chuyển đổi ADC HX711 với Arduino để xây dựng một cân điện tử. Qua bài viết, các bạn sẽ học cách hiệu chỉnh cân với một ví dụ đơn giản để đo trọng lượng của các đồ vật.

Cảm biến Loadcell là gì?

Cảm biến trọng lượng (Loadcell) là một loại cảm biến được sử dụng để đo trọng lượng hoặc lực tác động lên một đối tượng. Nó chuyển đổi lực vào một tín hiệu điện tương ứng, cho phép đo trọng lượng với độ chính xác cao.

Cảm biến Loadcell thường được thiết kế dưới dạng một cấu trúc cơ học, bao gồm một thanh kim loại hoặc một bề mặt phẳng có khả năng chịu tải. Khi một lực tác động lên cảm biến, nó gây ra biến dạng hoặc uốn cong trong cấu trúc đó. Điều này dẫn đến thay đổi về điện trở trong cảm biến, và thay đổi này được chuyển đổi thành tín hiệu điện tương ứng.

Xem ngay: Chế tạo cân điện tử bằng cảm biến trọng lượng (Loadcell) với Arduino

Cảm biến Loadcell thường sử dụng các yếu tố cảm biến như strain gauge (cảm biến đo biến dạng) để đo sự biến dạng cơ học trong cấu trúc của nó. Strain gauge là một thành phần điện tử nhạy cảm với biến dạng và thay đổi điện trở khi có lực tác động lên nó. Thông qua sự thay đổi điện trở trong strain gauge, cảm biến Load cell có thể xác định trọng lượng hoặc lực tác động.

Các cảm biến Loadcell được sử dụng rộng rãi trong các ứng dụng đo lường trọng lượng và kiểm soát lực tác động, chẳng hạn như trong các thiết bị cân điện tử, thiết bị kiểm tra tải trọng, thiết bị kiểm tra mô-men xoắn và nhiều ứng dụng công nghiệp khác. Có nhiều loại cảm biến Load cell khác nhau, từ các loại nhỏ dùng trong thiết bị cầm tay đến các loại lớn dùng trong các hệ thống công nghiệp.

Sơ đồ chân cảm biến Loadcell

  • E+ và E- là chân nguồn điện. Chân E+ kết nối với nguồn điện dương, và chân E- kết nối với nguồn điện âm.
  • A+ và A- là chân đầu ra của cảm biến. Chân A+ mang tín hiệu đầu ra dương, và chân A- mang tín hiệu đầu ra âm.

Mạch chuyển đổi ADC 24bit Loadcell HX711

Mạch chuyển đổi ADC HX711 là một module được sử dụng để đọc giá trị từ cảm biến trọng lượng (Loadcell) và chuyển đổi nó thành tín hiệu số. HX711 được thiết kế đặc biệt để làm việc với các cảm biến Loadcell, giúp đo trọng lượng và lực tác động.

Mạch HX711 bao gồm các chân kết nối: GND (chân nối đất), DT (chân dữ liệu), SCK (chân clock), và VCC (chân nguồn). Chân DT và SCK được sử dụng để truyền dữ liệu từ HX711 tới Arduino, trong khi chân VCC và GND cung cấp nguồn cho module.

Mạch HX711 sử dụng nguyên lý chuyển đổi ADC để đọc giá trị từ cảm biến Loadcell. Nó tạo ra các xung clock để đồng bộ hóa dữ liệu từ cảm biến và sau đó chuyển đổi nó thành dạng số mà vi điều khiển có thể đọc được. Module cung cấp các chức năng chính như chuyển đổi tín hiệu analog thành digital, điều chỉnh độ nhạy (gain) và tỷ lệ trọng lượng (calibration).

Chế tạo cân điện tử bằng cảm biến Loadcell đơn giản

Để chế tạo cân điện tử bằng cảm biến Loadcell mình sẽ sử dụng hai tấm nhựa mica và một số ốc vít để lắp đặt một bộ cân điện tử. Các bạn có thể sử dụng tấm gỗ hoặc nhựa in 3D cho dự án của mình.

Bạn nên gắn các tấm vào cảm biến Load cell sao cho tạo ra lực căng giữa hai đầu đối diện của thanh kim loại. Tấm dưới giữ cảm biến, và tấm trên là nơi bạn đặt các vật để cân.

Hình dưới đây là cách lắp đặt cân điện tử của mình.

Các linh kiện cần thiết cho dự án

TÊN LINH KIỆN SỐ LƯỢNG NƠI BÁN
Arduino Uno R3 1 Shopee | Cytron
Cảm biến trọng lượng Loadcell 5kg 1 Shopee | Cytron
Mạch chuyển đổi ADC 24-bit LoadCell HX711 1 Shopee | Cytron
Dây cắm 10-20 Shopee | Cytron
Breadboard 1 Shopee | Cytron

Sơ đồ đấu nối cảm biến trọng lượng Loadcell và mạch chuyển đổi HX711 với Arduino

Load Cell HX711 HX711 Arduino
Red (E+) E+ GND GND
Black (E-) E- DT Pin 2
White (A-) A- SCK Pin 3
Green (A+) A+ VCC 5V

Cài đặt thư viện HX711

Khởi động phần mềm Arduino IDE và truy cập vào đường dẫn như sau: Sketch Include Library > Manage Libraries

Nhập vào ô tìm kiếm “HX711 Arduino Library” và tìm đến thư viện của tác giả Bogdan Necula, chọn phiên bản mới nhất và tiến hành cài đặt.

Hiệu chỉnh thang đo

Trước khi đo trọng lượng của các đồ vật, bạn cần hiệu chỉnh cảm biến Loadcell bằng cách lấy được hệ số hiệu chuẩn. Hệ số hiệu chuẩn của mỗi cảm biến sẽ khác nhau, vì vậy bạn không nên bỏ qua phần này.

  • Chuẩn bị một đồ vật đã biết nặng bao nhiêu gram.
  • Tiến hành nạp code vào board Arduino theo chương trình bên dưới.
// Calibrating the load cell
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

HX711 scale;

void setup() {
  Serial.begin(57600);
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
}

void loop() {

  if (scale.is_ready()) {
    scale.set_scale();
    Serial.println("Tare... remove any weights from the scale.");
    delay(5000);
    scale.tare();
    Serial.println("Tare done...");
    Serial.print("Place a known weight on the scale...");
    delay(5000);
    long reading = scale.get_units(10);
    Serial.print("Result: ");
    Serial.println(reading);
  } else {
    Serial.println("HX711 not found.");
  }
  delay(1000);
}

//calibration factor will be the (reading)/(known weight)
  • Mở Serial Monitor và chọn tốc độ baud là 57600, sau đó nhấn nút RESET trên bo mạch Arduino.
  • Làm theo hướng dẫn trên Serial: bỏ bất kỳ vật nặng nào khỏi cân (nó sẽ tự động hiệu chuẩn). Sau đó, đặt một đồ vật có trọng lượng đã biết lên cân và đợi cho đến khi bạn nhận được một giá trị.
  • Tính hệ số hiệu chuẩn của bạn bằng cách sử dụng công thức:
calibration factor = (reading)/(known weight)

Trong trường hợp của mình, giá trị đọc là -49171. Trọng lượng đã biết là 107g, vì vậy hệ số hiệu chuẩn của mình sẽ là: -49171/107 = -459.542.

Lưu lại hệ số hiệu chuẩn của bạn để sử dụng cho chương trình bên dưới.

Code cảm biến Loadcell

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

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

HX711 scale;

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

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());  // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));  // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));  // print the average of 5 readings from the ADC minus the tare weight (not set yet)

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight (not set) divided
                                          // by the SCALE parameter (not set yet)

  scale.set_scale(-459.542);
  //scale.set_scale(-471.497);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();  // reset the scale to 0

  Serial.println("After setting up the scale:");

  Serial.print("read: \t\t");
  Serial.println(scale.read());  // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));  // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));  // print the average of 5 readings from the ADC minus the tare weight, set with tare()

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight, divided
                                          // by the SCALE parameter set with set_scale

  Serial.println("Readings:");
}

void loop() {
  Serial.print("one reading:\t");
  Serial.print(scale.get_units(), 1);
  Serial.print("\t| average:\t");
  Serial.println(scale.get_units(10), 5);

  delay(5000);
}

Giải thích Code

Khởi tạo thư viện HX711 trên Arduino để đọc giá trị từ cảm biến Loadcell.

#include <Arduino.h>
#include "HX711.h"
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

Tiếp theo, định nghĩa các chân kết nối của mạch HX711 với Arduino thông qua các biến LOADCELL_DOUT_PINLOADCELL_SCK_PIN. Trong ví dụ này, chân DOUT của HX711 được kết nối với chân 2 của Arduino, và chân SCK được kết nối với chân 3 của Arduino.

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

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());  // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));  // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));  // print the average of 5 readings from the ADC minus the tare weight (not set yet)

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight (not set) divided
                                          // by the SCALE parameter (not set yet)

  scale.set_scale(-459.542);
  //scale.set_scale(-471.497);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();  // reset the scale to 0

  Serial.println("After setting up the scale:");

  Serial.print("read: \t\t");
  Serial.println(scale.read());  // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));  // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));  // print the average of 5 readings from the ADC minus the tare weight, set with tare()

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight, divided
                                          // by the SCALE parameter set with set_scale

  Serial.println("Readings:");
}

Trong hàm setup(), chúng ta khởi tạo kết nối Serial để giao tiếp với máy tính thông qua cổng nối tiếp (baud rate là 57600). Sau đó, chúng ta khởi tạo đối tượng scale từ lớp HX711 và sử dụng phương thức begin() để thiết lập chân kết nối của HX711 với Arduino.

Sau đó, chúng ta thực hiện một loạt các thao tác để hiệu chuẩn và đọc giá trị từ cảm biến Loadcell.

  • In ra thông báo để biết trạng thái hiện tại của cân (Serial.println("Before setting up the scale:")).
  • Sử dụng các phương thức như scale.read(), scale.read_average(), scale.get_value()scale.get_units() để đọc giá trị từ Loadcell arduino và in ra thông qua Serial Monitor. Các giá trị này được tính toán dựa trên số lần đọc (lần lượt là 20 và 5 lần).
  • Sử dụng phương thức scale.set_scale() để thiết lập tỷ lệ chuyển đổi cho Loadcell cân điện tử. Trong ví dụ này, giá trị tỷ lệ được đặt là -459.542.
  • Sử dụng phương thức scale.tare() để thiết lập lại cân bằng 0.

Tiếp tục in ra thông tin về trạng thái hiện tại của cân sau khi hiệu chuẩn (Serial.println(“After setting up the scale:”)).

Sau đó, trong hàm loop(), lặp lại quá trình đọc giá trị từ cảm biến và in ra thông qua Serial Monitor. Delay 5000ms được sử dụng để chờ 5 giây trước khi lặp lại việc đọc giá trị tiếp theo.

Bài viết liên quan

Subscribe
Notify of
guest

1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
CUONG

I CAN’T USE HX711