Bugün Arduino’muza bir ultrasonik sensörü bağlıyoruz; HC-SR04. 5-6 TL arasında alınabiliyor. Düzgün çalışıyor mu? Pek emin değilim!… Hemen özelliklerine bakalım (https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf)
Data sheet bu kart boyutlarının 45 mm x 20 mm olduğunu söylüyor. 4 adet bağlantısı var: Vcc ve Gnd zaten Allahın emri. Diğer bacaklar ‘trigger (tetikleme)’ ve ‘echo (eko, yankı, yansıyan ses)’ bacakları. Üzerinde alıcı ve verici olarak kullanılan iki adet bildiğiniz hoparlör (benzeri) var. Verici olan T (transmitter) ile, alıcı olan R (reciever) olarak işaretlenmiş. 5 volt gerilimle çalışıyor, 15 mA akım çekiyor. Kartın karşısında 15° lik açı içerisinde ölçüm yapıyor. 2 cm ile 4m arasındaki ölümleri 3 mm hassasiyetle ölçebiliyor. Tüm bu yazdıklarım data sheet’in dedikleri. Basitçe çalışma prensibi; vericiden bir ses sinyali yollanıyor. Bu sinyal bir engele çarparsa geri dönüyor ve alıcıya ulaşıyor. Bu modül de bu süreyi hesaplıyor. Yani bu sensör aslında mesafe değil zaman ölçüyor! Mesafeye dönüşümünü biz Arduino’ya yaptırıyoruz. Peki bu alet ses dalgası yayıyorsa biz bunu duyacak mıyız? İnsan kulağı en iyi ihtimalle 20 Hz – 20 kHz arasındaki ses dalgalarını duyabiliyor. Bu arkadaşın yaydığı ses dalgası 40 kHz. Duyamayacağımız frekansta olduğu için de bu alete ultrasonik (ultrasound) aralıkta çalışıyor diyoruz.
Peki bu nasıl yapılıyor biraz detaylandırırsak; Arduino’dan trigger bacağına 10 μs süresince HIGH sinyali yolluyoruz. Bu modül bu sinyali aldıktan yaklaşık 250 μs sonra her biri 40 kHz olan 8 adet atma yayıyor ve bekliyor. Sonra alıcıdan aldığı sinyale göre echo bacağından 150 μs ile 25 ms arasında HIGH çıkışı Arduino’ya gönderiliyor. Bu süre aslında bu modülün ölçüm aralığı. Alıcıdan hiçbir sinyal gelmemesi durumunda echo çıkışının HIGH süresi yaklaşık 38 ms. Bu değer, aralıkta hiçbir nesnenin olmaması anlamına geliyor ve ölçüm tamamlanıyor. Yeni bir ölçüm için trigger’e tekrar (10 μs) HIGH yollanması gerekiyor.
Bundan sonra biraz hesap yapmak lazım. Hızın sabit olduğu durumda eğer zaman bilinirse basit bir Fizik kuralı ile hareketlinin (burada ses) katettiği mesafe bulunabilir;
Mesafe = Hız x Zaman
Arduino’da bu hesabı yaptırabiliriz. Ancak burada kullanılan zaman aslında sesin vericiden çıkıp, nesneye çarpıp, yansımasının alıcıya ulaşması için geçen zaman! yani bizim ölçmek istediğimizin iki katı olduğundan doğru ölçüm için formül:
Mesafe = (Hız x Zaman) / 2
Oldu o zaman sesin hızını bilirsek mesafeyi hesaplayabiliriz. Burda dikkat! Ses elektromanyetik dalgalardan farklı olarak ortamın titreşmesi ile ilerler. Yani bir ortam gereklidir, boşlukta ses iletilmez (ortamın yoğunluğuna, esnekliğine bağlıdır; derin mevzu)!. Trenin gelişini merak edenler kulaklarını raylara dayarlar. Çünkü demir sesi havadan daha hızlı iletir. Sesin havadaki iletim hızı da havanın sıcaklığına ve biraz da nemine bağlıdır. 0 °C de ses 1 saniyede yaklaşık 331 metre yol alır. Hadi nem ihmal edilebilir, ama sıcaklıkla(T) hız da artar. Hava içerisinde ses hızı için genel formül aşağıdaki şekildedir:
Ses Hızı = 331 + (0,6 x T)
Yukarıdaki formüle göre her 1 °C sıcaklık artışı 0,6 m/s hız artışına neden olacaktır. Biz yaklaşık 25 °C için (Hız = 331 + (0,6 x 25)); 346 m/s değerini kullanabiliriz (birimin m/s cinsinden olduğuna dikkatinizi çekiyorum, programda başka birim için dönüştürülmüş hali kullanılacaktır). Bu değer ne kadar doğru ise hesapladığımız mesafe ölçümü de o kadar doğru olacaktır. Sadece 4 bacağı olduğu için Arduino bağlantısı çok kolay yapılıyor. Tabi bu mesafenin ‘seri ekran’ da yazdırılacağı prototip.
Yukarıdaki bağlantıya göre 7 numaralı pini ‘trigger’, 8 numaralı pini de ‘echo’ olarak tanıtıp, ‘zaman’ ve ‘mesafe’ adında iki değişkenlerimizi (hassas ölçüm için float olarak) tanımlıyoruz.
#define trigPin 7
#define echoPin 8
float mesafe;
float zaman;
Setup’da trigger’i çıkış pini, echo’yu da giriş pini olduğunu belirtip seri iletişimi (9600 baud rate) başlatıyoruz.
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
Önce trigger pinini sıfırlayıp (5 μs), sonra 10 μs HIGH yaparak vericiden sinyal göndermesinin sağlıyoruz, tekrar LOW yapıyoruz.
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
Sonrasındaki işlem echo bacağından veri okumak ve bunu ‘zaman’ değişkenine atmak. Okuma işi için digatalRead ya da analogRead komutlarıyla pinden gelen gerilim değerini okumayı görmüştük. Burada pulseIn komutu ile echo’dan gelen HIGH sinyalinin süresini okuyup(μs), ‘zaman’ değişkenimize atıyoruz.
zaman = pulseIn(echoPin, HIGH);
Sonrasında formül ile mesafeyi hesaplayıp, seri ekranda bunu yazdırıyoruz (uzunluk birimi cm , zaman birimi μs alınırsa; 346 m/s = 0,0346 cm/μs). Her bir okuma arasına yarım saniye bekleme zamanı ekliyoruz.
mesafe = (zaman *0.0346 )/ 2 ;
Serial.print(“mesafe = “);
Serial.print(mesafe);
Serial.println(” cm”);
delay(500);
Sonuç: Data sheet verileri maalesef çalışmıyor! Hassasiyet çok kötü, 3,5 cm’nin altında ölçüm yapılmıyor. çalışma kararlı değil, 10 cm gösterirken birden bire 300 küsür değer gösteriyor. Hassasiyetin arttırılması için yazılmış programlar (kütüphane olarak ekleyebiliyorsunuz) var. Ama maalesef onlarda da hassasiyet sağlanamamış (en azından benim araştırdıklarımda). Sebep olarak ortam sıcaklığı ve neme bağlı ses hızındaki değişiklikler verilmiş. Ama ben bu sensörün bu kadar çalıştığına inanıyorum.
Buraya kadar anlatılanlar prototip proje içindi. Aşağıdaki kodlar ve devre şeması 1602 LCD ekranın I2C kullanımı ile yapılacaklardır. Bunun için gerekli aparatı LCD ekrana lehim yapmak ya da board üzerinde birleştirmek gerekiyor. Ben LCD ekrana soket lehimleyerek işi geçici olarak çözdüm. Kod için ise I2C için ‘wire.h’ kütüphanesini indirip programa dahil etmek gerekiyor. Bu kütüphaneyi daha önce eklemiştik. Ayrıca LCD ekranın da I2C olarak kullanılması için indirilip (zip) yüklenmesi gerekiyor. Kütüphane indirmeyi de daha önce görmüştük. Bu kütüphaneyi de (Arduino-LiquidCrystal-I2C-library-master) indirip Arduino IDE ye yüklemeliyiz.
Elimizdeki I2C modülünün adresini bulmak için (https://gist.github.com/tfeldmann/5411375) sitesindeki Arduino programı ile öğrenmemiz gerekiyor (bunu da daha önce gördük). İlgili satıra bunu eklememiz gerekiyor. Kodda bunun yerinin belirttim.
Kolay gelsin…
I2C devre şeması:
Gerekli kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// i2c aparatın adresini 0x3F yerine yazmanız gerekiyor
#define trigPin 7
#define echoPin 8
float mesafe,zaman;
void setup() {
lcd.begin();
lcd.backlight();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
lcd.setCursor(3,0);
lcd.print(“egitimsart!”);
delay(4000);
lcd.clear();
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
zaman = pulseIn(echoPin, HIGH);
mesafe = (zaman *0.0346 )/ 2;
lcd.setCursor(0,0);
lcd.print(“Mesafe(cm): “);
lcd.setCursor(6,1);
lcd.print(mesafe);
delay(500);
}
Kaynak:
https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf
https://www.youtube.com/watch?v=ZejQOX69K5M
https://www.youtube.com/watch?v=6F1B_N6LuKw&t=1563s
https://www.nde-ed.org/EducationResources/HighSchool/Sound/tempandspeed.htm
Arduino-LiquidCrystal-I2C-library-master