František Hruška
Oblast aplikací
Při řešení úloh IoT (internetu věcí), automatizace, medicíny jsou často používány odporové senzory.
Princip je jednoduchý, měřená veličina působící na citlivou hmotu senzoru mění elektrickou rezistenci
– dále jen odpor. Vyhodnocení změny odporu takových senzorů na elektrické napětí pro další
propojení senzorů s měřidly, vyhodnocovacími systémy, regulátory atd. je možné několika způsoby.
Často používaná metoda využívá obvod můstkového zapojení. Přináší mnoho výhod, od
jednoduchosti přes přesnost, citlivost, kompenzaci vnějších vlivů. Schéma je na obr.1.

Napětí U0 vzniká podle změn odporů senzoru (R1 nebo R1,R2 nebo R1,R4 nebo R1, R2, R3, R4 podle
druhu můstku. Je relativně malé v řádu jednotek mV, je nutné ho zesílit na hodnoty jednotek V.
V nabídce Arduino je zajímavý obvod, který řeší zesílení výstupu můstku, jeho připojení
k mikropočítači způsobem datového připojení. Schéma připojení je na obr.2.

Na obr.2 je nakreslen můstek 4 odporů ale dvojitých. Důvodem je použití takových senzorů u
osobních vah a jiných snímačů senzorů dostupných z Číny. Jsou dostatečně kvalitní. Schéma je na
obr.3.

Vyhodnocovací obvod
Další části aplikace je elektronika pro vyhodnocení rozdílu napětí z můstku. V sortimentu ARDUINO je
modul AD převodník 24-bit 2 kanály HX711, používá integrovaný obvod (IO) společnosti AVIA
Semiconductor. Základem je integrovaný až 24 bitový analog-číslicový převodník (ADC). Obvod je
přímo určený pro aplikace s odporovými senzory v můstkovým zapojením, zajišťuje přesné napájení
můstku, má dva kanály vyhodnocení s různým zesílením, výstup je datový se speciálním protokolem
s hodinovým signálem CKL a datovým výstupem s připojením na dva binární piny.
Obvod lze napojit na odporový můstek a na mikropočítačový modul např. typu UNO R3, UNO R4,
případně další.
Výsledky rešerše
V literatuře Arduino je hodně odkazů s popisy a návody pro modul HX711, viz kapitola Literatura.
Popisy obsahují dva hlavní způsoby práce s modulem. Využívá se základních funkcí „spusteniMereni()“ a nebo přímé příkazy read() a get(). Doplňujícími příkazy jsou příkazy pro hodnocení tary, tj. vážení samostatného obalu a následně vážení hmotnosti bez obalu.
Algoritmus s funkcí spusteniMereni
Základní struktura tohoto algoritmu je níže:
long spusteniMereni(byte mericiMod) {
....
while (digitalRead(pDT));
for (index=0;index<24;index++) {
digitalWrite(pSCK,1);
vysledek=vysledek<<1| digitalRead(pDT);
digitalWrite(pSCK,0);
}
for (index=0;index<mericiMod;;index++) {
digitalWrite(pSCK,1); digitalWrite(pSCK,0);
}
if (vysledek>=0x800000) vysledek=vysledek | 0xFF000000L;
switch (mericiMod) {
case 1: vysledek=vysledek/128/2; break;
case 2: vysledek=vysledek/32/2; break;
case 3: vysledek=vysledek/64/2; break;
}
return vysledek;
}
Algoritmus je součástí testovací programu HX711_1_test.ino. Celý zdrojový text je dále:
// Arduino AD 24-bit převodník s 2 kanály
// piny pro připojení SCK a DT z modulu
int pSCK = 2;
int pDT = 3;
float output1;float output2;
// definování různých nastavení kanálů a jejich zesílení
#define kanal_A_zesil_128 1
#define kanal_B_zesil_32 2
#define kanal_A_zesil_64 3
void setup() {
// nastavení pinů modulu jako výstup a vstup
pinMode(pSCK, OUTPUT);
pinMode(pDT, INPUT);
// set komunikace přes sériovou linku rychlostí 115200 baud
Serial.begin(115200);delay(2000);
// probuzení modulu z power-down módu
digitalWrite(pSCK, LOW);
// spuštění prvního měření pro nastavení měřícího kanálu
output1=spusteniMereni(kanal_A_zesil_64);
}
void loop() {
// 2.měření a jeho výsledku
output2=spusteniMereni(kanal_A_zesil_64);
Serial.print(" output1: ");
Serial.print(output1);
Serial.print(" output2: ");
Serial.println(output2);
delay(5000);
}
//-------------------------------------------------------------------------------
// vytvoření funkce pro měření z nastaveného kanálu
long spusteniMereni(byte mericiMod) {
byte index;
long vysledekMereni = 0L;
// načtení 24-bit dat z modulu
while(digitalRead(pDT));
for (index = 0; index < 24; index++) {
digitalWrite(pSCK, HIGH);
vysledekMereni = (vysledekMereni << 1) | digitalRead(pDT);
digitalWrite(pSCK, LOW);
}
// nastavení měřícího módu
for (index = 0; index < mericiMod; index++) {
digitalWrite(pSCK, HIGH);
digitalWrite(pSCK, LOW);
}
// konverze z 24-bit dvojdoplňkového čísla na 32-bit znaménkové číslo
if (vysledekMereni >= 0x800000) vysledekMereni = vysledekMereni | 0xFF000000L;
// přepočet výsledku na mikrovolty podle zvoleného kanálu a zesílení
/*switch(mericiMod) {
case 1: vysledekMereni = vysledekMereni/128/2; break;
case 2: vysledekMereni = vysledekMereni/32/2; break;
case 3: vysledekMereni = vysledekMereni/64/2; break;
}*/
return vysledekMereni ;
}
Výsledek je vypsán ve tvaru:
14:10:54.915 -> output1: 66144.00 output2: 66039.00
14:10:59.908 -> output1: 66144.00 output2: 65878.00
14:11:04.915 -> output1: 66144.00 output2: 65866.00
Poznámky:
- Hodnota output1 na výpisu je ze vzorkování v části setup. Hodnota output2 je z opakování v části loop a mění se.
- Hodnoty jsou bez přepočtů zesílení (viz vyblokovaná část v závěru funkce spusteniMereni blok switch(mericiMod).
Algoritmus přímých příkazů
Druhá možnost ovládat modul HX711 je použití přímých příkazů read a get. Struktura tohoto
algoritmu:
....
Out1=(scale.read()); //1x údaj načten z HX
Out2=(scale.read_average(2)); //průměr nkrát čtení z HX
Out3=(scale.get_value(2));//průměr n1krát =( HX- tara)
Out4=(scale.get_units(2)); // průměr n2krát = (HX- tara)/g_factor;
delay(2000);
.....
Algoritmus je součástí testovací programu HX711_2_test.ino. Celý zdrojový text je dále:
/* úpravy HX711_read/get_test
Autor: (C) fhruska */
#include "HX711.h"
#define g_factor 10 //-7050, his value is obtained using the SparkFun_HX711_Calibration sketch
#define LOADCELL_DOUT_PIN 3
#define LOADCELL_SCK_PIN 2
HX711 scale;
byte n;
float Out1; float Out2; float Out3; float Out4;float tara_a;
byte flag_tara;
//.....................................................................
void setup() {
Serial.begin(115200);delay(2000);
Serial.println(">>>>>>>>>>>>HX711 testování");
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
Serial.println("Čeká se na tara...........");
delay(1000);
scale.set_scale(g_factor); //zadá se podle předchozích měření
scale.tare(); //resetuje se na 0
Out2=(scale.read_average(1)); //průměr nkrát čtení z HX
Out3=(scale.get_value(1));//průměruje n1 krát čtení a počítá (HX- tara), (jeli nastavená)
tara_a=Out2-Out3;
Serial.print("tara_a=Out3-Out2: "); Serial.print(tara_a);
Serial.print(", Out3 "); Serial.print(Out3);
Serial.print(", Out2 "); Serial.println(Out2);
}
//....................................................................................................
void loop() {
n++;
Out1=(scale.read()); //1x údaj načtený z HX
Out2=(scale.read_average(2)); //průměr nkrát čtení z HX
Out3=(scale.get_value(2));//průměr n1krát čtení z HX- tara, (jeli nastavená)
Out4=(scale.get_units(2)); // průměr n2krát čtení z (HX- tara)/g_factor, (je-li nastavené)
Serial.print(">> Výpis n=");Serial.print(n); Serial.print(", Out1=");Serial.print(Out1);
Serial.print(", Out2="); Serial.print(Out2);Serial.print(", Out3="); Serial.print(Out3);
Serial.print(", Out4="); Serial.println(Out4);
delay(2000);
}
Testovací program vypisuje výsledky ve tvaru:
19:51:52.525 -> >>>>>>>>>>>>HX711 testování
19:51:52.525 -> Čeká se na tara...........
19:51:54.488 -> tara_a=Out3-Out2: 120339.00, Out3 -154.00, Out2 120185.00
19:51:56.621 -> >> Výpis n=1, Out1=120191.00, Out2=120262.00, Out3=-14.00, Out4=-3.70
19:52:00.612 -> >> Výpis n=2, Out1=120105.00, Out2=120218.00, Out3=-351.00, Out4=-25.40
19:52:04.667 -> >> Výpis n=3, Out1=120171.00, Out2=120095.00, Out3=-371.00, Out4=-36.60
Poznámky:
- Hodnoty na výpisu jsou z výstupů z příkazů, v části setup i loop. Hodnoty Out1 až Out4 jsou rozdílné průměrování a matematickou operací.
- Hodnoty jsou bez přepočtů.
Závěr
- Jsou popsány dva algoritmy, každý má výhodu i nevýhody, hodnotím je jako stejně kvalitní, pomocí přímých příkazů je to navíc větší možnosti pro aplikace.
- Je pozorováno, že hodnota výstupů z modulu HX711 u obou algoritmů se dosti výrazně mění po zapnutí funkce a ustálí se po cca 2 minutách, ale i zde dost výrazně kolísá. Zlepšení vzniká při přepočtech na fyzikální jednotky.
- Modul HX711 je zajímavý obvod i přes velký drift a nestabilitu pro vyhodnocování odporových senzorů v můstkovém zapojení. Odporové senzory a můstkové zapojení jsou často aplikované a přináší mnoho výhod, jako např. u tenzometrů vah, u odporových senzorů teploty atd.
Tárování
Slovo tára znamená hmotnost obalu nebo jiné části váženého objektu (např. váha automobilu, která
objekt přepravuje. Funkce tárování patří v praxi k velmi důležitým podle druhu vážení, proto jeho
volba je ovládaná tlačítkem. Princip tárování je jednoduchý, vážíme vlastně samostatně obal, jeho
hmotnost se vynuluje a pak se v dalším vážení ukazuje jen čistá hmotnost obsahu obalu, nádoby atd.
Funkce ZERO je nulování, tj. vynulujeme údaj na ukazateli.
Literatura
- Hruška F Senzory: fyzikální principy, úprava signálů, praktické použití. UTN Zlín, 2021, ISBN: 978-80-7454-096-7, https://digilib.k.utb.cz/handle/10563/18582
- Katalogový list obvodu HX711, https://cdn.sparkfun.com/datasheets/Sensors/ForceFlex/hx711_english.pdf
- https://randomnerdtutorials.com/arduino-load-cell-hx711/
- https://www.instructables.com/Arduino-Scale-With-5kg-Load-Cell-and-HX711-Amplifi/ zde jsou funkční nulování+calib (HX711_nul_test) a vážení (HX711_get_test).
- https://www.laskakit.cz/ad-prevodnik-modul-24-bit-2-kanaly-hx711/