Merhaba arkadaşlar, bugün sizlerle Arduino ve benzeri kartlarda sıklıkla kullanılan HC-SR04 ultrasonik sensörü ile ilgili ufak bir uygulama paylaşacağım. Dilerseniz öncelikle HC-SR04 sensörünün çalışma mantığı ile başlayalım.
HC-SR04 Ultrasonik Mesafe Sensörü Çalışma Prensibi
Sensörümüz, 5V DC gerilim ve 15 mA’lik akım ile çalışmaktadır. 40 Hz’lik bir frekans değerine sahip olup, maksimum 4 m ve minimum 2 cm’lik bir menzili vardır.
Çalışma prensibine gelecek olursak, sensörün içerisinde bulunan trandüser (Bkz: Trandüser Nedir?) ultrasonik sinyali/darbeyi iletir.
Sinyal cisme çarparak geri döner ve trandüser tarafından alınır. Trandüser tarafından gönderilen bu sinyalin cisme gidiş ve dönüş zamanı sensörle cismin mesafesine göre orantılanır. Evet, ultrasonik sensörünün çalışma prensibi temelde bu sisteme dayanmaktadır. (Ayrıntılı açıklama için tıklayınız.) Devreye ait şema ve program içi görüntüler aşağıda verilmiştir. Ayrıca yazı sonunda verilen video ile programın çalışmasını genel olarak göstermeye çalıştım. Yapmış olduğum uygulama bir önceki yazımda anlattığım Potansiyometre Uygulaması ile benzerlik göstermektedir. Sensörün ve Arduino bağlantıları kısaca şöyledir;
Vcc = +5V, Gnd = Gnd, Trig = 11.Pin, Echo = 10.Pin
Arduino Kodları
long sure; long mesafe; char m; //kullanacağımız değişkenleri tanımlıyoruz #define echoPin 10 //echo ve trig pinleri istediğimiz pine göre tanımlıyoruz #define trigPin 11 void setup() { Serial.begin(9600); //haberleşmeyi başlatıyoruz pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT); } void loop() { if(Serial.available()>0) //seri port ile gelen değişken kontrolü { m=Serial.read(); //değişken gelmiş ise bu değişkeni okuyoruz if(m='e') //bu gelen değişken e ise aşağıdaki işlemleri gerçekleştiriyoruz { digitalWrite(trigPin,LOW); delayMicroseconds(2); digitalWrite(trigPin,HIGH); delayMicroseconds(10); digitalWrite(trigPin,LOW); sure=pulseIn(echoPin,HIGH); //süreyi hesaplıyoruz mesafe=sure/58.2; //mesafeyi hesaplıyoruz Serial.println(mesafe); delay(200); } } }
C# Kodları (SerialPort’u projenize eklemeyi unutmayınız.)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; //ilk eklenmesi gereken kod (: namespace Arduino_HCSR04_Uygulamasi { public partial class Form1 : Form { SerialPort sPort; //SerialPort nesnemizi oluşturuyoruz. public Form1() { InitializeComponent(); sPort = new SerialPort(); sPort.BaudRate = 9600; //oluşturulan nesnenin haberleşme hızını ayarlıyoruz } private void btnBaglan_Click(object sender, EventArgs e) { timer1.Start(); //timerı başlatıyoruz try { sPort.PortName = txtPort.Text; //txtPort içerisindeki değeri seri port ismimize atıyoruz. İkiside string, convert'e gerek yok. if (!sPort.IsOpen) //şart sağlanıyorsa seri port açılarak aşağıdaki işlemler gerçekleşiyor { sPort.Open(); lblSonuc.Visible = true; lblSonuc.Text = "Bağlantı Kuruldu"; lblSonuc.ForeColor = Color.Green; } } catch (Exception) //herhangi bir hataya karşı try/catch bloğunu kullanıyoruz { lblSonuc.Visible = true; lblSonuc.Text = "Bağlantı Kurulamadı"; lblSonuc.ForeColor = Color.Red; } } //durdur butonu için gerekli kodları yazıyoruz private void btnDurdur_Click(object sender, EventArgs e) { timer1.Stop(); sPort.Close(); lblSonuc.Visible = true; lblSonuc.Text = "Bağlantı Sonlandırıldı"; lblSonuc.ForeColor = Color.Red; txtPort.Text = ""; //durdurma işleminden sonra port ismi, mesafe değeri ve bar oranı sıfırlanıyor txtMesafe.Text = ""; progressBar1.Value = 0; } private void timer1_Tick(object sender, EventArgs e) { try { sPort.Write("e"); //seri port üzerinden veri yazıyoruz int bilgi = Convert.ToInt32(sPort.ReadExisting()); //bu veriyi convert edip sayısal değere dönüştürüyoruz txtMesafe.Text = bilgi.ToString(); //elde edilen bilgi değeri mesafe textbox'ının içerisine string'e çevrilerek yazılıyor. progressBar1.Value = Convert.ToInt32(txtMesafe.Text); //txtMesafe içerisindeki değer progressBar'ın anlayacağı sayısal değere dönüştürülüyor System.Threading.Thread.Sleep(60); } catch (Exception) { } } } }
Uygulama Videosu
https://www.youtube.com/watch?v=13nVzmWmrLA
Uygulama hakkındaki sorularınızı konuyu cevaplayarak veya mail atarak sorabilirsiniz arkadaşlar.
Bir sonraki yazımda görüşmek dileğiyle hoşçakalın.
c# ile arduinoyu entegre etmen hoş olmuş , bunun yanında monitörün penceresinin yanında aynı zaman da bir lcd ekranda da görüntü vermen analog ortam için güzel olur . Arduino bir derya içine dalmak sa hoş 🙂 başarılar .
Teşekkür ederim Faseli. Dediğin gibi Arduino başka bir dünya. Elimden geldiğince vakit ayırmaya çalışıyorum 🙂
arada vakit bulursam ben de uğraşıyorum şu dersler bir bitsin dahada yoğunlaşacam bunun üzerinde , plc sistemlerinin bile entegre edildiğine şahit oldum arduino ile daha ne kabiliyetleri var Allah bilir 🙂
merhaba sızı ulasabılcegım bı g mail felan yok mu bseyler sorcam
merhaba, erenuyanikk@gmail.com adresine mail atarak sorularınızı sorabilirsiniz. Teşekkürler
Konu anlatımlarınız harika çok teşekkür ederim
Teşekkürler, yardımcı olabildiysem ne mutlu bana.
Güzel bir anlatım olmuş. Teşekkürler. Size bir soru sormak istiyorum. Dirençler + mı – mi uca bağlanır. Daha ilk ders olan led yakmak da bir çok sitede gördüm ki kimisi – bacağa kimisi + bacağa bağlamış doğru olan hangisi acaba?
Merhaba, öncelikle yorumunuz için teşekkür ederim. Sorunuza gelecek olursam;
Pratik uygulamada bunun tam bir etkisini görmek mümkün değil. Bir devre üzerinde elektronların -‘den +’ya aktığı bilinir. Buna karşılık devre akımının ise +’dan -‘ye aktığı kabul edilir. Direnç gibi bir elemanı akıma karşı kullanabilmek için hangi yol tercih edilmeli açıkçası bende emin olamıyorum. Fakat ben şahsen genelde – uca bağlamayı tercih ediyorum.
ben ultrasonik sensör ve servo motor ile radar projesi yapıcam ama bu projenin c# kodları nasıl olur bilmiyorum bu uygulamayı yapan varsa kodları paylaşabilirmi acaba şimdiden teşekkürler
erenuyanikk@gmail.com ‘a mail atarsanız daha iyi olur.