KKM: HX711 + load-cell

Početnik si s Croduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala e-radionice na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Croduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.

UVOD

U ovom tutorijalu upoznat ćemo se s radom jednog vrlo korisnog modula, kojeg svakodnevno koristimo, a radi se o load cell modulu koji služi za mjerenje mase. Također ćemo se upoznat i s analogno digitalnim pretvornikom koji nam je veza između load cella i Croduina. Ovaj modul se koristi u digitalnim vagama kao i analogno digitalni pretvornik, ali u nešto drukčijoj izvedbi, no rade na istom principu. Kako bi saznali što je to load cell, te što je analogno digitalni pretvornik opisat ćemo kako oni rade i što sve sadrže u sebi.

 
Karakteristike HX711 modula:
• Preciznost ADC: 24-bit
• Pojačanje: 128 za A kanal, 64 za B kanal
• Napon: 2.7V - 5.5V
• Struja: < 1.5mA
• Brzina očitanja: 10SPS(samples per second) ili 80SPS
• Dimenzije: 22 x 25 mm
• Komunikacija: Serijska

KAKO RADI?

Za početak naučimo nešto o load cell-u, kako on radi i od čega je napravljen. Load cell je zapravo promjenjivi otpornik koji se nalazi u metalnom kućištu i koji promjeni otpor ovisno o naprezanju odnosno sili koja djeluje na kućište. Imamo razne izvedbe ovisno o sili kojom mogu biti opterećene, otporu, promjeni otpora, itd. U našem primjeru se koristi četiri otpornika koji su razmješteni u metalnom kućištu i povezani na odgovarajući način, odnosno u Wheatstoneov most, tako se jednom paru otpornika smanjuje otpor, a drugom povećava, i mi trebamo samo izmjeriti tu promjenu otpora kako bismo znali iznos sile.
Da bismo odredili masu (silu) moramo mjeriti promjenu otpora otpornika koji su ugrađeni u naš modul. Slika nam prikazuje kako se spajaju otpornici u mostu, te gdje se spaja napajanje a gdje voltmetar koji mjeri napon, kada most nije u ravnoteži. Iz promjene otpora možemo odrediti kolika je masa koja silom djeluje na load cell.

Pošto su promjene otpora jako male, onda nam je i promjena napona mala i zbog toga se koristi analogno digitalni pretvornik HX711 s pojačalom koji pojačava signal 128 puta. Analogno digitalni pretvornik je napravljen za spajanje load cella koji su napravljeni tehnikom Wheatstone mosta. Pretvornik nam mjerenje otpora pretvara u digitalne podatke i tako ih šalje mikrokontroleru koji obradom podataka nama daje masu koju mjeri load cell.

KAKO POVEZATI?

Load cell se na analogno digitalni pretvornik povezuje s četiri žice, u Wheatstoneovom mostu imamo dvije žice za napajanje i dvije za mjerenje. Boje vodiča su standardizirane te tako imamo crvenu i crnu žicu za napajanje (crvena E+, a crna E-) žice koje su za mjerenje su bijele i zelene boje te ih spajamo na pojačalo(zelena A-, bijela A+) te imamo još i žutu žicu koja služi kako bi se smanjile elektromagnetske smetnje koje se induciraju u vodičima. Žuta žica se spaja na pin koji je označen sa SHIELD.
Kada smo spojili load cell na analogno digitalni pretvornik trebamo ga još povezati na Croduino. Kako naš pretvornik koristi digitalnu komunikaciju trebamo samo povezati DOUT i CLK pinove pretvornika na digitalne pinove Croduina koje smo odredili u kodu i gotovi smo s povezivanjem.

ARDUINO KOD

