Belka tensometryczna – najłatwiejszy sposób na budowę wagi z Arduino

Czujniki nacisku są popularnymi sensorami na rynku, dzięki nim możemy zbadać wagę konkretnego przedmiotu. Dzisiaj zajmiemy się właśnie czujnikiem nacisku. Mimo, że sensorów tego typu na rynku jest kilka my wybierzemy belkę tensometryczną, ze względu na niską cenę i dużą popularność. Czym właściwie jest belka tensometryczna? Jest to prosty w budowie i działaniu czujnik który zmienia swoją oporność w zależności od tego jak duży nacisk wywieramy na niego.

Podłączenie sensora do Arduino

Podłączenie sensora do płytki uruchomieniowej jest proste, jednak nie możemy zrobić tego bezpośrednio. Potrzebny nam będzie wzmacniacz operacyjny do belek tensometrycznych, my użyjemy modelu HX711. HX711 jest układem dwu kanałowym, więc możemy podłączyć do niego nawet dwa sensory i jednocześnie pobierać z nich dane.

Dodatkowym atutem wzmacniacza jest stabilizator napięcia dzięki któremu możemy zasilać układ napięciem 3.3V lub 5V. Do budowy układu oprócz belki tensometrycznej oraz wzmacniacza będziemy potrzebowali jeszcze płytki Arduino UNO, dwóch rezystorów 1kOhm, kilkunastu przewodów do płytek stykowych oraz samą płytkę. Do pinów HX711 które są na dole łączymy następujące przewody od lewej strony – VCC, pin 6 Arduino, pin 5 Arduino, GND. Jeśli chodzi o piny na górze, dwa od lewej strony zostawiamy niepodłączone, trzeci łączymy z VCC belki, czwarty z rezystorami zmostkowanymi na płytce stykowej, piąty do GND belki, szósty do pinu danych belki. Układ powinien wyglądać jak poniżej.

Kalibracja czujnika celem dokładnego pomiaru

Większość z czujników które podłączamy do Arduino nie wymaga kalibracji przez użytkownika, jednak tutaj jest nieco inaczej. Kalibracja nie jest trudna, bo ogranicza się do wgrania oprogramowania na płytkę Arduino oraz wyliczenia stałej korekty dla sensora.

Musimy pamiętać także o zależności temperaturowej, belki zazwyczaj pracują prawidłowo w temperaturach od -20 °C do 180 °C. Problem polega na tym, że wartości rezystancji belki zmienia się w zależności od temperatury. Jeśli Twoja waga ma działać w różnych temperaturach od tej, w której dokonałeś kalibracji, musisz to uwzględnić.

Jednak aby osiągnąć możliwie najmniejszy błąd pomiarowy belki tensometryczne mostkuje się i uśrednia podany wynik dla większej dokładności. Aby zmostkować dwie belki wystarczy podłączyć przewody o tych samych oznaczeniach do danych pinów, HX711 sam uśredni podane dane.

Ważną kwestią jest też bezpieczeństwo samego czujnika. Jak mówi nazwa jest to czujnik nacisku, więc aby otrzymać prawidłowy pomiar dwa elementy belki tensometrycznej powinny się zbliżać do siebie wskutek nacisku. Gdy części czujnika będą się od siebie oddalać może dojść do uszkodzenia sensora. Na rynku dostępne są belki tensometryczne o różnych kształtach, które można obciążać w inny sposób.

Do prawidłowej i prostej pracy przyda nam się biblioteka HX711 od firmy SparkFun. Jeśli zbudowaliśmy już układ przedstawiony i omówiony powyżej możemy przejść  do wgrania kodu który możemy znaleźć w bibliotece jako SparkFun_HX711_Calibration.h, lub skopiować poniżej. Jeśli nie kopiujemy kodu z okna poniżej to w programie musimy zmienić wartość linijki, z

