Başlangıç > Robotik > Arduino ve Python ile Basit Radar Uygulaması – 1. Kısım

Arduino ve Python ile Basit Radar Uygulaması – 1. Kısım

Uygulama, Arduino ve Python olmak üzere iki taraflıdır. Arduino tarafında; SG90 servo motor ve HC-SR04 mesafe sensörü ile elde edilen veriler seri porta gönderilmektedir. Python tarafında ise bu veriler seri porttan okunup parse edilerek grafiksel olarak  gösterilmektedir. Bu kısımda Arduino tarafında yapılacaklar anlatılmaktadır.

Servo motorlar, gönderilen PWM sinyaller ile 0-180 derece arasında istenen açıda dönebilen ve robot teknolojisinde sıklıkla kullanılmakta olan motorlardır . SG90, besleme (+5V), toprak (GND) ve motorun açısını belirlemede veri göndermek üzere kullanılan 3 kabloya sahiptir. Besleme kırmızı, toprak kahverengi ve diğer veri kablosu ise turuncu renktedir. Veri kablosu Arduino’nun PWM pinlerine bağlanarak istenen açı için uygun PWM sinyalinin motora gönderilmesi gerekmektedir. SG90’nın veri sayfalarında (datasheet) bu sinyalin nasıl ve ne kadar süre ile gönderileceği belirtilmiştir:

Uygun kodlama yapılarak veya Arduino ile hazır gelen <Servo.h> kütüphanesi kullanılarak SG90 kontrol edilebilmektedir.

SG90’na takılan bir HC-SR04 ile ölçülen mesafe bilgileri seri porta aktarılmaya hazırdır. Kaynak kodumuz şu şekildedir:

#include <Servo.h>

int trig = 11; //HC-SR04 trig pini
int echo =  12; //HC-SR04 echo pini

long sure, mesafe;

int i;
String veri="";

Servo myServoMotor;

void setup ()
{
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);

  myServoMotor.attach(9); //SG90 PWM kablosu 9.pinde
  Serial.begin(9600);
}

long mesafeHesapla()
{
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  sure = pulseIn(echo, HIGH, 23280); //timeout 400cm
  mesafe = sure / 29.1 /2;
  return mesafe;
}

void loop()
{  
  /*Seri porta gönderilecek örnek veri
    i:75;m:36 biçimindedir. 
    75 açı pozisyonu, 36 ise ölçülen mesafedir.*/  
  
  /*SG90 sola doğru 1'er derece 
    artışla dönsün. Her açıda 
    mesafe ölçülsün*/
  for (i = 0; i<180; i++) 
  { 
    myServoMotor.write(i); 
    veri += "i:";
    veri += i;
    veri += ";";
    veri += "m:";
    veri += mesafeHesapla();
    
    Serial.println(veri); 
    delay(125); 
    veri = ""; 
  } 
   
  /*SG90 sağa doğru 1'er derece 
    artışla dönsün. Her açıda 
    mesafe ölçülsün */ 
  for (i = 180; i>0; i--)
  {
    myServoMotor.write(i);
    veri += "i:";
    veri += i;
    veri += ";";
    veri += "m:";
    veri += mesafeHesapla();
    
    Serial.println(veri);        
    delay(125);
    veri = "";
  }
    
}

Kaynak koda öncelikle <Servo.h> kütüphanesi dahil edilmiştir. Servo motorun her açı pozisyonunda mesafeyi ölçebilmesi için mesafeHesapla() fonksiyonu yazılmıştır. pulseIn() fonksiyonunun varsayılan timeout süresi 1 saniyedir. Program akışı HIGH sinyal gelmediğinde bu kadar bekleyeceğinden bu süre 400cm’ye karşılık gelecek şekilde düşürülmüştür.

SG90’nın 1’er derece sola ve sağa dönüşleri for döngüsü ile yapılmıştır. Her derecede 125 ms bekleme süresi Python turtle modülünün grafik işlemlerini yavaş yapmasından dolayıdır. Pyhton tarafında grafik işleme; Arduino tarafında servo ve HC-SR04 ile senkronize çalışacağından bu bekleme süresi uygun şekilde ayarlanmalıdır. Böylece servo dönüş hızının da arttırılması mümkündür.

Her açı pozisyonunda ölçülen mesafe seri porta “i:75;m:36” biçiminde satır satır aktarılmaktadır. Burada i açı, m ise cm türünden ölçülen mesafedir. Python tarafında bu veri seri porttan okunup parse edilerek (ayrıştırılarak) grafiğe aktarılmaya artık hazırdır.

 

Kaynakça
http://www.robotiksistem.com/servo_motor_ozellikleri.html
http://www.elektrikrehberiniz.com/elektrik-motorlari/servo-motor-nedir-526/
https://gelecegiyazanlar.turkcell.com.tr/konu/arduino/egitim/arduino-301/servo-motor
http://www.micropik.com/PDF/SG90Servo.pdf
https://www.arduino.cc/en/Reference.PulseIn

  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Yorum bırakın