Za rad sa HX711 analogno digitalnim pretvornikom moramo instalirati biblioteku HX711 koja sadrži sve potrebne funkcije. Ako ne znate kako instalirati biblioteku pogledajte naš tutorijal.
Prvi primjer koda nam služi kako bi odredili faktor kalibracije koji nam je potreban da bi ispravno mjerili masu. Kada ovaj kod uploadamo na Croduino i otvorimo Serial monitor ispisivat će nam se masa i faktor kalibracije. U kodu su opisane tipke koje služe za smanjivanje odnosno povećavanje faktora kalibracije te sami postupak kalibracije. Kada jednom odredimo faktor kalibracije za određeni load cell nije ga potrebno ponovno određivati jer se on ne mijenja. Ako koristimo drugi load cell kojemu ne znamo faktor kalibracije onda ga moramo odrediti na opisani način kako bi imali ispravna mjerenja mase.

#include "HX711.h" //uključujemo biblioteku koja nam služi za rad sa HX711 ADC
#define DOUT 5 //pin na koji spajamo DOUT pin s pretvornika
#define CLK 6 //pin na koji spajamo CLK pin s pretvornika
 
HX711 scale(DOUT, CLK); //Konstruktor za našu biblioteku za HX711 ADC
 
//faktor kalibracije koji trebamo odrediti (nije točan za trenutni load cell) njega ćemo mijenjati kroz Serial monitor kako bi odredili pravi faktor
float calibration_factor = -96650;
 
void setup() {
 Serial.begin(9600);//Inicijalizacija serijske komunikacije( brzina 9600 bauda)
 //Ispisujemo postupak kalibracije na Serial monitor
 Serial.println("HX711 Kalibracija");
 Serial.println("Uklonite utege sa mjerila(vage)");
 Serial.println("Nakon što pocnu ocitanja stavite poznati uteg na vagu");
 Serial.println("Sada treba mijenjati faktor kalibracije, kako bi dobili tocno ocitanje");
 Serial.println("Pritisnite a,s,d,f za povecanje faktora kalibracije za 10,100,1000,10000");
 Serial.println("pritisnite z,x,c,v za smanjenje faktora kalibracije za 10,100,1000,10000");
 Serial.println("Pritisnite t za tariranje");
 scale.set_scale();
 scale.tare(); //postavimo vagu na 0(tariramo)
}
 
void loop() {
 
 scale.set_scale(calibration_factor); //postavlja faktor kalibracije koji predajemo funkciji
 
 Serial.print("Ocitavanje: ");
 Serial.print(scale.get_units(), 3);// dobivamo masu zaokruženu na 3 decimale
 Serial.print(" kg"); //ispisujemo da se radi o kilogramima
 Serial.print(" Faktor kalibracije: ");
 Serial.print(calibration_factor);//ispisujemo faktor kalibracije
 Serial.println();
 
 if(Serial.available())//ako je korisnik nešto unio putem Serial monitora onda se izvršava daljnji kod
 //ovisno o poslanom slovu mijenjamo faktor kalibracije za određenu vrijednost
 {
 char temp = Serial.read();
 if(temp == '+' || temp == 'a')
 calibration_factor += 10;
 else if(temp == '-' || temp == 'z')
 calibration_factor -= 10;
 else if(temp == 's')
 calibration_factor += 100; 
 else if(temp == 'x')
 calibration_factor -= 100; 
 else if(temp == 'd')
 calibration_factor += 1000; 
 else if(temp == 'c')
 calibration_factor -= 1000;
 else if(temp == 'f')
 calibration_factor += 10000; 
 else if(temp == 'v')
 calibration_factor -= 10000; 
 else if(temp == 't')
 scale.tare(); //ako je poslano slovo t onda vagu postavimo na 0(tariramo)
 }
}

 
Drugi primjer koda nam služi za mjerenje mase odnosno napravili smo kod za jednostavnu digitalnu vagu. Prilikom korištenja ovoga koda potreban nam je i displej ili možemo jednostavno ispisivati vrijednosti na Serial monitor u slučaju da nemamo displej. Ako ne znate povezati displej možete pogledati tutorijal za LCD displej ili za OLED displej koji je praktičniji za ovu primjenu zbog svojih dimenzija.
U ovom kodu je potrebno promijeniti faktor kalibracije koji smo odredili za load cell kojeg ćemo koristiti.
Ako ne želimo provjeravati što se ispisuje na Serial monitoru možemo dijelove koda koji ispisuju na Serial monitor izbrisati kako bi nam program zauzimao manje memorije ili ako nemamo displej možemo izbaciti dio koda za displej a ostaviti Serial monitor.

