BP–08 · Başlangıç projesi

Potansiyometre ile Servo Motor

Robot kollarından RC uçakların kanatçıklarına kadar hassas hareket gereken her yerde servo motorlar vardır. Bu projede Servo kütüphanesini kullanarak bir potansiyometreyle servo motoru istediğimiz açıya döndüreceğiz.

SeviyeBaşlangıç
Süre30 dk
Malzeme7 çeşit
Servo.hKütüphane kullanımıNesneattach()write()Açı kontrolü

Proje hakkında

Normal bir DC motor enerji verildiği sürece döner. Servo motor ise içindeki küçük bir potansiyometre ve kontrol devresi sayesinde konumunu bilir ve kendisine söylenen açıya gidip orada durur. SG90 gibi hobi servoları 0 ile 180 derece arasında hareket eder.

Bu projede ilk kez bir kütüphane kullanacağız. Servo kütüphanesi, servo motorun anladığı özel sinyali üretme işini bizim yerimize yapar. Biz sadece "90 dereceye git" deriz. Potansiyometreyi çevirdikçe servo kolunun da aynı oranda döndüğünü göreceksiniz; bu, robot kolu projelerinin temelidir.

  • Servo motorların iç yapısını ve PWM kontrol sinyalini
  • Arduino kütüphanesini projeye eklemeyi
  • Nesne oluşturup fonksiyonlarını çağırmayı
  • Analog bir girişi açı değerine dönüştürmeyi

Malzeme listesi

Projeyi tamamlamak için aşağıdaki 7 çeşit malzemeye ihtiyacınız var. Parçaların çoğu Arduino başlangıç setlerinde hazır olarak bulunur.

Arduino Uno R3 1 adet

Projenin beyni. Nano veya Mega ile de aynı kod çalışır.

Breadboard 1 adet

Lehimsiz devre kurmak için yarım boy (400 delik) yeterlidir.

SG90 mikro servo motor 1 adet

Plastik dişli, 9 g, 0–180°. Pakette çıkan kollar (horn) dahil.

10 kΩ potansiyometre 1 adet

Döner tip, 3 bacaklı.

100 µF elektrolitik kondansatör (önerilir) 1 adet

Servo ani akım çektiğinde beslemeyi dengeler.

Jumper kablo (erkek-erkek) 7 adet

USB A-B kablosu 1 adet

Kodu yüklemek ve kartı bilgisayardan beslemek için.

Devre bağlantıları

Bağlantıları USB kablosu takılı değilken yapın. Her satır, bileşenin hangi bacağının Arduino'nun hangi pinine gideceğini gösterir; çizgi rengi önerilen kablo rengidir.

Servo kahverengi kabloGNDToprak
Servo kırmızı kablo5VBesleme
Servo turuncu kabloD9Kontrol sinyali
Potansiyometre sol bacak5V
Potansiyometre orta bacakA0
Potansiyometre sağ bacakGND
Kondansatör + / −5V / GNDUzun bacak +, şeritli taraf −
Servo kablo renkleri markaya göre değişebilir. Genel kural: koyu renk (siyah veya kahverengi) GND, ortadaki kırmızı 5V, açık renk (sarı, turuncu veya beyaz) sinyaldir.

Adım adım kurulum

  1. Servo kolunu takın

    Pakette çıkan tek kollu plastik parçayı servonun miline bastırın. Vidayı şimdilik sıkmayın.

  2. Servoyu bağlayın

    Servo kablosunun ucuna üç jumper kablo takarak kahverengiyi GND hattına, kırmızıyı 5V hattına, turuncuyu D9'a bağlayın.

  3. Kondansatörü ekleyin

    100 µF kondansatörü breadboard'un 5V ve GND hatları arasına takın. Şeritli (−) tarafın GND hattına gelmesine dikkat edin.

  4. Potansiyometreyi bağlayın

    Uç bacakları 5V ve GND hatlarına, orta bacağı A0 pinine bağlayın.

  5. Kodu yükleyin

    Servo kütüphanesi Arduino IDE ile birlikte gelir; ek kurulum gerekmez. Kodu yükleyin.

  6. Hareketi test edin

    Potansiyometreyi bir uçtan diğerine yavaşça çevirin. Servo kolu da 0° ile 180° arasında aynı yönde dönmeli.

  7. Kolu hizalayın

    Potansiyometreyi ortaya getirip servoyu 90°'ye konumlandırın. Kolu çıkarıp yatay konumda yeniden takın ve vidayı sıkın.

Arduino kodu

Kodları Arduino IDE'ye yapıştırıp yükleyebilirsiniz. Türkçe karakterler yalnızca yorum satırlarında kullanıldı; Seri Port Ekranına yazdırılan metinlerde bilerek kullanılmadı.

Potansiyometrenin konumunu servo açısına dönüştüren kod.

servo_pot.ino
// Potansiyometre ile Servo Motor Kontrolü
// RobotikHocasi.com

#include <Servo.h>      // Servo kütüphanesini ekle

Servo servoMotor;       // Servo nesnesi oluştur

const int potPin = A0;
const int servoPin = 9;

