3 Ocak 2022 Pazartesi

Arduino ile Radar yapımı



Kullanılan Malzemeler;
Arduino Uno
BreadBoard
HC-SR04 Ultrasonik Mesafe Sensor
Buzzer
Servo Motor

Kullanılan Yazılımlar;
C
Java

Kullanılan Yazılım Programları;
Proccessing
Arduino


TinkerCadde Projenin Taslağı



Yapımı

İlk başta Breadboard üzerinde - ve + hatlarını bağladım ve bu - ve + hatlarını Arduino üzerinde 5V ve Gnd pinlerine bağladım.
Daha sonrasında ise Hcsr sensörümün + ve -(Gnd) pinlerini breadboard üzerinde - ve + hatlarına yerleştirdim.
Hcsr Sensörümde yer alan Trig ve Echo pinlerimi Arduinoda 3 ve 2 nolu pinlere bağladım.
Buzzerımın + Hattını breadboard üzerinde + ya ve ayrıyetten aynı + hattını arduino uno üzerinde 8 nolu pine bağladım.
Micro Servomdan çıkan - ve + hatlarını da aynı şekilde breadboarda bağladıktan sonra Micro Servomdan çıkan sinyal hattını ise arduinoda 9 nolu pine bağladım.
Yaptığım projede gücü bilgisayardan alacağı için ekstra bir pil veya batarya bağlama gereksinimi duymadım.
Parçalarımı bağladıktan sonra yaptığım radar projesinde radarımın 180 derecelik bir açıyı taraması gerektiği için micro Servomun üzerine HCSR sensörümü  tutucu yardımıyla oturtturdum. 

Arduino Kodu;


#include <Servo.h>  // Servonun kütüphanesini ekliyoruz


const int trigPin = 3;  //  hcsr-04ümdeki trig pinimi arduinoda  tanımlıyorum.

const int echoPin = 2;  //  hcsr-04ümdeki trig pinimi arduinoda  tanımlıyorum.


const int piezoPin = 8; // Buzzer'ımı arduinodaki pinime tanımlıyorum


long sure;    // Sureyi burda int yerine long olarak tanımlıyorum.Long int'e göre daha uzun aralıklara sahip olduğu için long kullanıyorum.

int uzaklik;  // Buradada uzaklıgı int olarak tanımlıyorum. 



int nota[] = {262, 462, 862, 1662, 3262}; // Notalarımı giriyorum. Notaları kat kat seçtim ki mesafe degiştikçe ton belirgin olsun diye.


Servo myServo; // Servo motorun ayarlarını girecegimiz bir servo oluşturup  tanımlıyorum


void setup() {

  pinMode(trigPin, OUTPUT); //  TriggerPini Çıkış olarak ayarlıyorum

  pinMode(echoPin, INPUT); //  Echo pini ise giriş olarak ayarlıyorum

  Serial.begin(9600);      // Seri monitorumü tanımlıyorum.

  myServo.attach(9); // Oluşturdugum servoyu arduinodaki 9.pine baglıyorum.

}


