Arduino ve Joystick ile Servo Motor Kontrolü – 1
Servo Motor ve Joystick – Bölüm 1
Servo kelimesi Latince “servus” köle-servis eden kelimesinden türetilmiş, daha sonra değişik formatlarda servo mekanizması, servo motor gibi kullanılmaya başlanmıştır. Bu anlamda da, bizim verdiğimiz emri yerine getiren bir elektronik/mekanizmadan bahsediyoruz. Servo deyince akla hemen servo motorlar gelir. Ancak araçlardaki fren sistemi de bir servo mekanizmasıdır. Bununla birlikte büyük CNC makinaları da servo sistemi ile çalıştırılır. Küçük CNC veya 3D yazıcılar da farklı teknoloji kullansalar da (StepMotor) adımları sayıp pozisyonlama yaptığımızdan bir servo sisteminden bahsetmek mümkün.
Bugün en yaygın servo motorlar dairesel hareketli olanlarıdır. Ancak bunların düzlemsel hareketlileri de mevcuttur.
Servo motorlar daha önceleri, ciddi paralar verilerek alınan malzeme iken günümüzde, küçük işler için çok daha küçük rakamlara almak mümkün.
Teknik olarak servo motor aslında analog bir sistemdir. Fakat dijital sistemde kullanabilmek için bir takım standartlar ve sistemler oluşturulmuştur. Bunu anlayabilmek için servo motorun analog kısmını en basit şekli ile inceleyelim. Elimize bir redüktörlü motor alalım ve motor mili ucuna, bir ayarlı direnç bağlayalım. Motor döndüğünde ayarlı direnci çevirsin. Ayarlı direncin bir ucunu +12Volta diğer ucunu -12 Volta bağlayalım. Bu ayarlı direncimize P1 diyelim. Şimdi de +-12V ile çalışan bir sürücü amfi alalım ve motorun + bağlantısına amfinin çıkışına motorun eksi ucunu da 0(sıfır) volta bağlayalım. Şekilde görüldüğü gibi.
Amfimiz (pembe olan) örnek 5X amplifikasyon yapsın. Şimdi şemaya baktığımızda P2 orta pozisyonda iken 0 volt verecektir. P1 de orta pozisyonda olduğundan o da 0 Volt verecektir. Dolayısı ile amfi girişimiz 0Voltta olacaktır ve çıkışı da 0V X 5 = 0 volt verecektir. Motorun diğer ucu da 0 Voltta olduğu için motor kıpırdamayacaktır. P2’yi yukarı doğru aldığımızda örnek +3V yaptığımızda amfi girişini +3Volta doğru çekecektir. Amfi çıkışı da +3V X 5 =+15 Volt olmaya zorlanacaktır fakat en fazla 12V verebileceğinden motora +12V verecektir ve motor örnek (motor bağlantısına bağlı olarak) sola saat yönünün tersine dönmeye başlayacak. Böylece P1’i -12V yönünde çevirecektir. Fakat P1 -3V’ta geldiğinde amfi girişi yine (+3V)+(-3V) = 0V olacağından amfi çıkışı 0V olacak ve motor duracaktır.
Şimdi burada biz bir pozisyonlama gerçekleştirdik. Tabi bu pozisyonlama diğer yönde olduğunda işlem tersine olacak ve diğer yönde işleyecektir. Yani görüldüğü gibi bizim P2 ile yaptığımız bir hareketi P1, Motor ve Amfi yardımı ile motorun gücüne dayalı olarak çok daha güçlü bir pozisyonlamayı gerçekleştirebiliyoruz. Eğer P2 yerine bir voltaj kaynağı kullanırsak sistemi voltaj ile yönetebiliriz. Pratikte de bu böyle oluyor. Yine pratikte sistem, +-12V yerine 0-5V veya 0-12V kullanır.
Voltajla yönetme konusuna gelindiğinde pratikte durum karmaşıklaşıyor. Zira hangi voltajla yöneteceğiz, uzak mesafelerden kontrol voltajı aktardığımızda parazit ne olacak. Buna üreticiler çare bularak bir standart koymuşlar. Hemen servo motor üreticilerinin tamamı da bu standartlara uyuyor. Burada sihirli kelime “PWM” Pulse genliği modülasyonu. PWM dijital dünyada zamana bağlı olduğundan en kolay yönetilebilen tekniktir. Günümüzde de mikro işlemcilere birçok kütüphaneler mevcut. Buradaki servo motorlar için standart şu şekildedir. PWM frekansı 50Hz. Yani Pulse genlik tekrarı 20milisaniye. Servo motorun en düşük pozisyonu için 1milisaniye genlik en yüksek pozisyon için 2milisaniye genlik ve orta pozisyon için 1,5milisaniye genlik olarak tanımlanmış.
Servo motorumuza bu sinyalleri verdiğimizde Servo motorlarının kolunu (yabancı Kaynaklarda “horn”-boynuz) pozisyonlarını dairesel olarak 0 ile 180 derece arasında hareket ettirir. Yani en düşük pozisyonu 1ms- 0 derece, orta pozisyonu 1,5ms – 90 derece ve en yüksek pozisyonu 2ms-180 derece. Bunu bir kenara yazalım.
Şimdi gelelim Servo motorlarının çeşitlerindeki farklara. Hani yukarıda bahsettiğimiz ‘motorun gücüne dayalı olarak’ demiştik. Servo motorlar belli güçleri hareket ettirmek için üretilmiştir. Bu ölçü Newton-metre, Newton-cm veya kg-cm cinsinden verilmiştir. (10Newton yaklaşık 1Kg) Burada bunu anlayabilmek için Direnc.net sitesinden aldığımız SG90 tipi bir servo motor üzerinden örnekleyelim.
Verilen bilgiye göre TORK 4,8Volt ile çalıştırıldığında 1,3kg*cm. Yine yüksüz 4,8V ile çalıştırıldığında 60 derece hareketi 0,12 saniyede gerçekleştirir.
Bu bilgileri şu şekilde anlamak gerekir; 1 cm kola 1,3kg ağırlık bağlandığında bu ağırlığı hareket ettirebilir. Kolu 10cm yaparsak 0,13kg ağırlığı hareket ettirebilir. Dolayısı ile kol uzadıkça hareket mesafesi uzar. Fakat aynı zamanda kolun uzunluğu ile hareket ettireceğimiz güç te düşer. Yani Servo motor seçimi yaparken öncelikle hareket mesafesi, çekeceğimiz yük bilinmeli ve Servo motor ona göre seçilmelidir.
İkinci konu ise bu hareketi ne kadar sürede gerçekleştirecek. Verilen veri, yüksüz 60 dereceyi 0,12saniyede tamamlaması yönünde bu ortalama bir veri yani buradan yola çıkarak 10 dereceyi 0,02 saniyede gerçekleştirecek diye bir kural yok zira içi mekanizma/elektronik devredeki yapı, ivme ve fren yapısı bu zamanı kısıtlar. Bir de tabii Yük faktörü devreye giriyor. Ne kadar fazla yük yüklersek bu zaman düşüyor. Servo hızını biraz deneme yanılma ile bulmak gerekiyor.
Son olarak Servo motor beslemesine dikkat etmek gerekiyor. Zira yüklü bir küçük bir servo motorun çektiği akım anlık olarak 3-4 amperlere çıkabilir.
Gelelim SG90 Servo motorunun Arduino ile kullanımına. Servo motorlarının Arduino ile kullanımı çok kolay. Arduino UNO ile bile ortamdaki (IDE) kütüphane sayesinde 12 servo motora kadar kontrol edebiliyorsunuz. Arduino mega ile bu sayıyı daha da yükseltebiliyorsunuz. Servo motorlar PWM kullanıyor demiştik. Eee, Arduino UNO da kısıtlı sayıda PWM pimi var nasıl oluyor da 12 servo yönetilebiliyor. Bunun cevabı; Servo motorlar için kullanılan PWM göreceli çok düşük frekansta 50Hz ve ayrı ayrı frekansta olması da söz konusu değil. Dolayısı ile standart PWM Kütüphanesi fazla gelecektir. Bu yüzden her dijital pimin kullanılabileceği ayrı bir kütüphane yazılmış.
Şimdi SG90 servo motorumuzu bir 4,5V-6V aralığında bir güç kaynağına ve kontrol pimini de Arduino dijital pim 9’a bağlayalım.
Arduino ortamında yeni bir “sketch” yapalım. Öncelikle Sketch->Include Library->Servo menülerinden Servo kütüphanemi ekleyelim.
Bu kütüphanede kullanabileceğimiz 6 adet komut/fonksiyon bulunuyor. Bunlar attach(), write(), writeMicroseconds(), read(), attached() ve detach().
Fonksiyon attach(pin, max,min) veya attach(pin) burada pin arduinonun hangi pinine bağlandığıdır, min. parametresi servonun 0 pozisyonunda kaç mikro saniye olduğunu belirler. Varsayılan 544 mikro saniye, max parametresi ise pozisyon 180 derece için pulse genliğinin kaç mikro saniye olacağıdır. Varsayılan değer 2400mikrosaniyedir. Bazen servo motorlar varsayılan değerler ile 0 derece ve/veya 180 dereceye ulaşamıyor. Böyle durumlarda biraz ayar gerektirdiği zaman min ve max değerlerini ayarlamak gerekebiliyor. Yoksa normalde attach(pinno) yetiyor.
Bağlantıyı koparmak için veya PWM sinyalini durdurmak için aynı şekilde detach() kullanılır. Bazen bağlantının varlığını sorgulamak gerektiğinde ise attached() komutu kullanılabilir.
Bunların yazılımda kullanım şekli “syntax”ı şu şekilde; servom.attach(9); servom.detach() gibi.
Bunlardan en çok kullanılan komut write(pozisyon) komutu. Pozisyon parametresi 0 ile 180 arası bir değer olması gerekiyor. Burada çözünürlük 1 derecedir. Çoğu iş için bu çözünürlük yeterli oluyor. Yukarıda belirttiğimiz gibi pozisyonlar tutmaz ise attach() komutundaki min max ile ayarlanmalıdır.
Son yazılan pozisyon değerini okumak için read() komutu kullanılıyor.
writeMicroseconds(mikrosaniye) komutu servonun biraz daha hassas kontrolünü sağlıyor. Burada pulse genişliğinin kaç mikrosaniye olacağını belirleyebiliyoruz. 0 derece için, parametreye 1000, 180 derece için 2000 yazdığımızda servo da bu değerlere göre pozisyon alıyor. Görüldüğü gibi 1000 ile 2000 derece arası 1000 farklı pozisyon yapabiliyoruz. Çözünürlük teoride 0,18 derece. Örnek sketch; yukarıdaki bağlantıya göre en sağdan en sola döndürülen bir servo motoru.
#include <Servo.h>
Servo servom; // servoyu kontrol için yeni bir servo objesi yarat
// Her bağladığımız servo için bir obje oluşturmamız gerek
// çoğu Arduino da 12 servoya kadar yaratılabilir.
int pozisyon = 0; // servo pozisyonunu kontrol için değişken deklarasyonu
void setup()
{
servom.attach(9); // servo kontrol pimi arduinonun 9’uncu pimine bağlıyoruz
}
void loop()
{
for(pozisyon = 0; pozisyon <= 180; pozisyon += 1) // Sıfır dereceden 180 dereceye kadar
{ // bir derece aralıkla dönüyoruz
servom.write(pozisyon); // Servoya pimine bu pozisyonu yazıyoruz
delay(15); // 1 derecelik hareketi gerçekleştirmesi için biraz zaman veriyoruz
}
for(pozisyon = 180; pozisyon>=0; pozisyon-=1) // şimdi de ters yöne 180 dereceden sıfır dereceye dönüyoruz
{
servom.write(pozisyon); // servoya değerin yazılmasını sağlıyoruz
delay(15); // yine servonun bunu gerçekleştirmesi için zaman veriyoruz.
}
}
Son olarak Servo kullanımında dikkat etmemiz gereken bir konu Servonun hızı. Eğer bir pozisyondan başka bir pozisyona gidip geri gelmesi için servoya zaman vermediğimiz takdirde Servo gideceği pozisyonu tamamlayamadan geri dönmeye çalışacaktır. Ve yine zaman vermeden gitmesini talep edersek servo zavallı iki arada bir derede kalacaktır ve titremeye başlayacaktır.
Onun için her pozisyon değiştirmede makul bir bekleme zamanı verilmelidir.
Kolaylar gelsin
Murat Tanatar
Kullanılan ürünler:
Arduino Uno R3 SMD Model için buraya tıklayınız.
Arduino Uno R3 DIP Model için buraya tıklayınız.
0 Yorumlar