Servo motorun kontrolü üzerinde internette çok sayıda bilgi mevcut. Ama genelde hepsi birbirine benziyor. Bu bilgilerle de tüm servo motor uygulamalarımızı yapamıyoruz. Bu yazımızda bu eksikliği gidermek ve servo motor kontrolünün temellerini anlatmak için çaba göstereceğiz.

Adafruit motor seçim kılavuzu hazırlamış. Projenizde hangi motoru kullanacağınıza karar vermediyseniz incelemenizi öneririm. Rehber için tıklayın.

Servo motor nedir?

Kısaca açısal motordur. Bu konuda internette bol bilgi mevcuttur. Bu yüzden bu yazımızda yer vermeyeceğiz.

Servo motor test devresi

Aşağıda 10 liraya satılan bir servo motor test cihazı var. Bunu alabilirsiniz.

servo-motor-tester

Yukarıdaki cihazı almak istemeyenler için 555 kullanılan basit bir devreyi kendiniz de yapabilirsiniz. Elektronik devre şeması aşağıda:

1- Servo motorun potansiyometre ile kontrol edilmesi

Bu uygulama temel servo kontrol uygulamalarından birisidir. Bu uygulamayı yapmak için arduino kullanmalısınız. Tabii ki farklı denetleyicilerle de yapılabilir.

Aşağıdaki video’dan nasıl kullanıldığını görebilirsiniz:

Potansiyometre bağlantı şeması:

Türkiye’nin en ayrıntılı potansiyometre kullanımı konusuna gitmek için tıklayın.

Servo motor bağlantı şeması:

Servo motorlarda 3 bağlantı ucu var.  Bunlar: +Besleme (4-6 Volt arası genelde), – besleme(GND) ve sinyal ucu. Servo motorunuzun üzerinde yazan markayı internette aradığınızda bağlantı şeması, tork, pin isimleri gibi bilgileri bulabilirsiniz.

Arduino Kodu:

//include the servo library
#include   <Servo.h>
//create a servo object 
Servo servo1;  
// declare the pins to which the servo and potentiometer is connected. 
const int servoPin = 3;
const int pot = 0;
int potValue;
void setup() {
  //associate servo1 to pin 9 on the Arduino 101
  servo1.attach(servoPin);
  
}
void loop() {
  // put your main code here, to run repeatedly:
    potValue = analogRead (pot);
    // linearly scale the value of the sevo output from the 0 to 1023 range of the potentiometer
    // to the angle limits by the servo which is 0 to 180 degrees
    potValue = map(potValue, 0, 1023, 0, 180);
    // record the now-adjusted value of the potentiometer to the servo motor
    servo1.write(potValue);
}

Kod analizi:

Uzun uzun kod analizi yapmaya gerek görmüyorum. Kısaca, Servo.h kütüphanesini kullanmış. Bu kütüphane şurada:

https://www.arduino.cc/en/Reference/Servo

Bu kütüphanede;

  • attach()
  • write()
  • writeMicroseconds()
  • read()
  • attached()
  • detach()

fonksiyonları tanımlanmış. Yukarıdaki kodda; write kullanılmış.

“servo1.write(potValue);” Burada pot’un değerini al ve Servo1’e gönder denilmiş. Potun değerine göre servo hareket edecek. Siz de pot yerine ldr, ptc gibi sensörler kullanabilirsiniz. Işığa, sıcaklığa vb.. göre servo motorun açısını değiştirebilir ve bunu çeşitli projelerde kullanabilirsiniz.

Servo motor ile ilgili tek kütüphane servo.h değil. Bu kütüphanenin fonksiyonları yeterli gelmiyorsa github üzerinde farklı servo kütüphaneleri de var. Onları kullanabilirsiniz. Servo motoru arduino’ya doğrudan bağlamak yerine motor sürücü kullanıyorsanız, sürücü adıyla bir kütüphane arayın. O sürücüye uyumlu olan kullanışlı bir servo kütüphanesi bulabilirsiniz.

Örneğin en çok kullanılan Adafruit firmasına ait L293D motor sürücü modülüne ait kütüphane şurada:

https://github.com/adafruit/Adafruit-Motor-Shield-library

2- Buton ile Servo Motor Kontrolü

