Arduino ile Mesafe Sensörü Kullanımı ve Radar Yapımı
Arduino ile mesafe sensörü kullanımı, robot projelerinden, hobi projelerine kadar bir çok alanda yer alabilir. Bu basit sensör ile, kısa mesafeli nesne radarı, cisim algılama, mesafe ölçme gibi işlemler yapabilirsiniz.
Yazımızın alt kısmında ayrıca, Processing uygulaması ile tıpkı Arduino IDE kullanır gibi, grafikli işlemler sayesinde radar uygulaması yapacağız. İşlemlere geçmeden önce, sensörü tanıyalım:
Ultrasonik Sensör HC-SR04, mesafeyi ölçebilen bir sensördür. 40 000 Hz (40kHz) frekansta bir ultrason yayar ve yolunda bir nesne veya engel varsa modüle geri döner. Yolculuk süresini ve sesin hızını göz önünde bulundurarak mesafeyi hesaplayabilirsiniz.
Mesafe Sensörü Nasıl Çalışır?
Ultrason sinyalini oluşturmak için Tetik Pimini(TRIG) 10 mikrosaniye Yüksek Duruma ayarlamamız gerekir. Bu, hız sesinde hareket edecek ve Yankı Pininde(ECHO) alınacak olan 8 döngülü bir sonik patlama gönderecek. Yankı Pimi(ECHO), ses dalgasının kat ettiği süreyi mikrosaniye cinsinden verir.
Örneğin, nesne sensörden 20 cm uzaktaysa ve sesin hızı 340 m/s veya 0.034 cm/µs olduğu için, ses dalgasının yaklaşık 588 mikrosaniye hareket etmesi gerekecektir. Ancak Echo pininden alacağınız şey bu sayının iki katı olacaktır çünkü ses dalgasının ileri gitmesi ve geri sıçraması gerekir. Yani mesafeyi cm cinsinden bulmak için yankı piminden alınan seyahat süresi değerini 0,034 ile çarpmamız ve 2’ye bölmemiz gerekir.
- Önce kablolamayı şemadaki gibi yapın
- Arduino IDE Yazılımını açın ve kodunuzu yazın veya aşağıdaki kodu kopyalayıp yükleyin
- Araçlar > Kart > Arduino/Geniuno Uno’yu seçin
- COM Bağlantı Noktanızı seçin (genellikle yalnızca bir mevcut bağlantı noktası görünür), Araçlar > Bağlantı Noktası > COM.. (Birden fazla bağlantı noktası varsa tek tek deneyin)
- Ctrl + U veya Taslak > Yükle tuşlarına basarak kodunuzu yükleyin
- Ölçüm verilerini görüntülemek için Ctrl + Shift + M tuşlarına basarak Seri Monitörü kullanabilirsiniz (baud hızının 9600 olduğundan emin olun)
Devre Şeması
Program Kodu
Aşağıdaki kod seri ekran üzerinden mesafeyi görmek için hazırlanmıştır. Bu kodun altındaki kod ise 16×2 LCD ekranla kullanmak için hazırlanmıştır.
Seri Ekran İle
#define echoPin 2 #define trigPin 3 long sure; int mesafe; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); Serial.println("devreyakan Ultrasonik Sensor HC-SR04 Testi"); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); sure = pulseIn(echoPin, HIGH); mesafe = sure * 0.034 / 2; Serial.print("Mesafe: "); Serial.print(mesafe); Serial.println(" cm"); }
LCD Ekran İle
#include <LiquidCrystal.h> LiquidCrystal lcd(6, 7, 8, 9, 10, 11); #define echoPin 12 #define trigPin 13 long sure; int mesafe_cm; int mesafe_inch; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); lcd.begin(16, 2); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); sure = pulseIn(echoPin, HIGH); mesafe_cm = sure * 0.034 / 2; mesafe_inch = sure * 0.0133 / 2; lcd.setCursor(0, 0); lcd.print("Mesafe: "); lcd.print(mesafe_cm); lcd.println(" cm"); lcd.setCursor(0, 1); lcd.print("Mesafe: "); lcd.print(mesafe_inch); lcd.println(" inc"); }
Processing ile Radar Yapımı
Öncelikle radar(sonar) yapımı için, üstte kullandığımız ultrasonik mesafe sensörü ve servo motora ihtiyacımız var. Servo motorun koluna, mesafe sensörünü yerleştirerek, otomatik bir şekilde 1800 ve maksimum 4.5M lik bir alanı tarayabilir, radar üstünde işaretleyebiliriz.
Gerekli Malzemeler
- Geliştirme kartı(Arduino Uno)
- Ultrasonik Sensör
- Servo motor
- Kablolar
- Devre Tahtası
Devre Şeması
Arduino Kodu
#include <Servo.h> const int trigPin = 12; const int echoPin = 11; long duration; int distance; Servo s1; void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); s1.attach(9); } void loop() { for (int i = 15; i <= 165; i++) { s1.write(i); delay(30); distance = calDist(); Serial.print(i); Serial.print(","); Serial.print(distance); Serial.print("."); } for (int i = 165; i > 15; i--) { s1.write(i); delay(30); distance = calDist(); Serial.print(i); Serial.print(","); Serial.print(distance); Serial.print("."); } } int calDist() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; return distance; }
Processing Kodu
import processing.serial.*; import java.awt.event.KeyEvent; import java.io.IOException; Serial myPort; String angle = ""; String distance = ""; String data = ""; String noObject; float pixsDistance; int iAngle, iDistance; int index1 = 0; int index2 = 0; PFont orcFont; void setup() { size (1200, 700); // ekran çözünürlüğünüze göre ayarlayın smooth(); myPort = new Serial(this, "COM4", 9600); //com portunuzu seçin myPort.bufferUntil('.'); } void draw() { fill(98, 245, 31); noStroke(); fill(0, 4); rect(0, 0, width, height - height * 0.065); fill(98, 245, 31); drawRadar(); drawLine(); drawObject(); drawText(); } void serialEvent (Serial myPort) { data = myPort.readStringUntil('.'); data = data.substring(0, data.length() - 1); index1 = data.indexOf(","); angle = data.substring(0, index1); distance = data.substring(index1 + 1, data.length()); iAngle = int(angle); iDistance = int(distance); } void drawRadar() { pushMatrix(); translate(width / 2, height - height * 0.074); noFill(); strokeWeight(2); stroke(98, 245, 31); arc(0, 0, (width - width * 0.0625), (width - width * 0.0625), PI, TWO_PI); arc(0, 0, (width - width * 0.27), (width - width * 0.27), PI, TWO_PI); arc(0, 0, (width - width * 0.479), (width - width * 0.479), PI, TWO_PI); arc(0, 0, (width - width * 0.687), (width - width * 0.687), PI, TWO_PI); line(-width / 2, 0, width / 2, 0); line(0, 0, (-width / 2)*cos(radians(30)), (-width / 2)*sin(radians(30))); line(0, 0, (-width / 2)*cos(radians(60)), (-width / 2)*sin(radians(60))); line(0, 0, (-width / 2)*cos(radians(90)), (-width / 2)*sin(radians(90))); line(0, 0, (-width / 2)*cos(radians(120)), (-width / 2)*sin(radians(120))); line(0, 0, (-width / 2)*cos(radians(150)), (-width / 2)*sin(radians(150))); line((-width / 2)*cos(radians(30)), 0, width / 2, 0); popMatrix(); } void drawObject() { pushMatrix(); translate(width / 2, height - height * 0.074); strokeWeight(9); stroke(255, 10, 10); pixsDistance = iDistance * ((height - height * 0.1666) * 0.025); if (iDistance < 40) { line(pixsDistance * cos(radians(iAngle)), -pixsDistance * sin(radians(iAngle)), (width - width * 0.505)*cos(radians(iAngle)), -(width - width * 0.505)*sin(radians(iAngle))); } popMatrix(); } void drawLine() { pushMatrix(); strokeWeight(9); stroke(30, 250, 60); translate(width / 2, height - height * 0.074); line(0, 0, (height - height * 0.12)*cos(radians(iAngle)), -(height - height * 0.12)*sin(radians(iAngle))); popMatrix(); } void drawText() { pushMatrix(); if (iDistance > 40) { noObject = "Menzil Disi"; } else { noObject = "Menzilde"; } fill(0, 0, 0); noStroke(); rect(0, height - height * 0.0648, width, height); fill(98, 245, 31); textSize(25); text("10cm", width - width * 0.3854, height - height * 0.0833); text("20cm", width - width * 0.281, height - height * 0.0833); text("30cm", width - width * 0.177, height - height * 0.0833); text("40cm", width - width * 0.0729, height - height * 0.0833); textSize(40); text("devreyakan.com", width - width * 0.875, height - height * 0.0277); text("Acı: " + iAngle + " °", width - width * 0.48, height - height * 0.0277); text("Uzaklik: ", width - width * 0.26, height - height * 0.0277); if (iDistance < 40) { text(" " + iDistance + " cm", width - width * 0.225, height - height * 0.0277); } textSize(25); fill(98, 245, 60); translate((width - width * 0.4994) + width / 2 * cos(radians(30)), (height - height * 0.0907) - width / 2 * sin(radians(30))); rotate(-radians(-60)); text("30°", 0, 0); resetMatrix(); translate((width - width * 0.503) + width / 2 * cos(radians(60)), (height - height * 0.0888) - width / 2 * sin(radians(60))); rotate(-radians(-30)); text("60°", 0, 0); resetMatrix(); translate((width - width * 0.507) + width / 2 * cos(radians(90)), (height - height * 0.0833) - width / 2 * sin(radians(90))); rotate(radians(0)); text("90°", 0, 0); resetMatrix(); translate(width - width * 0.513 + width / 2 * cos(radians(120)), (height - height * 0.07129) - width / 2 * sin(radians(120))); rotate(radians(-30)); text("120°", 0, 0); resetMatrix(); translate((width - width * 0.5104) + width / 2 * cos(radians(150)), (height - height * 0.0574) - width / 2 * sin(radians(150))); rotate(radians(-60)); text("150°", 0, 0); popMatrix(); }
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.