DC motorlardan sonra şimdi de Arduino ile Servo motorların kullanımına bir göz atacağız. En çok kullanılan, ucuz ve belki de o sarı tekerlekli DC motorlar gibi özellikle popüler yapılmış olabileceğini düşündüğüm SG90 modeli. Hazır değinmişken şimdi çok popüler olan robotik/kodlama/Arduino işinin de suyunun çıkmaması, özel projelere dönüşmesi, yaratıcılığı geliştirmesini diliyorum. Çünkü aksi taktirde yine tüketici toplumunun metası haline dönüşme tehlikesi var. Birden herkes (ben de dahil) Arduino’cu oldu. Ama yeni birşeyler var mı? Yoksa hepimiz aynı şeyleri mi tekrarlayıp, tüketici olarak bizlere sunulan bunun gibi ürünleri mi tüketiyoruz! Benim gibi yaşını başını almış biri olarak umudum her zaman olduğu gibi gençlerde olacak.

Neyse dönelim artık konumuza. SG90 servo motorlar 10 TL civarında alınabiliyor. Motorla birlikte üç vida ve değişik başlıklar geliyor. Bu başlıklar kullanacağımız yere göre motorun başına takılarak kullanılıyor. İki büyük vida motoru bir yere sabitlemek için, üçüncü (daha küçük olan) ise başlığı motorun başına sabitlemek için kullanılıyor.

IMG_20190518_182647

 

Data Sheet’e bakınca çok fazla teknik özellik göremiyoruz. (http://www.ee.ic.ac.uk/pcheung/teaching/DE1_EE/stores/sg90_datasheet.pdf) Üç kablo ile bağlantı yapılıyor: Kahverengi olan GND, ortadaki kırmızı +5V ve sarı olan da veri kablosu.

kablo baglanti

Veri kablosu Arduino’dan PWM sinyali alıyor. Ama bu illaki Arduino’nun PWM bacaklarına bağlanacak diye bir şey yok. Bu motorlar sürekli değil 0-180° arası dönebiliyor, aslında -90° ile +90° arası. Kaç derece döneceklerini ise aldıkları verinin Duty Cycle (görev döngüsü) süresiyle algılıyor. Örneğin bu değer 1,5 ms ise servo tam ortada (0°),  1 ms civarındaysa en solda (-90°), 2 ms civarında ise en sağda (90°) oluyor.

Kullanım yerlerine gelince; baştaki izlediğiniz videodaki her türlü robot kollarda, bir şeyleri bu çalışma aralığında hareket ettirmek gereken tüm uygulamalarda (mesela gösterge panellerinde; hız, devir saati gibi) kullanılıyor.

göstergepaneli

SG90 bu türün en basit modeli. Daha güç gerektiren projelerde tabi ki daha güçlü modelleri kullanmanız gerekiyor. Mesela SG90’ın içindeki çarklar/dişliler plastik. Çok fazla zorlamamak gerekiyor. Ama bu haliyle de avantajı var; çok akım çekmiyor. Bir iki tane servo kullanıyorsanız direk Arduino çıkışına bağlayabiliyorsunuz. Ama daha çok servo kullanacaksanız yine motor sürücüye ihtiyacınız olacak.

GND ve +5V bağlantılarını yapıp, sarı kabloyu herhangi bir çıkışa (ben7 numaralı çıkışa bağladım) bağlıyoruz. Sonra Arduino IDE üzerinden; Örnekler/Servo/Sweep dosyasını açıyoruz. İki örnek var önce sweep! Koda bakalım: Girişte servo kütüphanesi çağrılmış. Bu kütüphane zaten IDE üzerinde yüklü. Sonra ‘myservo’ isimli bir servo nesnesi oluşturulmuş. İsmini siz değiştirebilirsiniz. Birden fazla servo kullanacaksanız hepsinin nesnesini ayrı ayrı oluşturmanız gerekli. Daha sonra ‘pos’ adlı bir tamsayı değişkeni oluşturulup, 0 ilk değeri atanmış. Bu servonun pozisyonunu gösteren bir değişken. Ve ilk değeri 0° olarak atanmış.

#include <Servo.h>
Servo myservo;
int pos = 0;

Setup kısmında servo’yu Arduino’nun hangi bacağına bağladığımızı belirtiyoruz. Örnekte 9 numaralı bacağa bağlanmış. (Biz 7 numaralı bacağa bağlamıştık; ya bağlantıyı 9’a almalı, ya da kodu ‘myservo.attach(7); ‘ olarak değiştirmeliyiz!)

void setup() {
myservo.attach(9);
}

loop kısmında ilk for döngüsü ile: pozisyon (pos) değişkenimiz 0° den 180° ye kadar her 15 ms’de birer birer birer artırılırken, ‘myservo.write(pos);’ komutu ile servo’nun bu pozisyona dönmesini sağlıyoruz.

void loop() {
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos);
delay(15);
}

Daha sonraki for döngüsü ise pozisyon değişkenimiz 180° den 0° dereceye kadar her 15 ms’de 1° azaltılarak servonun pozisyonu ayarlanıyor hepsi bu kadar.
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}

Döngüdeki zaman ve açıları değiştirerek sonuçları gözlemleyebilirsiniz.

İkinci örnek: Örnekler/Servo/knob ise servo motorun dönüş açısının bir potansiyometre ile ayarlanmasını gösteriyor. Programın başında yine Servo kütüphanesi çağrılıyor ve Servo nesnesi (myservo ismiyle) oluşturuluyor. Bir önceki örnekteki ‘pos’ değişkeninin yerine bir değer değişkeni ‘val’ atanıyor. Bu sefer ilk değer verilmedi, çünkü pottan okunacak. Ayrıca potansiyometrenin orta ucunun arduinonun hangi analog girişine bağlandığı belirtilmiş. Bu A0 bacağı (int potpin = 0;). Bu arada potun diğer iki ucunun biri GND, diğeri +5 Volta bağlanmalı. Setup kısmında yine servo’nun 9 numaralı bacağa bağlandığı belirtilmiş(myservo.attach(9);).bağlandığı bacak belirtilmiş.

Loop kısmında ise A0’dan değer okunarak ‘val’ isimli değişkene kaydedilmiş. Sonra 0-1023 arasında okunan bu değer, servo’nun açı olarak algılayacağı 0-180 arası değere dönüştürülmüş. Ve servo bu değer kadar döndürülüp 15 ms beklenmiş. Bu örnek de bu kadar.

void loop()
{
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 180);
myservo.write(val);
delay(15);
}

Bol projeli günler diliyorum…