Arduino – Load cell (yük hücresi), Hx711 Kalibrasyon ve Bağlantı Şekli

Loadcell

Türkçesi yük hücresi olan bu ürün, üzerine gelen gerinimi ölçer. Yukarıdaki görselde yer alan strain gauge (strengeç) yani gerinim ölçerdeki hareket, farklı bir yazımda değinmek istediğim wheatstone köprüsü vasıtasıyla okunmaktadır. Strain gauge düz bir lama üzerine yapıştırılır. Bu lama üzerine gelen yükün ağırlığı strain gauge’i hareket ettirir ve değerler sinyal uçlarından milivolt şeklinde çıkar. Hx711 aracılığıyla da kg veya lb şeklinde okunabilecek değerlere dönüşür. Değerlerin doğru olması için her ölçü cihazında olduğu gibi kalibrasyon yapılmalıdır.

Loadcell Hassasiyeti

Daha önce kullandığım 1.995 mV/V hassasiyete sahip bir loadcell üzerinden örnekle ölçme mantığına bakalım. 1.995 mV/V hassasiyetin anlamı, 50000 gram tam ölçekli bir yük hücremiz varsa ve her voltta 1.995 milivoltluk bir duyarlılık sergilendiğinde, 5 voltluk bir uyarımla, üzerinde 50000 gramlık bir yük konulduğunda 9,975 milivolt çıktı verecektir. Bu değerleri veren bağıntı şu şekildedir:

Tam Ölçekli Çıkış Gerilimi (mV) = Çalışma Gerilimi (V) x Hassasiyet (mV/V)

Daha açıklayıcı olması için çalışmamda elde etmiş olduğum ölçüm sonuçlarına birlikte bakalım:

Kütle

(g)

Çalışma Gerilimi (V) Hassasiyet

(mV/V)

Tam Ölçekli

Çıkış Gerilimi (mV)

Ölçülen Volt

(mV)

1000 5 1,995 9,975 0,17
2000 5 1,995 9,975 0,34
5000 5 1,995 9,975 0,85
10000 5 1,995 9,975 1,7

Tabloda görüldüğü üzere 1 kg kütlede ve 5 voltluk bir beslemede çıkış değeri 0.17 milivolt. Bunu aşağıda vermiş olduğum bağıntıyla görebiliyoruz. Kütleyi de arttırdıkça sinyal uçlarından çıkış değerinin de aynı oranda artığını görmek mümkün.

Tam Ölçekli Çıkış Gerilimi (mV)  / Toplam Yük Kapasitesi (kg) = 1.995 * 5 / 50 = 0.1995

Şimdi diyebilirsiniz ki yukarıdaki değer 0.17, formülde 0.1995. Bu da arduino’dan hx711’e giden 5 volt’un çıktığında azalarak çıkmasıdır. Ölçümlerimi de paylaşacak olursam:

Konum Volt (V)
Giriş 5,07
Çıkış 4,32

Burada da görüldüğü üzere yük hücresine giden volt değeri 4.32 V. O halde formüle yeni değerimizi koyduğumuzda:

Tam Ölçekli Çıkış Gerilimi (mV)  / Toplam Yük Kapasitesi (kg) = 1.995 * 4.32 / 50 = 0.172

Bu çıktıları mV değerlerinden hx711 ile kg veya lb değerine dönüştürmemiz gerekir. Aslında hx711 kütüphanesini kullandığımızda dönüşüm için farklı bir işleme gerek kalmıyor ancak okunan değerin doğru olması için kalibrasyon yapılması gerekir. Bununla da ilgili de ileride tekrar bahsetmek için ufak bir not bırakıp tüm işlemlerimizi sırasıyla yapalım.

Not: Kalibrasyon işlemi kütlesini bildiğimiz bir ağırlığı load cell üzerine koyup doğru kütleyi ekrana yazdırana kadar kalibrasyon faktörüyle oynayarak yapılır.

Bağlantı Şekli

Hx711 – Arduino Bağlantısı (eşleşme)

Hx711 Arduino
GND GND
DT DIGITAL 3
SCK DIGITAL 2
VCC 5V

Not: SCK ve DT girişlerini sırasıyla digital 2 ve 3′ e takma sebebim programda tanımlarken sck 2 ve dt 3 olarak tanımlamam. Eğer siz bu soketleri lcd ekran uygulaması gibi farklı uygulamalarda kullanıyorsanız, tanımlamaları doğru yapmak kaydıyla farklı girişler kullanabilirsiniz.

