Facebook RSS Feed
 

.NET Micro Framework: R/C Servo Motor Kontrolü

R/C Tipi servo motorlar genellikle uzaktan kumandalı helikopter, uçak ve arabalarda kullanılır. Aynı zamanda hassas konumlama gerektiren robotik uygulamalarda da yerlerini alırlar. Bir servo motorun görevi, aldığı sinyale göre motor milini istenilen açıya döndürmek ve o açıda sabit tutmaktır.

Servo Motorun Yapısı

Servo motorlar içlerinde
- hareket sağlamak için DC motor,
- konum algılamak için potansiyometre,
- motor hareketini yavaşlatmak ve güçlendirmek için redüktör
- ve istenilen pozisyonun sağlanması için kontrol devresi barındırır.

R/C servo motorlar 180 derece dönüş açısına sahiptir. Modifiye edilmiş modelleri ise sürekli dönebilirler. Potansiyometre, servonun çıkış miline bağlıdır ve milin o anki açısını kontrol entegresine iletir. Kontrol entegresi, mil istenilen açıya gelene kadar motoru döndürür. Dışarıdan gelecek etkilerde ise milin açısını sabit tutmak için ters yöne hareket sağlar.

-

R/C Servo motorların 3 kablosu bulunur. Genellikle kırmızı kablo +, siyah yada kahve kablo -, sarı yada turuncu kablo ise mikrodenetleyiciye bağlanacak kontrol (PWM) ucudur.

Prototip Bağlantısı

Uygulama geliştirirken kullanacağımız bağlantı düzeneği şemadaki gibi olmalıdır:

-

R/C Servolar aksi belirtilmediği takdirde 4.8 ile 6 Volt aralığında çalışır. Prototipimizi geliştirmek için 4 tane şarjlı yada alkalin kalem pil kullanmamız uygun olur. Pil kutusunun çıkışına bağlayacağımız 330uF 10V değerlerinde bir kondansatör ile daha verimli bir çalışma elde ederiz. Servo motorlar kısa süreli yüksek enerji çekerek voltaj dalgalanmalarına yol açar. Bu yüzden bilgisayarınızın USB kablosundan geliştirme kartınıza gelen 5V'luk elektriği motorunuza bağlamayın, mutlaka ayrı bir güç kaynağı yada pil kullanın.

Pil kutusundan gelen elektriği motorun + ve - kablolarına bağlıyoruz. Motordan çıkan sarı kabloyu da mikrodenetleyici kartımızın herhangi bir PWM çıkış ucuna bağlayacağız. (Arduino uyumlu geliştirme kartlarında genellikle 5, 6, 9 ve 10. dijital çıkışlar PWM sinyali üretir ve herhangi biri bağlantı için uygundur.)

Son olarak, mikrodenetleyici ile servo motor arasındaki devrenin tamamlanması için geliştirme kartımızın "Gnd" ucu ile pil kutumuzun "-" ucunu birbirine bağlayacağız.

Uyarı: Bu bağlantıyı yapmadan önce mikrodenetleyici ROM'unuzu temizleyin. Halihazırda üzerinde çalışabilecek bir uygulama, motoru mekanik sınırları dışında dönmeye zorlayabilir ve göz açıp kapayana kadar servo motorunuz dekoratif yanık bir obje haline gelebilir.

Çalışma Mantığı

R/C Servo motorları kontrol etmek için motora PWM sinyali gönderilir. PWM, çoğu mikrodenetleyicinin donanımsal bir özelliğidir. Yani, PWM sinyal üretimi sağlanırken işlemci meşgul edilmez, uygulama işleyişi etkilenmez. Eşzamanlı olarak PWM kanal sayısı kadar servo motoru kontrol edebiliriz. Genellikle mikrodenetleyicilerde 2'den 8'e kadar PWM kanalı bulunur.

Analog R/C Servo motorlar saniyede 50 defa konum bilgisi kabul eder. Saniyede 50 defa (50Hz) 0,5 ile 2,5 milisaniye arasında uygulanan sinyal uzunluğu ile motora dönmesi istenilen açı bildirilir.

-

Servo motorun çözünürlüğüne göre 0 derece için 0,5ms, 90 derece için 1,5ms ve 180 derece için 2,5ms sinyal uygulanır. 0,5 ile 2,5 ms arasındaki değerler, motoru 0 ile 180 derece arasında konumlandıracaktır.

0 ve 180 derece için uygulanan sinyal uzunlukları, motorun modeline göre 1 ile 2 ms arasında da olabilir. Burada önemli olan, 1.5ms sinyal uzunluğunun tüm servo motor modellerinde orta noktayı işaret etmesidir. Motorun mekanik sınırları dışına çıkmamak için ilk denemelerinizi yaparken 1 ile 2 ms aralığında başlayıp, yavaş yavaş bu aralığı arttırın.

Bu kadar! Özetle, servo motor kontrolü için yapmamız gereken istenilen açıya eşdeğer PWM sinyalini üretmektir. Geriye kalan işlemler motorun entegresi tarafından yapılacaktır.

Uygulama Kodları

Önceden de vurgulandığı gibi, PWM donanımsal bir özelliktir ve her mikrodenetleyici modelinde farklılık gösterir. Bu yüzden PWM metodları Micro Framework SDK'sı içerisinde değil, fiziksel cihazınızın SDK'sı içerisinde bulunur. Örnek uygulamamızda GHI Electronics SDK'sı üzerinden gideceğiz. Diğer üreticilerin cihazlarında da benzer bir mantık söz konusudur.

Uygulama içerisinde yapacağımız işlem, 50Hz'de çalışacak bir PWM instance'ı oluşturmak ve motora açı bilgisini yollamak için sinyal uzunluğu belirtmektir. 50Hz'lik frekans pulse width olarak, belirleyeceğimiz sinyal uzunluğu da duty cycle olarak adlandırılır.

Öncelikle Visual Studio'dan "MFServoMotor" adında yeni bir Micro Framework Console Application oluşturalım. Proje referanslarına "GHIElectronics.NETMF.Hardware.dll" kütüphanesini ekleyelim. Artık uygulamamız ile mikrodenetleyicinin PWM fonksiyonuna erişebiliriz.

Projemize yeni bir Class ekleyelim: "ServoMotor.cs" Bu dosyanın içeriği aşağıdaki gibi olsun:

[ServoMotor.cs]

using System;
using Microsoft.SPOT;
using GHIElectronics.NETMF.Hardware;
 
namespace MFServoMotor
{
    public class ServoMotor : IDisposable
    {
        static PWM servoMotor;
        static int minD, maxD;
 
        public ServoMotor(PWM.Pin pwmPin)
        {
            minD = 0;
            maxD = 180;
            servoMotor = new PWM(pwmPin);
        }
 
        public ServoMotor(PWM.Pin pwmPin, int ilkDerece)
        {
            minD = 0;
            maxD = 180;
            servoMotor = new PWM(pwmPin);
            servoMotor.SetPulse(20000000, (uint)(500000 + (10000 * ilkDerece)));
        }
 
        public ServoMotor(PWM.Pin pwmPin, int ilkDerece, int enDusukDerece, int enYuksekDerece)
        {
            minD = enDusukDerece;
            maxD = enYuksekDerece;
            servoMotor = new PWM(pwmPin);
            servoMotor.SetPulse(20000000, (uint)(500000 + (10000 * ilkDerece)));
        }
 
        public void Dondur(int derece)
        {
            if (derece > maxD) derece = maxD;
            else if (derece < minD) derece = minD;
            servoMotor.SetPulse(20000000, (uint)(500000 + (10000 * derece)));
        }
 
        public void Dispose()
        {
            servoMotor.Dispose();
        }
    }
}

Oluşturduğumuz servo motor sınıfının metodlarını inceleyelim:
- ServoMotor (Overload 1): Belirttiğimiz PWM pininde, 0 ile 180 derece arası dönebilecek bir servo motor tanımlar.
- ServoMotor (Overload 2): Önceki overload'a ek olarak, servo motor instance'ı oluşturulduğunda motorun ilk açısını belirler.
- ServoMotor (Overload 3): Önceki overload'a ek olarak, motorun hareket edebileceği en düşük ve en yüksek dereceleri belirler.
- Dondur: Servo motoru belirtilen dereceye döndürür.
- Dispose: Servo motor için ayrılan PWM pinini serbest bırakır.

Bu sınıf, TowerPro MG945 servo motora göre ayarlanmıştır. Diğer motor çeşitleri için pulse width değerlerini değiştirmeniz gerekebilir.

Şimdi Program.cs dosyasının kodlarını yazalım:

[Program.cs]

using System;
using System.Threading;
using Microsoft.SPOT;
using GHIElectronics.NETMF.Hardware;
 
namespace MFServoMotor
{
    public class Program
    {
        public static void Main()
        {
            //0 ile 180 derece arasında dönebilecek, başlangıçta 90 derece konumunu alacak
            //PWM1 pininden sinyal alacak bir servo motor instance'ı oluşturalım:
            ServoMotor servo1 = new ServoMotor(PWM.Pin.PWM1, 90, 0, 180);
 
            while (true)
            {
                servo1.Dondur(0); //Servo Motor 0 derece pozisyonunu alsın.
                Thread.Sleep(1000);
                servo1.Dondur(90); //Servo Motor 90 derece pozisyonunu alsın.
                Thread.Sleep(1000);
                servo1.Dondur(180); //Servo Motor 180 derece pozisyonunu alsın.
                Thread.Sleep(2000);
            }
        }
    }
}

Servo motorun sinyal kablosunu mikrodenetleyicinin PWM1 pinine bağlayıp uygulamayı çalıştırdığınızda, motor sonsuz döngüde 0 - 90 - 180 dereceler arası dönecektir. Bu uygulama ile cihazınızın desteklediği PWM sayısı kadar servo motor instance'ı oluşturup bunları kontrol edebilirsiniz.

Uygulama kodlarını buradan indirebilirsiniz.




 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi