Radar yapımı oldukça karmaşık bir projedir ve gerçek bir radarın tam olarak taklit edilmesi oldukça zor olabilir. Ancak, basit bir radar benzeri proje oluşturarak cisimlerin yaklaşımını tespit edebilirsiniz. Arduino IDE uygulamasına ek olarak, Processing uygulamasını da kullanacağız. Eğer Arduino ile uyumlu bir şekilde bu tarz bir görüntüyü oluşturabileceğinizi düşünüyorsanız, bunun için C# dili kullanabilirsiniz. İnternette bulunan Processing radar görüntüsüne ilişkin kodlar genellikle versiyon 3 için yazılmış olsa da, şu anda 4.2 versiyonunda olduğumuz için diğer kodlar hatalar verebilir. Burada paylaştığım kod, 4.2 versiyonunda sorunsuz bir şekilde çalışmaktadır. Buraya tıklayarak gitHub sayfasına ulaşabilirsiniz.
Gerekli Malzemeler:
- Arduino
- Ultrasonik mesafe sensörü (HC-SR04)
- Servo motor
- Jumper kabloları
Adım 1: Devre Tasarımına Başlayın
Arduino'nun VCC pinini sensörün VCC pinine, GND pinini sensörün GND pinine, Trig pinini Arduino'nun bir dijital çıkışına (örneğin 10. pin) ve Echo pinini Arduino'nun bir dijital girişine (örneğin 11. pin) bağlayın. Servo motorun sinyal kablosunu Arduino'nun bir PWM çıkışına (örneğin 12. pin) bağlayın.
Adım 2: Arduino Kodunu Yazın ve Yükleyin
Aşağıdaki Arduino kodunu kullanarak, ultrasonik sensörü ve servo motoru kontrol edebilirsiniz. Kod, sensörden gelen mesafeyi ölçer ve servo motoru döndürerek cismin konumunu takip eder.
(Arduino kodu.)
#include <Servo.h>. // Motor kütüphanesi.
// Ultrasonik sinyal pinleri.
const int trigPin = 10;
const int echoPin = 11;
// Gerekli değişkenler uzaklık ve zaman.
long duration;
int distance;
// Servo tanıtımı.
Servo myServo;
void setup()
{
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
myServo.attach(12); //Servo motor sinyal pini.
}
void loop()
{
// 15 derece ile 165 derece arasında dön.
for(int i=15;i<=165;i++){
myServo.write(i);
delay(30);
distance = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
}
for(int i=165;i>15;i--)
{
myServo.write(i);
delay(30);
distance = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
}
}
int calculateDistance()
{
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.)
(Satır 75 sığmamış tam hali bu.)
line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),700*cos(radians(iAngle)),-700*sin(radians(iAngle)));
import processing.serial.*; // Kütüphane entegresi.
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 (1366, 700);
smooth();
//Com portunu seçin.
//Arduino bağlantısı yapılırken seçtiğiniz portu tırnak
//içindeki alana yazın.
myPort = new Serial(this,"COM3", 9600);
myPort.bufferUntil('.');
}
void draw()
{
fill(98,245,31);
noStroke();
fill(0,4);
rect(0, 0, width, 1010);
fill(98,245,31); // Radardaki yeşil renk.
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 = Integer.parseInt(angle);
iDistance = Integer.parseInt(distance);
}
void drawRadar()
{
pushMatrix();
translate(683,700);
noFill();
strokeWeight(2);
stroke(98,245,31);
// draws the arc lines
arc(0,0,1300,1300,PI,TWO_PI);
arc(0,0,1000,1000,PI,TWO_PI);
arc(0,0,700,700,PI,TWO_PI);
arc(0,0,400,400,PI,TWO_PI);
// draws the angle lines
line(-700,0,700,0);
line(0,0,-700*cos(radians(30)),-700*sin(radians(30)));
line(0,0,-700*cos(radians(60)),-700*sin(radians(60)));
line(0,0,-700*cos(radians(90)),-700*sin(radians(90)));
line(0,0,-700*cos(radians(120)),-700*sin(radians(120)));
line(0,0,-700*cos(radians(150)),-700*sin(radians(150)));
line(-700*cos(radians(30)),0,700,0);
popMatrix();
}
void drawObject()
{
pushMatrix();
translate(683,700);
strokeWeight(9);
stroke(255,10,10); // Radardaki kırmızı renk.
// Ölçüm mesafesi 40 cm dir. İsteseniz değiştitirebilirsini.
// Ancak ek ayarlar gerektirir.
pixsDistance = iDistance*22.5;
if(iDistance<40)
{//Alttaki satır sığmıyor tam hali yukarıda.
//Ancak kopyalarken sıkıntı olmuyor. Sadece burada görünmüyor.
line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),700*cos(radians(iAngle)),-700*sin(radians(iAngle)));
}
popMatrix();
}
void drawLine()
{
pushMatrix();
strokeWeight(9);
stroke(30,250,60);
translate(683,700);
line(0,0,700*cos(radians(iAngle)),-700*sin(radians(iAngle)));
popMatrix();
}
void drawText()
{
pushMatrix();
if(iDistance>40)
{
noObject = "Out of Range";
}
else
{
noObject = "In Range";
}
fill(0,0,0);
noStroke();
rect(0, 1010, width, 1080);
fill(98,245,31);
textSize(25);
text("10cm",800,690);
text("20cm",950,690);
text("30cm",1100,690);
text("40cm",1250,690);
textSize(40);
text("Object: " + noObject, 240, 1050);
text("Angle: " + iAngle +" °", 1050, 1050);
text("Distance: ", 1380, 1050);
if(iDistance<40)
{
text(" " + iDistance +" cm", 1400, 1050);
}
textSize(25);
fill(98,245,60);
translate(390+960*cos(radians(30)),780-960*sin(radians(30)));
rotate(-radians(-60));
text("30°",0,0);
resetMatrix();
translate(490+960*cos(radians(60)),920-960*sin(radians(60)));
rotate(-radians(-30));
text("60°",0,0);
resetMatrix();
translate(630+960*cos(radians(90)),990-960*sin(radians(90)));
rotate(radians(0));
text("90°",0,0);
resetMatrix();
translate(760+960*cos(radians(120)),1000-960*sin(radians(120)));
rotate(radians(-38));
text("120°",0,0);
resetMatrix();
translate(840+900*cos(radians(150)),920-960*sin(radians(150)));
rotate(radians(-60));
text("150°",0,0);
popMatrix();
}
0 Yorumlar