void setup() {
  servoMotor.attach(servoPin);   // Servoyu D9 pinine bağla
  Serial.begin(9600);
}

void loop() {
  int potDegeri = analogRead(potPin);           // 0 - 1023
  int aci = map(potDegeri, 0, 1023, 0, 180);     // 0 - 180 derece

  servoMotor.write(aci);                         // Servoyu açıya götür

  Serial.print("Aci: ");
  Serial.println(aci);

  delay(15);   // Servonun konuma ulaşması için kısa bekleme
}

Bonus: Potansiyometre olmadan servo motorun kendi kendine ileri geri taraması.

servo_tarama.ino
// Servo tarama (sweep) hareketi
#include <Servo.h>

Servo servoMotor;

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

void loop() {
  for (int aci = 0; aci <= 180; aci++) {
    servoMotor.write(aci);
    delay(15);
  }
  for (int aci = 180; aci >= 0; aci--) {
    servoMotor.write(aci);
    delay(15);
  }
}

Kod açıklaması

#include <Servo.h>

Servo kütüphanesini projeye dahil eder. Kütüphaneler, başkalarının yazdığı ve hazır kullanabileceğimiz kod paketleridir.

Servo servoMotor;

Servo türünde servoMotor adında bir nesne oluşturur. Birden fazla servo için servo1, servo2 gibi ayrı nesneler oluşturabilirsiniz.

servoMotor.attach(servoPin)

Nesneyi fiziksel bir pine bağlar. Bu satırdan sonra kütüphane D9 pininden sürekli kontrol sinyali üretmeye başlar.

servoMotor.write(aci)

Servoya hedef açıyı bildirir. Servo motor bu açıya gider ve yük altında bile orada kalmaya çalışır.

delay(15)

Servo 60 dereceyi yaklaşık 0,1 saniyede döner. Kısa bir bekleme, sinyal gönderme hızını servonun takip edebileceği seviyede tutar.

Nasıl çalışır?

Servo motor, her 20 milisaniyede bir gelen bir darbeyle kontrol edilir. Darbenin genişliği hedef açıyı belirler: yaklaşık 1 ms genişliğinde darbe 0°, 1,5 ms 90°, 2 ms 180° anlamına gelir. Servo kütüphanesi write() ile verdiğimiz açıyı bu darbe genişliğine çevirir.

Servonun içinde küçük bir DC motor, bir dişli kutusu, mile bağlı bir potansiyometre ve bir kontrol devresi bulunur. Kontrol devresi, potansiyometreden okuduğu mevcut açıyı istenen açıyla sürekli karşılaştırır ve fark sıfır olana kadar motoru döndürür. Bu yapıya kapalı çevrim kontrol denir.

Sorun giderme

Servo titriyor veya tıkırdıyor
Besleme yetersiz kalıyor olabilir. 100 µF kondansatörü ekleyin; birden fazla servo kullanıyorsanız harici 5V güç kaynağı kullanın (GND'ler ortak olmalı).
Arduino servo hareket edince yeniden başlıyor
Servo ani akım çekip USB beslemesini düşürüyor. Kondansatör ekleyin veya servoyu harici bir kaynaktan besleyin.
Servo uç noktalarda zorlanıp vınlıyor
Bazı servolar tam 0° veya 180°'ye ulaşamaz. map() satırında aralığı 10–170 yaparak mekanik sınırları zorlamayın.
Servo hiç hareket etmiyor
Turuncu sinyal kablosunun D9'a, kırmızının 5V'a takılı olduğunu kontrol edin. Kodda attach() satırının unutulmadığından emin olun.

Geliştirme fikirleri

Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.

Joystick kontrollü robot kol

İki eksenli bir joystick ve iki servo ile basit bir pan-tilt mekanizması yapın.

Analog gösterge

Servoya bir ibre takın ve sıcaklığı veya ışık seviyesini kadranda gösterin.

Otomatik kapı

Mesafe sensörüyle birleştirip yaklaşan kişiye kapı açan bir sistem yapın.

Konum hafızası

Bir butona basınca mevcut açıyı kaydedip başka bir butonla o açıya geri dönün.

Sık sorulan sorular

SG90 ile MG90S arasındaki fark nedir?
MG90S metal dişlilidir ve daha dayanıklıdır, ama aynı bağlantı ve kodla çalışır. Robot kolu gibi yük taşıyan projelerde MG90S tercih edilir.
Kaç servo bağlayabilirim?
Servo kütüphanesi Uno'da 12 servoya kadar destekler. Ancak bu kadar servoyu mutlaka harici bir güç kaynağıyla beslemelisiniz.
360 derece dönen servolar nasıl çalışır?
Sürekli dönüşlü servolarda write(90) motoru durdurur, 0 tam hızla bir yöne, 180 tam hızla diğer yöne döndürür. Açı değil hız kontrol edilir.

Bir sonraki projeye hazır mısınız?

Başlangıç serisindeki 10 projeyi sırayla tamamladığınızda sensör, motor ve ekran kullanımının temellerini öğrenmiş olursunuz.

Başlangıç projelerine dön