void loop() {

  

  // Bu kısımda servo motoru 15 dereceden 165 dereceye döndürüyorum.

  for(int i=15;i<=165;i++){   // Buradaki for döngüsünde açı değişkenimi 15 dereceden 180 dereceye kadar 1,1 arttırarak döndürüp servonun pozisyonunu ayarlıyorum.

  myServo.write(i); // Buradada oluşturduğum servoyu i olarak yazdır diyorum.


  uzaklik = uzaklikhesabi(); // Her açı için uzaklığı hesaplıyorum

  

  

  if(uzaklik > 40){  // Eğer uzaklık 40dan büyükse buzzerımı 10mili saniyede kontrol ederek sustur diyorum.

    noTone(piezoPin); 

     delay(10);

    noTone(piezoPin);

    delay(30);

  }

  else if (uzaklik <= 40 && uzaklik > 30){ // Burada ise eger uzaklık 40 ve 40dan küçük ise VE uzaklık 30dan büyük ise note 1 olarak tanımladığım notayı 10mili saniye kontrol ederek çal diyorum.

    tone(piezoPin, nota[1]);

     delay(10);

    noTone(piezoPin);

    delay(30);

  }

  else if (uzaklik <= 30 && uzaklik > 20){ // Burada ise eger uzaklık 30 ve 30dan küçük ise VE uzaklık 20dan büyük ise note 2 olarak tanımladığım notayı 10mili saniye kontrol ederek çal diyorum.

    tone(piezoPin,nota[2]);

     delay(10);

    noTone(piezoPin);

    delay(30);

  }

  else if (uzaklik <= 20 && uzaklik > 10){ // Burada ise eger uzaklık 20 ve 20dan küçük ise VE uzaklık 10dan büyük ise note 3 olarak tanımladığım notayı 10mili saniye kontrol ederek çal diyorum.

    tone(piezoPin,nota[3]);

     delay(10);

    noTone(piezoPin);

    delay(30);

  }

  else {

    tone(piezoPin,nota[4]); // Bunun haricinde ise buzzerımı nota 4 olarak 10ms kontrol ederek çal diyorum.

     delay(10);

    noTone(piezoPin);

    delay(30);

  }

     

      

  Serial.print(i); // Verdigim iyi(açıyı) Serial printe gönderip gösteriyorum.

  Serial.print(","); // Lazım olacak ek karakterleri serial printe gönderip gösteriyorum

  Serial.print(uzaklik); // Burdada uzaklığımı Serial printe gönderip gösteriyorum.

  Serial.print("."); // Lazım olacak ek karakterleri serial printe gönderip gösteriyorum

  }

 

  for(int i=165;i>15;i--){  // Yukarda girdiğim for döngüsünü açının geri dönüşü için tekrar ediyorum.

  myServo.write(i); //  Tekrar oluşturduğum servoyu dönüş için i olarak yazdır diyorum.

 

  uzaklik = uzaklikhesabi(); // Her açı için uzaklığı tekrar hesaplıyorum

  

  if(uzaklik > 40){   // Tekrar Eğer uzaklık 40dan büyükse buzzerımı 10mili saniyede kontrol ederek sustur diyorum.

    noTone(piezoPin);

    delay(10);

    noTone(piezoPin);

    delay(30);

  }

  else if (uzaklik <= 40 && uzaklik > 30){ // Tekrar  Burada ise eger uzaklık 40 ve 40dan küçük ise VE uzaklık 30dan büyük ise note 1 olarak tanımladığım notayı 10mili saniye kontrol ederek çal diyorum.

    tone(piezoPin, nota[1]);

     delay(10);

    noTone(piezoPin);

    delay(30);

  }

  else if (uzaklik <= 30 && uzaklik > 20){ // Tekrar  Burada ise eger uzaklık 30 ve 30dan küçük ise VE uzaklık 20dan büyük ise note 2 olarak tanımladığım notayı 10mili saniye kontrol ederek çal diyorum.

    tone(piezoPin,nota[2]);

     delay(10);

    noTone(piezoPin);

    delay(30);

  }

  else if (uzaklik <= 20 && uzaklik > 10){ // Tekrar  Burada ise eger uzaklık 20 ve 20dan küçük ise VE uzaklık 10dan büyük ise note 3 olarak tanımladığım notayı 10mili saniye kontrol ederek çal diyorum.

    tone(piezoPin,nota[3]);

     delay(10);

    noTone(piezoPin);

    delay(30);

  }

  else {   // Tekrar bunun haricinde buzzerımı nota 4 olarak 10ms kontrol ederek çal diyorum.

    tone(piezoPin,nota[4]);

    delay(10);

    noTone(piezoPin);

    delay(30);

  }

     

  Serial.print(i); // Tekrar Verdigim iyi(açıyı) Serial printe gönderip gösteriyorum.

  Serial.print(","); // Tekrar  ek karakterleri serial printe gönderip gösteriyorum

  Serial.print(uzaklik); // Tekrar Burdada uzaklığımı Serial printe gönderip gösteriyorum.

  Serial.print("."); // Tekrar ek karakterleri serial printe gönderip gösteriyorum

  

  }

}


int uzaklikhesabi(){  // Uzaklık hesabimi tanımlıyorum.

  

  digitalWrite(trigPin, LOW); 

  delayMicroseconds(2);

  // trig pinimizi 2 saniyeligine devre dışı bırak diyorum.

  digitalWrite(trigPin, HIGH); 

  delayMicroseconds(10); // // Trigpini 10mikro saniye için aktif et sonrasında ise devre dışı bırak diyorum

  digitalWrite(trigPin, LOW);

  sure = pulseIn(echoPin, HIGH); //echoPin den değer oku,ses dalgasının yol alma süresini mikrosaniyeye çevir diyorum 

  uzaklik= sure*0.034/2;  // // Burada uzaklıgın formülünü girip uzaklıgı buluyoruz.Sureyi burda  2 ve 34 ile bölüyoruz.Buradaki 2 bizim "git-gel olayımız oluyor."İlk bşata gidiyor uzaklıgı x oluyor birde geri geliyor 2x oluyor bu yüzden 2 ile bölüyoruz. 34 ise hcsr-04'ün sabit degeridir.Ses dalgasının sıcaklıga göre hızı degişir bu degerde 34 olduğu için 34 alıyoruz.

  return uzaklik; //  uzaklıgı geri döndürüyorum

}



