Facebook RSS Feed
 

.NET Micro Framework: Step Motor Kontrolü (Unipolar ve Bipolar)

-Step motorlar genellikle CNC makineleri, yazıcı, tarayıcı ve optik sürüler gibi hassas pozisyon kontrolü gerektiren makinelerde tercih edilir. Kapasitesine göre kullanıldığında geribildirim mekanizmasına gerek kalmadan kesin hassasiyette çalışırlar. .NET Micro Framework kullanarak step motorları kolaylıkla kontrol etmemiz mümkündür. Yaygın olarak kullanılan iki çeşit step motor vardır, unipolar ve bipolar. Geliştireceğimiz uygulama iki tür motoru da destekleyecektir. Şimdi söz ettiğimiz step motor türlerine bir göz atalım.

Unipolar Step Motor

Uniplolar step motorların 5 yada 6 pini vardır. Bu pinlerin 4 tanesine motorun adımına göre negatif elektrik uygulanır. Diğer 1 yada 2 uca da pozitif güç bağlanır. Mikrodenetleyici ile motor arasında çoklu transistör entegresi ULN2003 yada daha güçlü motorlar için 4 tane mosfet bağlanır. Unipolar step motorun bağlantı şeması aşağıdaki gibidir:

-

-
Motorun her adımı için sırayla adım pinlerinden birine elektrik verilir. Adım 4'den sonra ilk adıma dönülecek şekilde bir döngü izlenir. Motorun ters yöne dönmesi istenildiğinde ise adımlar ters sırayla uygulanır. Adımlar arasına motorun özelliğine göre gecikme eklenir. Bu gecikme ne kadar az ise motor o kadar hızlı dönecektir. Motorun kapasitesini aşan bir hızda sinyaller uygulandığında ise adımları doğru atmamaya başlayacaktır.



Bipolar Step Motor

Bipolar step motorlar unipolar motorlara göre daha güçlüdür. 4 pinleri vardır ve yine adım durumuna göre bu pinlere negatif yada pozitif sinyal uygulanır. Mikrodenetleyici ile bipolar step motor arasında L293D motor sürücü entegresi kullanılır. Yapısı gereği fazla ısınan L293D entegresini soğutmak için GND pinlerine soğutucu takılır yada baskı devre tasarlarken GND uçlarına temas eden bakır bölge geniş tutularak soğutucu görevi gördürülür.

-

-
Unipolar step motor ile aynı mantıkta bir sinyal döngüsü bipolar step motor için de uygulanır. Yine aynı şekilde adım aralarında uygulanan gecikme süresi ile motorun dönüş hızı ayarlanır.






Uygulama Kodları

Bir .NET Micro Framework Console Application oluşturup Microsoft.SPOT.Hardware.dll kütüpanesini proje referanslarına ekleyin. Uygulamamız Unipolar ve Bipolar step motorlar için birer sınıf içerir. Genellikle iki motor tipini birlikte kullanmayacağınız için projenizde kullandığınız motor tipine uygun sınıfı dahil etmeniz yeterli olacaktır. Bu sınıflar motorlara bağlı pinlere motorun atmasını istediğiniz adım sayısına göre sinyal üretir. Motor sınıflarını ekleyerek uygulamamıza başlayalım.

UnipolarStepper.cs

Proje dahilinde bir UnipolarStepper.cs dosyası oluşturun ve aşağıdaki kodları oluşturduğunuz dosyaya kopyalayın. Bu sınıf unipolar step motorun özelliklerini ve metodlarını içerir.

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
 
namespace MFStepperMotor
{
    public class UnipolarStepper : IDisposable
    {
        private OutputPort[] _pinler; //Motorun uçlarına bağlanacak pinler
        private byte[] _adimlar = new byte[] { 1, 2, 4, 8 }; //Her adımda motora gönderilecek değer
        int sonAdim;
        /// <summary>
        /// Unipolar Stepper Motor
        /// </summary>
        /// <param name="pinler">Step motor kontrol pinleri: 1 2 3 4</param>
        public UnipolarStepper(Cpu.Pin[] pinler)
        {
            if (pinler.Length != 4)
                throw new ArgumentOutOfRangeException();
 
            _pinler = new OutputPort[4];
            for (int i = 0; i < 4; i++)
            {
                _pinler[i] = new OutputPort(pinler[i], false);
            }
        }
 
        public void Dondur(int adim, int gecikme)
        {
            //Saat yönünde dönüş
            if (adim > 0)
            {
                for (int i = 0; i < adim; i++)
                {
                    if (sonAdim++ >= 4) sonAdim = 1;
                    PinCikis(_adimlar[sonAdim - 1]);
                    Thread.Sleep(gecikme);
                }
            }
 
            //Saatin tersi yönüne dönüş
            else if (adim < 0)
            {
                adim = adim * -1;
                for (int i = 0; i < adim; i++)
                {
                    if (--sonAdim <= 0) sonAdim = 4;
                    PinCikis(_adimlar[sonAdim - 1]);
                    Thread.Sleep(gecikme);
                }
            }
        }
 
        private void PinCikis(byte deger)
        {
            for (int i = 0; i < 4; i++)
            {
                _pinler[i].Write(((deger & 1) == 1));
                deger >>= 1;
            }
        }
 
        public void Coast()
        {
            for (int i = 0; i < 4; i++)
            {
                _pinler[i].Write(false);
            }
        }
 
        public void Dispose()
        {
            for (int i = 0; i < 4; i++)
            {
                _pinler[i].Dispose();
            }
        }
    }
}

BipolarStepper.cs

Bipolar step motor kullanımı için de projeye BipolarStepper.cs dosyası ekleyip içeriğini aşağıdaki gibi değiştirin. UnipolarStepper sınıfı ile bu sınıfın farkı, adımlarda motor pinlerine gönderilecek sinyallerin sıralamasıdır.

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
 
namespace MFStepperMotor
{
    public class BipolarStepper : IDisposable
    {
        private OutputPort[] _pinler; //Motorun uçlarına bağlanacak pinler
        private byte[] _adimlar = new byte[] { 1, 4, 2, 8 }; //Her adımda motora gönderilecek değer
        int sonAdim;
        /// <summary>
        /// Bipolar Stepper Motor
        /// </summary>
        /// <param name="pinler">Step motor kontrol pinleri: A+ A- B+ B-</param>
        public BipolarStepper(Cpu.Pin[] pinler)
        {
            if (pinler.Length != 4)
                throw new ArgumentOutOfRangeException();
 
            _pinler = new OutputPort[4];
            for (int i = 0; i < 4; i++)
            {
                _pinler[i] = new OutputPort(pinler[i], false);
            }
        }
 
        public void Dondur(int adim, int gecikme)
        {
            //Saat yönünde dönüş
            if (adim > 0)
            {
                for (int i = 0; i < adim; i++)
                {
                    if (sonAdim++ >= 4) sonAdim = 1;
                    PinCikis(_adimlar[sonAdim - 1]);
                    Thread.Sleep(gecikme);
                }
            }
 
            //Saatin tersi yönüne dönüş
            else if (adim < 0)
            {
                adim = adim * -1;
                for (int i = 0; i < adim; i++)
                {
                    if (--sonAdim <= 0) sonAdim = 4;
                    PinCikis(_adimlar[sonAdim - 1]);
                    Thread.Sleep(gecikme);
                }
            }
        }
 
        private void PinCikis(byte deger)
        {
            for (int i = 0; i < 4; i++)
            {
                _pinler[i].Write(((deger & 1) == 1));
                deger >>= 1;
            }
        }
 
        public void Coast()
        {
            for (int i = 0; i < 4; i++)
            {
                _pinler[i].Write(false);
            }
        }
 
        public void Dispose()
        {
            for (int i = 0; i < 4; i++)
            {
                _pinler[i].Dispose();
            }
        }
    }
}

Program.cs

Motor sınıflarını ekledikten sonra uygulamamızla step motor kontrol etmemiz çok kolay bir hale geliyor. Önce kullanmak istediğiniz motor objesinin (UnipolarStepper yada Bipolar Stepper) bir instance'ını oluşturuyoruz ve mikrodenetleyicinin step motora bağlanacak pinlerini belirliyoruz. Daha sonra, döndur komutuyla motorlara hareket veriyoruz. Uygulama kodlarına bir göz atalım.:

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
 
namespace MFStepperMotor
{
    public class Program
    {
        public static void Main()
        {
            UnipolarStepper unipolarMotor = new UnipolarStepper(new Cpu.Pin[] {
                Cpu.Pin.GPIO_Pin1,   //Unipolar motor 1. pin
                Cpu.Pin.GPIO_Pin2,   //Unipolar motor 2. pin
                Cpu.Pin.GPIO_Pin3,   //Unipolar motor 3. pin
                Cpu.Pin.GPIO_Pin4}); //Unipolar motor 4. pin
 
            BipolarStepper bipolarMotor = new BipolarStepper(new Cpu.Pin[] {
                Cpu.Pin.GPIO_Pin5,   //Bipolar motor A+ pini
                Cpu.Pin.GPIO_Pin6,   //Bipolar motor A- pini
                Cpu.Pin.GPIO_Pin7,   //Bipolar motor B+ pini
                Cpu.Pin.GPIO_Pin8}); //Bipolar motor B- pini
 
            unipolarMotor.Dondur(10, 100);  //Saat yönüne doğru 100ms aralıkla 10 adım döndür.
            unipolarMotor.Dondur(-8, 100);  //Saat yönünün tersine doğru 100ms aralıkla 8 adım döndür.
            unipolarMotor.Coast();          //Motoru serbest bırak.
 
            bipolarMotor.Dondur(10, 100);   //Saat yönüne doğru 100ms aralıkla 10 adım döndür.
            bipolarMotor.Dondur(-8, 100);   //Saat yönünün tersine doğru 100ms aralıkla 8 adım döndür.
            bipolarMotor.Coast();           //Motoru serbest bırak.
 
            unipolarMotor.Dispose();        //Unipolar motorun pinlerini serbest bırak.
            bipolarMotor.Dispose();         //Bipolar motorun pinlerini serbest bırak.
 
            Thread.Sleep(Timeout.Infinite);
        }
    }
}

Uygulamayı mikrodenetleyiciye gönderip çalıştırdığınızda step motorların belirttiğiniz yön, hız ve adımda döndüğünü göreceksiniz. Step motorları uzun süre döndürmeyecekseniz Coast komutuyla o motora giden elektriği kesebilirsiniz. Coast komutunu kullanmazsanız motorlar duruyor olsa bile elektrik sarfedecekler ve ısınacaklar. Motorlar düzgün dönmüyorsa (2 adım saat yönüne 1 adım ters yöne gibi) kabloların sırasını değiştirmeniz gerekiyor demektir. Önceki yazılarımda söz ettiğim seri port uygulamasını bu uygulama ile birleştirerek bilgisayar kontrollü step motor kontrol sistemi oluşturabilirsiniz.

Kaynak 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