Bu proje, HC-SR04 Ultrasonik Mesafe Sensörü ve bir Servo Motor kullanarak çevredeki nesnelerin konumunu tespit eden ve bunları bir radar ekranı gibi görselleştiren bir sistemdir. Sensör servoya monte edilerek 180 derece döner ve her açıda aldığı mesafe verisini işleyerek bir tarama haritası oluşturur.

Görsel: Robotik projeler için sonar mesafe tarama mekanizması
Sonar sistemi iki ana döngü üzerine kuruludur:
Elde edilen açı ve mesafe verileri Serial port üzerinden bilgisayara gönderilir. Bu verileri Processing gibi bir yazılımla bilgisayarda gerçek bir radar ekranına dönüştürebilirsiniz.
#include <Servo.h>
const int trigPin = 9;
const int echoPin = 10;
Servo radarServo;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
radarServo.attach(11);
Serial.begin(115200);
}
void loop() {
// Soldan Sağa Tarama
for(int i = 0; i <= 180; i++) {
radarServo.write(i);
delay(10);
int mesafe = mesafeOlcul();
// Veriyi tek satırda gönder, sonunda nokta olsun
Serial.print(i);
Serial.print(",");
Serial.print(mesafe);
Serial.println(".");
}
// Sağdan Sola Tarama
for(int i = 180; i > 0; i--) {
radarServo.write(i);
delay(10);
int mesafe = mesafeOlcul();
Serial.print(i);
Serial.print(",");
Serial.print(mesafe);
Serial.println(".");
}
}
int mesafeOlcul() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long sure = pulseIn(echoPin, HIGH);
return sure * 0.034 / 2; // Mesafe (cm)
}
Arduino'dan gelen mesafe verilerini görsel bir radar ekranına dönüştürmek için aşağıdaki Processing kodunu kullanabilirsiniz. Kod, ekranı bir yarım daire olarak çizer ve nesnelerin olduğu bölgeleri kırmızı (tespit edildi), boş bölgeleri ise yeşil (tarama yapıldı) olarak işaretler.

import processing.serial.*;
Serial myPort;
String data = "";
// En başa değişkenleri tanımla
int angle = 0;
int distance = 0;
void setup() {
size(1200, 700);
frameRate(60);
// Portu açarken oluşabilecek hataları engellemek için kontrol ekliyoruz
try {
myPort = new Serial(this, "COM4", 115200);
myPort.bufferUntil('.'); // '.' işaretini gördüğünde serialEvent'i tetikle
} catch (Exception e) {
println("Port açılamadı: " + e.getMessage());
}
}
void draw() {
fill(0, 5); // Hareketli iz efekti için hafif şeffaf arka plan
noStroke();
rect(0, 0, width, height);
fill(98, 245, 31);
drawRadar();
drawObject();
}
void serialEvent(Serial myPort) {
try {
// 1. Veriyi oku
String inBuffer = myPort.readStringUntil('.');
// 2. Eğer gelen veri boş değilse işlem yap
if (inBuffer != null) {
data = trim(inBuffer);
data = data.substring(0, data.length() - 1); // Sondaki noktayı çıkar
int index = data.indexOf(",");
if (index > 0) {
angle = Integer.parseInt(data.substring(0, index));
distance = Integer.parseInt(data.substring(index + 1));
}
}
} catch (Exception e) {
// Hata oluşursa programı durdurma, sadece konsola yazdır (opsiyonel)
println("Veri okuma hatası: " + e.getMessage());
}
}
void drawRadar() {
pushMatrix();
translate(width/2, height-100);
noFill();
strokeWeight(2);
stroke(98, 245, 31);
arc(0, 0, 1200, 1200, PI, TWO_PI);
popMatrix();
}
void drawObject() {
pushMatrix();
translate(width/2, height-100);
strokeWeight(9);
stroke(255, 10, 10);
// Mesafe ve açıya göre çizim
float pixDistance = distance * 22.5;
if(distance < 40){
line(pixDistance*cos(radians(angle)), -pixDistance*sin(radians(angle)),
1100*cos(radians(angle)), -1100*sin(radians(angle)));
}
popMatrix();
}
"COM3" kısmını, Arduino'nuzun bağlı olduğu port ismiyle değiştirmeyi unutmayın (Arduino IDE'nin sağ alt köşesinde yazar).Serial.println(mesafe); satırını Serial.print(mesafe); Serial.println("."); şeklinde güncellerseniz Processing veriyi hatasız okuyacaktır.delay(30) değerini azaltarak tarama hızını artırabilirsiniz.Henüz yorum yapılmamış. İlk yorumu siz yapın!