Bu uygulamayı geçenlerde yaptık. Bir model evin kapısının açılması için servo motor kullanmıştık. Enerji gelince servo motor 10 derece civarında dururken, butona basınca 180 derece dönş yapıyor. 10 saniye sonra yine eski konumuna geliyor.

Buton bağlantısı için şu sayfada denilenleri yapın:

https://www.arduino.cc/en/Tutorial/Button

Arduino kodu:

#include <Servo.h> 

Servo myservo;

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  { 
  myservo.attach(9);
  myservo.write(170);  // set servo to mid-point
  { 
} 
} 
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
    myservo.writeMicroseconds(700);  // set servo to mid-point
    delay(10000);
    myservo.write(170);  // set servo to mid-point

  } else {
  myservo.write(170);  // set servo to mid-point

  }
}

Butonu 2 nolu pine, servonun sinyal ucunu ise 9 nolu pin’e bağlayın. Kodda led de var ama önemli değil. Biz öylesine ledin yanmasından butonun temas ettiğini anlayalım diye koyduk.

3- Servo motoru DC motor olarak kullanmak

Evet böyle birşey de var. Uygulamanızda DC motor gibi sürekli dönen bir sistem gerekiyorsa servo motoru dc motor olarak da kullanabilirsiniz. Bunu neden isteyeceğiniz size kalmış. Belki de dc motorun devir sayısını kontrol etmek servo motorun devir sayısını kontrol etmekten daha zordur.

Bu işlem için servo motorun içini açıp, dişlileriyle bir takım işlem yapmanız gerekiyor. İnternette bununla ilgili bol miktarda kaynak var. Bu yüzden burada ayrıntı vermeye gerek görmüyorum.

4- Hazır bir motor sürücü kullanarak servo motor kontrolü

Bir çok kişi için en uygun yöntem bu. Hazır bir arduino motor sürücü modülü kullanarak servo motor kontrolünü kolayca yapabilirsiniz.

Yukarıdaki resimde L293D motor sürücü modülü var. En yaygın kullanılanlardan birisi bu modül. Bir de aşağıdaki var.

Motor sürücü modülü alırken dikkat etmeniz gereken bazı şeyler var. Kullacağınız motorlar neler? Kaç tane kullanacaksınız? Kaç amper akım çekiyorlar? gibi… Ayrıca L293D sürücü modülü (mavi olan) doğrudan arduinonun üzerine geçirilebiliyor. Bu bakımdan daha kullanışlı.

Bu modüller adafruit irmasına ait. Firmanın bunlar hakkındaki dökümanlarını inceleyin:

L293D sürücü V1

L293D sürücü V2

” Instead of a L293D darlington driver, we now have the TB6612 MOSFET drivers with 1.2A per channel current capability (you can draw up to 3A peak for approx 20ms at a time). ” demişler. Sanırm bu herşeyi açıklıyor. Aynı anda 2 servo motoru bu modülle kontrol edebilirsiniz. Daha fazla servo motor kumanda etmek istoyrsanız ya bu modüllerden birden fazla kullanacaksınız ya da şunu kullanacaksınız:

16 kanal PWM servo sürücü

Bununla 16 adet servo motoru aynı anda kullanabilirsiniz. (PCA 9685 motor sürücü) Buna ait de bir kütüphane var. Ulaşmak için tıklayın.

Neyse en çok kullanılan modüle gelelim:

Örnek bir devreye bakalım.

Yukarıdaki gibi servo motor modülün servo1 pinlerine bağlanıyor. Bu modül de arduino üzerine oturtuluyor.

Arduino kodu:

Aşağıdaki AFmotor kütüphanesini indirip, example içerisindeki kodları inceleyiniz. Bu modül için birkaç kütüphane var. AF motor yeterli gelmezse pololu ya da bir bakın.

AFmotor kütüphanesini indir.

” Kütüphane ne demektir? ” diye merak ediyorsanız burayı biraz inceleyin: Tıklayın.

5- Accelerometre (ivme ölçer) ile servo motor kontrolü

Güzel bir proje yapılabilir bu özellikten. Instructables’de NodeMcu kullanılan güzel bir uygulama var.

Proje için tıklayın.

Bu uygulamayı NodeMcu yerine arduino + modül ile de yapabilirsiniz. AMa kod değişmeli.

