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