PROCCESING KODU;

   

    import processing.serial.*;  //Proccesinge seri haberleşme kütüphanesini ekliyorum

    import java.awt.event.KeyEvent; // seri porttan veri okuma kütüphanesini ekliyorum

    import java.io.IOException;   // giriş ve çıkışdaki  istinaslarının kütüphanesini ekliyorum

    Serial myPort; // Burada seri obje tanımı yapıyorum

 

    String aci=""; // Açımı string yani metin değeri olarak tanımlıyorum

    String uzaklik=""; // Uzaklıgıda metin olarak tanımlıyorum

    String data=""; // Datamıda string olarak tanımlıyorum

    String obje; // Objemide string olarak tanımlıyorum

    float pixsuzaklik; // int komutu tam sayı üretirken float hem tam sayı ve kesirli sayılar üretiyor. Burada pixsuzaklık olarak yazdığım kod cm olarak alınan uzaklığı piksele çevirdigi için.Float olarak tanımlıyorum

    int iaci, iuzaklik;  // Tam sayı değerinde açımı ve uzaklığımı tanımlıyorum.

    int index1=0; // 1.dizinimi tanımlıyorum

    int index2=0; // 2.dizinimi tanımlıyorum

    PFont orcFont; // Burada yazı fontumu orc font olarak giriyorum

    void setup() {

     

     size (1366, 750); // Ekran çözünürlügümüzü giriyorum

     smooth();

     myPort = new Serial(this,"COM4", 9600); // Port yardımıyla seri haberleşmeye başla Port:Arduinomuzu bilgisayara bagladıgımız yerin tanımlaması

     myPort.bufferUntil('.'); // Seri porttan '.' karakterine kadar değer oku diyorum.

    

    }

    void draw() { // Bu kısım radarın göstergesinin çizildigi kısım.

     

      fill(98,245,31); // Burda renk tanımı yapıyorum. Bu renk kodları yeşil rengin kodları.

     

     

      noStroke(); //Bu kısımda radar göstergesinde açıyı gösteren kısımın eski halinin görünümünü belirliyorum.

      fill(0,12);  //

      rect(0, 0, width, height-height*0.065);  // Rect komutuyla x,y genişlik ve uzunluk olarak diktörtgen çiziyoruz.

     

      fill(98,245,31); // Tekrar yeşil kodları tanıtıyorum

      // Bu kısımda radarın görüntüsü  için fonksiyonları çağırıyorum.

      drawRadar();  // radarı çiz göster diyorum

      drawLine();  // çizgileri çiz göster diyorum

      drawObject(); // objeyi çiz göster diyorum

      drawText();  // ve yazıları çiz göster diyorum

    }

    void serialEvent (Serial myPort) { //  seri porttan veriyi oku diyorum

     

      data = myPort.readStringUntil('.');   // Seri porttan '.' karakterine kadar değer oku ve "data" değişkenine bu karakterleri ata diyorum.

      data = data.substring(0,data.length()-1); // 0 konumundan uzunluga kadar veri oku ve data olarak tanımla diyorum.

     

      index1 = data.indexOf(",");  // Dizinde ',' karakterini bul ve "index1" değişkenine ata diyorum.

      aci= data.substring(0, index1); // "0" konumundan index1 in konumuna kadar veri oku ve açı değeri olarak tanı diyorum

      uzaklik= data.substring(index1+1, data.length()); // "index1" in konumundan "data" nın konumuna kadar veri oku ve mesafe olarak seri porta yolla

     

      // String olarak metin olarak atadığım açı ve uzaklık komutlarımı parseint kullanarak tam sayıya çeviriyorum.

      iaci = parseInt(aci);

      iuzaklik = parseInt(uzaklik);

    }

    void drawRadar() {   // Burda radar göstergesini çiziyorum.

      pushMatrix();   // Kordinat sistemini matrixe gönderiyoruz.

      translate(width/2,height-height*0.074); // başlangıç koordinatlarını yeni konuma taşı diyorum.

      noFill();

      strokeWeight(2); // Radardaki çizginin dış kalınlığını 2 yapıyorum.

      stroke(98,245,31); // Dış kalınlıgın rengini yeşil yapıyorum.

      //Yayların çizgilerini çiziyorum

      arc(0,0,(width-width*0.0625),(width-width*0.0625),PI,TWO_PI); //Burda radardaki göstergelerin 1. yay çizgisini çiziyorum

      arc(0,0,(width-width*0.27),(width-width*0.27),PI,TWO_PI); //Burda radardaki göstergelerin 2. yay çizgisini çiziyorum

      arc(0,0,(width-width*0.479),(width-width*0.479),PI,TWO_PI); //Burda radardaki göstergelerin 3. yay çizgisini çiziyorum

      arc(0,0,(width-width*0.687),(width-width*0.687),PI,TWO_PI); //Burda radardaki göstergelerin 4. yay çizgisini çiziyorum

      // Açı çizgilerini çiziyoruz

      line(-width/2,0,width/2,0);

      line(0,0,(-width/2)*cos(radians(30)),(-width/2)*sin(radians(30)));    //Burda radardaki 30 derecelik açının çizgisini çiziyorum

      line(0,0,(-width/2)*cos(radians(60)),(-width/2)*sin(radians(60)));   //Burda radardaki 60 derecelik açının çizgisini çiziyorum

      line(0,0,(-width/2)*cos(radians(90)),(-width/2)*sin(radians(90)));   //Burda radardaki 90 derecelik açının çizgisini çiziyorum

      line(0,0,(-width/2)*cos(radians(120)),(-width/2)*sin(radians(120)));  //Burda radardaki 120 derecelik açının çizgisini çiziyorum

      line(0,0,(-width/2)*cos(radians(150)),(-width/2)*sin(radians(150)));  //Burda radardaki 150 derecelik açının çizgisini çiziyorum

      line((-width/2)*cos(radians(30)),0,width/2,0);

      popMatrix(); // Yukarıda çizgidimiz kordinat sistemini ilk haline getiriyorum.

    }

    void drawObject() { // Burada objeyi çiziyorum

      pushMatrix();   // Çizdigimiz objeyi kordinat sistemine gönderiyorum

      translate(width/2,height-height*0.074); // başlangıç koordinatlarını yeni konuma taşı

      strokeWeight(9);  // Objenin kalınlıgını 9 olarak yapıyorum

      stroke(255,10,10); // Obje algılarsa rengini kırmızı atıyorum

      pixsuzaklik = iuzaklik*((height-height*0.1666)*0.025); // sensörden alınan mesafe değerini cm den piksele çevir diyorum

      // Mesafeyi 40 olarak belirtme

      if(iuzaklik<40){ // Eger uzaklık 40dan küçükse

        // açı ve mesafeye göre objeyi çiz diyorum

      line(pixsuzaklik*cos(radians(iaci)),-pixsuzaklik*sin(radians(iaci)),(width-width*0.505)*cos(radians(iaci)),-(width-width*0.505)*sin(radians(iaci)));

      }

      popMatrix(); // Objeyi kordinat sistemindeki ilk haline geri getiriyorum.

    }

    void drawLine() { // Burda çizgimi çiziyorum.

      pushMatrix(); // Çizdigim çizgiyi kordinat sistemine gönderiyorum

      strokeWeight(9); // Kalınlıgını 9 olarak giriyorum

      stroke(30,250,60); // Çizgimin rengini yeşil olarak atıyorum.

      translate(width/2,height-height*0.074); // başlangıç koordinatlarını yeni konuma taşı diyorum

      line(0,0,(height-height*0.12)*cos(radians(iaci)),-(height-height*0.12)*sin(radians(iaci))); // açıya göre çizgi çek diyorum.

      popMatrix(); // Çizgiyi kordinat sistemindeki ilk haline getir diyorum

    }

    void drawText() { // Burda yazıları ekranda çiz diyorum

     

      pushMatrix(); //  Yazdıgımız yazıları  kordinat sisteminde göster diyorum

      if(iuzaklik>40) { // Eger uzaklık 40dan büyükse

      obje = "Menzil Disinda"; //Objeyi "menzil dışında" olarak yazdır diyorum

      }

      else { // Haricinde, 40dan küçükse

      obje = "Menzil Icinde"; // Objeyi "menzil içinde" olarak göster diyorum

      }

      fill(0,0,0); // siyah rengiyle doldur diyorum.

      noStroke(); // Kalınlık bildirmiyorum.

      rect(0, height-height*0.0648, width, height); // rect komutuyla yazıların buluncagı alana dikdörtgen çizdiriyorum

      fill(220,20,15);  // Burada yeşil renk tanımlıyorum ve çizdiriyorum

      textSize(15); // Yazıların boyutlarını 15 olarak giriyorum

     

      // Ekranda buluan yazıların ayarlamaları

      text("10cm",width-width*0.3854,height-height*0.0833); // Radarın göstergesinde yazan "10cm" yazısının konumunu ayarlıyorum

      text("20cm",width-width*0.281,height-height*0.0833);  // Radarın göstergesinde yazan "20cm" yazısının konumunu ayarlıyorum

      text("30cm",width-width*0.177,height-height*0.0833);  // Radarın göstergesinde yazan "30cm" yazısının konumunu ayarlıyorum

      text("40cm",width-width*0.0729,height-height*0.0833); // Radarın göstergesinde yazan "40cm" yazısının konumunu ayarlıyorum

      textSize(25); // Radar göstergesinde olan yazıların boyutlarını 25 olarak tanımlıyorum

      text("Obje: " + obje, width-width*0.875, height-height*0.0277);   // Yukarda gösterdigim objeyi Ekranın altında Obje olarak yazdırıp konumunu ayarlıyorum

      text("Aci:  " + iaci +" °", width-width*0.508, height-height*0.0277);  // Yukarda gösterdigim açiyi Ekranın altında açi olarak yazdırıp konumunu ayarlıyorum

      text("Uzaklık:    ", width-width*0.26, height-height*0.0277);  // Yukarda gösterdigim uzaklıgı Ekranın altında uzaklık olarak yazdırıp konumunu ayarlıyorum

      if(iuzaklik<40) {   // Eger uzaklık 40dan küçükse

      text("          " + iuzaklik +  "   cm", width-width*0.225, height-height*0.0277); // Ölçülen uzaklıgı gösterip yanına cm ekliyorum

      }

      textSize(15); //  Gösterdigim uzaklıgın boyutunu 15 olarak giriyorum

      fill(220,20,15); // Burdada rengini yeşil olarak giriyorum.

      translate((width-width*0.4994)+width/2*cos(radians(30)),(height-height*0.0907)-width/2*sin(radians(30)));  // başlangıçda verdigim  30 derece açısını yeni konuma taşı diyorum.

      rotate(-radians(-60)); //Radyan 60 olarak verdigim açıyı döndür diyorum

      text("30°",0,0);   // Yazdırdığım 30 derecelik açıya "30" yaz diyorum

      resetMatrix(); //Kordinat sistemini tekrar sıfırla diyorum

      translate((width-width*0.503)+width/2*cos(radians(60)),(height-height*0.0888)-width/2*sin(radians(60))); // başlangıçda verdigim  60 derece açısını yeni konuma taşı diyorum.

      rotate(-radians(-30)); //Radyan 30 olarak verdigim açıyı döndür diyorum

      text("60°",0,0);  // Yazdırdığım 30 derecelik açıya "60" yaz diyorum

      resetMatrix(); //Kordinat sistemini tekrar sıfırla diyorum

      translate((width-width*0.507)+width/2*cos(radians(90)),(height-height*0.0763)-width/2*sin(radians(90))); // başlangıçda verdigim  90 derece açısını yeni konuma taşı diyorum.

      rotate(radians(0)); // Yazdırdığım 0 derecelik açıyı döndür diyorum

      text("90°",0,0);  // Yazdırdığım 30 derecelik açıya "90" yaz diyorum

      resetMatrix(); //Kordinat sistemini tekrar sıfırla diyorum

      translate(width-width*0.513+width/2*cos(radians(120)),(height-height*0.07129)-width/2*sin(radians(120))); // başlangıçda verdigim  120 derece açısını yeni konuma taşı diyorum.

      rotate(radians(-30)); //Radyan 30 olarak verdigim açıyı döndür diyorum

      text("120°",0,0);  // Yazdırdığım 30 derecelik açıya "120" yaz diyorum

      resetMatrix();  //Kordinat sistemini tekrar sıfırla diyorum

      translate((width-width*0.5104)+width/2*cos(radians(150)),(height-height*0.0574)-width/2*sin(radians(150))); // başlangıçda verdigim  150 derece açısını yeni konuma taşı diyorum.

      rotate(radians(-60)); //Radyan 60 olarak verdigim açıyı döndür diyorum

      text("150°",0,0);  // Yazdırdığım 30 derecelik açıya "150" yaz diyorum

      popMatrix();  //Kordinat sistemini tekrar sıfırla diyorum

    }


Yaptığımız Radar Projesinde bir Lcd panel kullanmadığım için direk radarın görüntüsünü bilgisayar veya laptop ekranına yansıtacağım için Proccesind adlı uygulamayı kullandım ve Processing uygulamasında radarın görüntüsü bu şekilde;





Radarın Çalışması


Paylaş

Benzer Yayınlar

Arduino ile Radar yapımı
4/ 5
Oleh

Abone Olun!

Yazımı Beğendiniz mi? Abone Olun Yayınları Kaçırmayın.