#include "HX711.h" //uključujemo biblioteku koja nam služi za rad sa HX711 ADC
#include <Wire.h>  //uključujemo wire biblioteku koja nam omogućuje I2C komunikaciju 
#include <Adafruit_SSD1306.h> //uključujemo biblioteku za rad s OLED displejom 

#define SCREEN_WIDTH 128 //definiramo širinu displeja, u pixelima
#define SCREEN_HEIGHT 32 //definiramo visinu displeja, u pixelima
#define DOUT 5 //pin na koji spajamo DOUT pin s pretvornika
#define CLK 6 //pin na koji spajamo CLK pin s pretvornika

long t; //varijabla u koju spremamo vrijeme od pokretanja Croduina s kojim pravimo pauzu između očitanja
//Konstruktor za našu biblioteku za HX711 ADC
HX711 scale(DOUT, CLK);
//Konstruktor za našu biblioteku za OLED displej,kako bi imali pristup funkcijama koje upravljanju displejom
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
//faktor kalibracije koji smo odredili u prvom primjeru koda i njega trebamo ovamo upisati 
float calibration_factor = -35300; 

void setup() {
 Serial.begin(9600);
 if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { //Adresa 0x3C za 128x32 displej
 //ako inicijalizacija nije uspjela na Serial monitoru dobijemo poruku o grešci
 Serial.println(F("SSD1306 neuspjela inicijalizacija"));
 for(;;); //beskonačna petlja ako inicijalizacija nije uspjela kako program ne bi nastavio izvođenje
 }

 Serial.println("Uklonite sve utege s vage");
 Serial.println("Pritisnite t za tariranje");
 scale.set_scale();
 scale.tare(); //postavlja vagu na 0
}
 
void loop() {
 scale.set_scale(calibration_factor); //postavlja faktor kalibracije koji smo deklarirali na početku
 
 if (millis() > t + 1000) { //funkcija za pauzu od 1 sekunde koja ne zaustavlja program kao delay,
 // nego samo svake sekunde ispisuje očitanje, ali program se stalno izvršava
 float masa=scale.get_units();//u varijablu masa spremamo masu koju očitavamo s vage
 Serial.print("Ocitavanje: ");
 Serial.print(masa, 3);// ispisujemo masu zaokruženu na 3 decimale
 Serial.println(" kg");
 display.clearDisplay();//funkcija za brisanje svega s displeja
 display.setTextSize(1);//funkcija za postavljanje veličine teksta 
 display.setTextColor(WHITE);//funkcija za postavljanje boje slova(naš displej može samo jednu boju) 
 display.setCursor(0,0);//funkcija za postavljanje kursora (0-128,0-32)na displeju gdje želimo početi s ispisom teksta 
 display.print("Masa: ");
 display.print(masa); //ispisujemo masu na OLED display
 display.print(" kg");
 display.display();//prikazujemo sav tekst na displeju koji smo prethodno poslali u buffer displeja
 t=millis();//u varijablu t spremamo novo vrijeme koje je prošlo od pokretanja Croduina
 }
 //ako je korisnik nešto unio putem Serial monitora onda se izvršava daljnji kod
 if(Serial.available())
 {
 char temp = Serial.read();
 //ako je poslano slovo t onda vagu postavimo na 0(tariramo)
 if(temp == 't')
 scale.tare();
 }
}
Leave a Reply