5- PC üzerinden servo motor kontrolü

Lynxmotion’ın ürettiği SSC32 sürücüsünü kullanarak pc üzerinden programla birçok servo motoru aynı anda kumanda edebilmeniz mümkün.

Link: http://www.lynxmotion.com/p-395-ssc-32-servo-controller.aspx

Download kısmından programını indirebilirsiniz.

6- Servo motorun hız kontrolünün yapılması

Bazı uygulamalarda servo motorun hızını da ayarlama ihtiyacı hissedebilirsiniz. Bu işlemi yapmak için standart servo.h kütüphanesi yeterli olmayacaktır. Bu işlemi arduino ile yapacaklar için hazırlanmış özel bir kütüphane var:

VarSpeedServo kütüphanesi

Bu kütüphaneyi kullanarak servo motor hızı da değiştirebilmeniz mümkün. Kütüphane 8 servo motora kadar destekliyor.

Örnek kod:

#include <VarSpeedServo.h> 
 
VarSpeedServo myservo;    // create servo object to control a servo 
 
void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 
 
void loop() {
  myservo.write(180, 30, true);        // move to 180 degrees, use a speed of 30, wait until move is complete
  myservo.write(0, 30, true);        // move to 0 degrees, use a speed of 30, wait until move is complete
}

Yukarıda 1 servo motor kontrol ediliyor. 180 dereceyi 30 hızında dönmesi sağlanmış. Sonra da 0 noktasına 30 hızında dönmesi istenmiş.

Kütüphanenin github sayfasını incelerseniz daha birçok özelliğinin mevcut olduğunu görürsünüz.

7- Hexapod yapımında servo motor kullanılması

6 bacaklı örümcek robotlarda en az 12, çoğunda da 18 servo motor kullanılıyor. Bu robotların yapımında kullanılacak servo motor sürücünün en azından bu kadar sayıda servo motoru kumanda edebilmesi gerekiyor.

  • Bu işlemi yapabilecek birkaç ürün var piyasada. Bunlardan birisi Lynxmotion firmasının üretimi olan SSC-32U servo motor kontrol devresi. Yaklaşık 44 dolara satılan bir kontrol devresi bu. Ayrıca yine aynı firmanın ürettiği bilgisayar yazılımı ile de tüm servoları pc ile kontrol edebilmeniz de mümkün oluyor. Örneğin bu projede kullanılmış.
  • Daha ucuz bir servo sürücü istiyorsanız Adafruit firmasının ürettiği 16 kanal sürücüyü alabilirsiniz. PCA9685 adı verilen bu sürücüyü 25 -45 TL aralığında almanız mümkün. Örneğin şu projede kullanmışlar: Hexapod projesi
  • Servo sürücünüzü kendiniz de tasarlayabilirsiniz. Bunun için ServoBoard denilen açık kaynak bir devreyi kullanabilirsiniz.

Sitesinde tüm şemaları ve yazılımları var. Kaynak için tıklayın. 12 servoya kadar destekliyor. ServoBoard ile yapılmış bir örnek hexapod projesi şurada.

  • Servo motor sürücüsü kullanmadan da basit bir hexapod yapmanız mümkün. Böyle bir projede bir arkadaş 10 servoyu arduino üzerinden sürmüş. Bu projeyi görmek için tıklayın.

Burada sorun arduinonun besleyebileceği akımın sınırlı olması. Arduino’nun bir pininden 40 mA’den fazla akım geçmesi sakıncalı. Vcc, GND pinlerinden de 200 mA’i geçecek akım Atmega işlemcisini bozar. (Kaynak)

Servo motorların çektiği akım için datasheetlerine bakmalısınız. Bulamazsanız 1 tanesini bağlayıp ampermetre ile ölçüm yapabilirsiniz.

  • Son olarak da Pololu firmasının ürettiği 24 kanal servo kontrol devresni önerebilirim. 40 dolar civarında satın alabilirsiniz. Aynı zamanda bu sürücünün pc programını da sitelerinden ücretsiz indirebiliyorsunuz. Link

Sonuç:

Bu konuya yazılabilecek daha çok şey var ama bir yerde bitirmek gerekiyor. Daha fazla servo motor kontrol uygulaması için tıklayın.