Serial.print(" lb"); na Serial.print(" kg");. Przeliczeniem wartości zajmie się korekta calibration_factor.

#include "HX711.h"
#define DOUT  6
#define CLK  5
HX711 scale(DOUT, CLK);
float calibration_factor = -8000;
void setup() {
  Serial.begin(9600);
  Serial.println("HX711 calibration sketch");
  Serial.println("Remove all weight from scale");
  Serial.println("After readings begin, place known weight on scale");
  Serial.println("Press + or a to increase calibration factor");
  Serial.println("Press - or z to decrease calibration factor");
  scale.set_scale();
  scale.tare();	//Reset the scale to 0
  long zero_factor = scale.read_average(); //Get a baseline reading
  Serial.print("Zero factor: "); //This can be used to remove the need to tare the scale. Useful in permanent scale projects.
  Serial.println(zero_factor);}
  void loop() {
  scale.set_scale(calibration_factor); //Adjust to this calibration factor
  Serial.print("Reading: ");
  Serial.print(scale.get_units(), 1);
  Serial.print(" kg"); //Change this to kg and re-adjust the calibration factor if you follow SI units like a sane person
  Serial.print(" calibration_factor: ");
  Serial.print(calibration_factor);
  Serial.println();
  if(Serial.available())
  {char temp = Serial.read();
  if(temp == '+' || temp == 'a')
  calibration_factor += 10;
  else if(temp == '-' || temp == 'z')
  calibration_factor -= 10;}}

Po wgraniu musimy uruchomić Serial Monitor, na belkę położyć przedmiot o znanej nam wadze i wprowadzając odpowiednio + lub – w okno  dialogowe Serial Monitora i wcisnąć enter do czasu doprowadzenia do ukazania się właściwej wagi. W wynikach wagi pojawi się także liczba o nazwie “calibration_factor”. Zapiszą ją sobie, ponieważ jest to indywidualna korekta dla tego konkretnego czujnika.

Budowa wagi – podstawy tworzenia końcowego urządzenia

Po sprawdzeniu czy czujnik działa i skalibrowaniu go możemy przejść do budowy wagi. Do wyświetlania danych użyjemy wyświetlacza LCD 16×2, nasz model posiada przylutowany konwerter I2C, dzięki czemu połączenie ekranu z Arduino będzie dużo łatwiejsze. Cały układ musimy podłączyć jak poniżej, jedyne co się zmienia, to dodanie wyświetlacza. Schemat połączeń znajduje się poniżej.

Po podłączeniu wyświetlacza do poprzedniego układu zostało nam wgranie nowego programu który znajduje się poniżej.

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2); //określamy adres wyświetlacza i jego wielkość
#include "HX711.h"
#define DOUT  6 //pin do którego podłączone jest złącze DT
#define CLK  5 //pin do którego podłączone jest złącze SCK
HX711 scale(DOUT, CLK);
float calibration_factor = -8000; //korekta pomiarowa
void setup() {
lcd.init(); //uruchamiamy wyświetlacz
lcd.backlight(); //uruchamiamy podświetlenie wyświetlacza
}
void loop() {
lcd.clear();//wyczyszczenie wyświetlacza
lcd.setCursor(0,0);//ustawienie kursora
lcd.print("Waga wynosi:");
lcd.setCursor(0,1);
scale.set_scale(calibration_factor); //Zastosowanie korekty pomiarowej
lcd.print(scale.get_units(), 1);
lcd.setCursor(4,1);
lcd.print("kg");
delay(500);
}

Wyświetlacz łączy się z płytką przez magistralę I2C, więc niezbędna będzie dodatkowa biblioteka, ponieważ standardowy LiquidCrystal nam nie pomoże. Po dodaniu biblioteki musimy wprowadzić korektę pomiarową którą pobraliśmy w poprzednim programie, teraz możemy wgrać kod i cieszyć się działającą wagą.

Programy i biblioteki:

Materiały użyte w artykule: