Facebook RSS Feed
 
.NET Micro Framework: Netduino: PWM ile R/C Servo Kontrolü
Tarih: 16.10.2013, Platform: .NET MF 4.2, IDE: Visual Studio 2012, Level: 100

Genellikle profesyonel model araçlarda ve robotik uygulamalarda yer alan R/C servo motorlar, uygulanan PWM sinyaline göre milini istenilen açıda sabit tutmakla görevlidir. Servo motorların içerisinde hareket sağlamak için DC motor, pozisyon algılamak için potansiyometre, motora güç kazandırmak için redüktör mekanizması ve kontrol için sürücü / mikrodenetleyici bileşenlerinden oluşur.

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.

Hedef

R/C Servo motorların Netduino ile kontrolünü gösteren bir uygulama geliştireceğiz. Uygulamamız, servo motor milinin istenilen açıda sabitlenmesi için gerekli PWM sinyalini üretecek.

Gerekenler

Netduino Plus 2
R/C Servo Motor
4,8 - 6 Volt arası batarya - Çoğu R/C Servo Motor bu aralıkta çalışır.
Breadboard
6V+ 330uf değerinden güçlü kondansatör

Bağlantı Şeması

Servo motoru şemadaki gibi Netduino kartına bağlayabilirsiniz.

-

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ı

Visual Studio'dan NetduinoRCServo adında Micro Framework Console Application oluşturun. Proje özelliklerinden SDK versiyonunu Netduino'nuza yüklü versiyon ile aynı olacak şekilde ayarlayın. (4.2) Proje referanslarına Microsoft.SPOT.Hardware.dll, SecretLabs.NETMF.Hardware.dll, SecretLabs.NETMF.Hardware.PWM.dll ve SecretLabs.NETMF.Hardware.NetduinoPlus.dll dosyalarını ekleyin.

Öncelikle Digital 10 pinini kullanan bir PWM instance'ı oluşturacağız. SetServoPosition metodu, motor milini istenilen açıya gatirecek özellikte 50Hz'lik PWM sinyali üretecek.

Main metodunda SetServoPosition metodunu çağırarak motorun 0, 90 ve 180 derecede pozisyonlanmasını sağlayacağız. Bu kodu ilk kez kullanacaksanız, min ve max position değerlerini 45 ve 135 olarak belirleyin ve kademe kademe genişletin. Motorun fiziksel limitlerini aşan bir değer belirlemeniz, mekanik aksamın dağılmasına neden olabilir.

[C#] Program.cs

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;

namespace NetduinoRCServo
{
    public class Program
    {
        // Servonun bağlı olduğu pinde PWM oluştur
        static PWM servo = new PWM(Pins.GPIO_PIN_D10);

        // Servonun gidebileceği açıları sınırlandır (0 - 180 derece)
        static short servoMinPosition = 10, servoMaxPosition = 160;

        public static void Main()
        {
            // Sonsuz Döngüde
            while (true)
            {
                // Servo 0 derece
                SetServoPosition(0);
                Thread.Sleep(3000);

                // Servo 90 derece
                SetServoPosition(90);
                Thread.Sleep(2000);

                // Servo 180 derece
                SetServoPosition(180);
                Thread.Sleep(2000);
            }
        }

        /// <summary>
        /// Sets the R/C Servo Motor's position
        /// </summary>
        /// <param name="position">Motor head angle</param>
        private static void SetServoPosition(short position)
        {
            if (position < servoMinPosition) position = servoMinPosition;
            else if (position > servoMaxPosition) position = servoMaxPosition;
            servo.SetPulse(20000, 500 + (uint)(position * 11.11)); 
        }
    }
}

Uygulamayı çalıştırdığınızda, motorun belirtilen 3 açıda sürekli hareket ettiğini göreceksiniz. Netduino Plus 2 modülüne aynı anda 6 servo motor bağlayabilirsiniz.


Ek Dosya: Belirtilmemiş.
Okunma Sayısı: 3751

comments powered by Disqus
 
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