Hx711 – Load Cell Bağlantısı (eşleşme)

Load Cell Hx711
Kırmızı E+
Siyah E-
Yeşil A-
Beyaz A+

Not: S tipi load cell için bağlantı şeklini yine yukarıdaki gibi yapabilirsiniz. Sarı kablo boşta kalabilir.

Kalibrasyon Kodları ve Kalibrasyon Mantığı

Kalibrasyon, ölçülen büyüklüğün gerçek değeri ile onu ölçen aletin verdiği netice arasında bağlantı kurma işlemidir. Kalibrasyon işlemini gerçekleştirmek için load cell üzerine kütlesini bildiğimiz belli ağırlıklar yerleştirip o değerleri elde etmeye çalışırız. Load cell üzerine koyduğumuz kütleler load cell çıkışında milivoltlar oluşturur. Bu milivoltlar ise hx711 devresi ile okunabilecek değerlere dönüşür. Her kütlenin bir milivolt karşılığı vardır. Burada kalibre etmemiz gereken çıktı ise elde edilen volt değerlerinin kütlesel karşılıklarıdır. Her kütle için ayrı kalibre işlemi bulunmamaktadır. Ancak kalibrasyonun doğru yapıldığından emin olmak için farklı kütlelerle test edilmesi gerekir. Burada öncelik ağırlık sensörü üzerinde yük bulunmuyorken çıktı olarak “0 kg” görmektir. Görülmemesi durumunda sıfırlama yapmak için arduino programı içinde bulunan void setup kısmına scale.tare(); kodu yazılmalıdır.

Not: Void setup kısmına arduino programı çalışmadan önce ön yükleme yapmak istenilen komutlar yazılmaktadır. Dolayısıyla programı load cell üzerinde ağırlık varken çalıştırmak, hx711 çıktısında o yüke rağmen 0 kg değerini görmemizi sağlayacaktır. Bu durumun istenildiği ve istenilmediği durumlar vardır. Az önce dediğim gibi loadcell üzerine bir kütle koyup programı çalıştırırsanız o kütleyi göremeyeceksiniz, ancak diyelim ki bir sistem yaptınız ve loadcell üzerine sistemin yükü biniyor. Bu yük görmek istemediğiniz bir yükse scale.tare() kodunu setup kısmında kullanmanız gerekecektir.

Kalibrasyon İşlemi

Kalibrasyon için arduino ile bilgisayar bağlantısı yapılır. Kalibrasyon için ağırlık sensörü üzerine kütlesi bilinen bir ağırlık yerleştirilmelidir. İlk etapta kütle değeri bilinen 5 kilogramlık cisim load cell üzerine yerleştirilirse burada arduino seri port ekranında görülmesi gereken değer 5 kg’dır. Bu değeri elde edene kadar kalibrasyon faktörü ile oynanmalıdır. Buradaki kalibrasyon faktörü, load cell çıkış voltunun hx711 üzerinden yorumlandığı değerdir.

Kalibrasyon Kodları


#include "HX711.h"

// Hx711 verilerinin çıktısını alacağımız dijital portlar tanımlanır:

#define DOUT 3

#define CLK 2

HX711 scale(DOUT, CLK);
float kalibrasyon_faktoru = 10000; 
// Program çalışmadan önce ön yüklemeler void setup içerisine yazılır:

void setup() {

Serial.begin(9600); // İletişim hızı belirlenir: Saniyede 9600 bit olarak belirlendi

scale.set_scale(kalibrasyon_faktoru); // Ölçek ayarlandı

scale.tare(); // Ölçek sıfırlandı

}
void loop() { 
scale.set_scale(kalibrasyon_faktoru); // Kalibrasyon ölçeği ayarlandı. Loopta yer almasının sebebi seri port ekranı açıkken kalibre etmek istememizdir. 
// Yani seri port ekranında yapılan değişikliğin o an geçerli olması gerekmektedir. 

if(Serial.available()) // Bu satır ile seri port ekranı açık ise uygula komutu verildi.
{
char temp = Serial.read(); // Char temp ile bir değişken karakter tanımlandı.
if(temp == '+' || temp == 'a')     // Girilen karakter + veya a ise
kalibrasyon_faktoru += 10;      // Kalibrasyon faktörünü 10 artır
if(temp == '-' || temp == 'b')      // Girilen karakter - veya b ise
kalibrasyon_faktoru -= 10;      // Kalibrasyon faktörünü 10 azalt
}
Serial.println(scale.get_units()); // scale.get_units komutu hx711 ve arduino aracılığıyla load cell üzerinden anlık gelen kütle ölçümüdür. 
// Serial.print ile bu veriyi seri port ekranına yazdırmış olduk. 
Serial.println(kalibrasyon_faktoru); // O anki kalibrasyon faktörünü görmek için kalibrasyon_faktoru'nu de yazdıralım
}

Yukarıdaki kodda seri port ekranı açıkken + veya a ya basıldığında kalibrasyon faktörü 10 artacak, veya b yazıldığındaysa da kalibrasyon faktörü 10 azalacak. Yük hücresinin kapasitesi arttıkça kalibrasyon faktöründeki 10’arlık değişimler pek etkili olmayacağından yeni kod satırları oluşturarak farklı bir tuşa basıldığında faktörü 100, 1000 veya 10000 olarak arttırılmasını ya da azalmasını sağlayabilirsiniz. Yukarıdakinden farklı olarak hiçbir tuşa basmadan kalibrasyonu kendi kendine yapmasını istediğimiz birkaç kod satırı yazalım.

Otomatik Kalibrasyon Kodu

Ağırlık sensörünün üzerine 20 kilogramlık bir ağırlık yerleştirelim. Bu durumda amacımız scale.get_units kodunu yazdırdığımızda 20 kilogram görmektir. O halde basit bir if yani eğer işlemi ile bunu gerçekleştirene kadar kalibrasyon faktörünün artmasını ya da azalmasını isteyelim. Kodları yazacak olursak şu şekilde görünecektir:


if(scale.get_units() != 20.000) // okunan kütle 20.000 değilse
{ 
kalibrasyon_faktoru++; 
// ya da azaltmak için: kalibrasyon_faktoru--;
scale.set_scale(kalibrasyon_faktoru);
}
Serial.println(scale.get_units());
Serial.println(kalibrasyon_faktoru); 

Gürültüden dolayı 20.000 kütleyi görmeniz oldukça zor olacaktır. Dolayısıyla,

if(scale.get_units() > 20.000 && scale.get_units() < 20.100)

şartını kullanmanız daha mantıklı olacaktır. Diğer türlü her 20.000 şartını kaçırdığında artan ve artmaya devam eden kalibrasyon faktörü için tekrar başa almanız gerekir.

Gürültü: İletilmek istenen sinyale karışan, istenmeyen sinyaller sonucu oluşan dalgalanmalara genel olarak verilen bir addır.

Kalibrasyon işlemini bitirdiğinizde bu kodlardan kalibrasyon kodlarını kaldırmak isterseniz de aşağıdaki kodu doğrudan kullanabilirsiniz.


#include "HX711.h"

#define DOUT 3

#define CLK 2

HX711 scale(DOUT, CLK);

float kalibrasyon_faktoru = 10000; // buraya kalibrasyon işleminde bulduğunuz kalibrasyon faktörünü yazınız.

void setup() {
Serial.begin(9600);
scale.set_scale(kalibrasyon_faktoru ); // Kalibrasyon faktörü tanımlama
scale.tare(); // Ölçeği sıfırlama
}
void loop() {
Serial.print("Kütle: ");
Serial.print(scale.get_units()); // Okunan kütle değerini yazdırma
Serial.println(" kg");
} // Birimini belirtme

 Çevrim işlemleri sıralandığında şu şekildedir:

  1. Load cell çıkışındaki volt değerlerinin hx711’e iletilmesi,
  2. Hx711’in load cell üzerinden gelen sinyal milivolt değerlerini okunabilecek hale getirmesi,
  3. Okunabilen bu verilerin arduino programına iletilmesi ve arduino programının hx711 kütüphanesi ile kalibrasyon faktörü kullanarak gelen veriyi doğru olarak sunması.

Arduino Hx711 Kütüphanesi (hx711 library)

HX711-master İndirmek için Tıklayınız

Zip dosyası içindeki hx711-master klasörünü doğrudan arduino programının kurulu olduğu klasör içindeki libraries klasörünün içine atınız. Kütüphane içerisinde hx711 örnek kullanımları da mevcut.

8 comments

  1. Adamın dibi
    Sistemi kurmama yardımcı olmak için elinden geleni yaptı
    ÇOOOK TEŞEKKÜRLER 🙂

Yorum Yap

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir