Günümüzde optik pozisyon enkoderleri hobi robotik uygulamalarında dahi sıklıkla kullanılmaktadır. Enkoderlerin yaygın kullanım alanları şöyledir:

DC Motor Pozisyon / Hız Kontrolü

Servo Mekanizmaları Pozisyon / Hız Kontrolü

Yazıcılar

Sayısal Kontrollü Makineler

Robotikte kullanılan RPM sensörleri

PHOTO – INTERRUPTER

        Bu uygulamalar için kullanılan sıradan optik pozisyon enkoderlerinin ön ucu, kanallı photo interrupter dır.Bir IR led ve foto transistör/diyot takılı biçimdedir ve her biri plastik gövde ile kaplanmıştır. Enkoder diskinde bulunan oyuklardan dolayı ışık IR led tarafından yayıldığı zaman engellenir. Böylece foto transistör/diyotların iletim seviyesi değişir. Bu değişim ayrık bir donanımsal birim tarafından ya da bir mikroişlemci tarafından algılanabilir. Kısaca photo interrupter bir tarafında kızılötesi yayıcı ve diğer tarafında kızılötesi alıcıdan meydana gelmektedir. Işığın bir taraftan diğerine iletilmesi sayesinde photo interrupter, ikisi arasından cisim geçtiği zaman ışığın kesilmesi prensibi ile geçen objeyi algılayabilir.

photo-interrupter

 

ENKODER / INDEX DİSKİ

      Uygulamalarda pals oluşturmamız gerektiğinden, enkoder diski çok gereklidir. Bunun kolay yolu şeffaf bir akrilik ile yapmaktır.

     Resimde görüldüğü gibi bir plaka alın ve siyah şeritler çizin. Şeritleri şeffaf levhaya çizin ve yuvarlak şekilli ince şeffaf akriliğe sabitleyin. Alternatif olarak diski siyah bir akrilikten yaparsınız ve beyaz boşlukları ayırırsınız.

rotary-encoder-disc

Önemli bir not:  Şeritlerin ve boşlukların fiziksel genişlikleri en önemli faktördür. Yarık genişliklerini bulmak için photo-interrupter ların datasheet ine bakınız. Şeritlerin ve boşlukların genişliğinin Photo-interrupter ların yarık genişliğinden en az 2 kat büyük olması en iyi sonuçtur. Örnek olarak yarık genişliği 1 mm ise şeritlerin ve boşlıkların genişliği 2 mm olmalıdır. Diskin RPM i 60 ise, disk saniyede 1 tur atıyordur. Disk üzrinde 36 tane şerit varsa, pals frekansı 36  hz dir.

DONANIM

     Başlamak için aşağıda olduğu gibi arduino ve photo-interrupter ile küçük bir test devresi oluşturalım. Bu sizin deneyim kazanmanıza ve tüm elemanların beklediğiniz gibi çalışmasından emin olmanıza müsaade eder. 10K lık direnç (R2) pull-up direncidir. R1 direncinin değeri kullandığınız photo-interrupter a bağlıdır. Arduino nun D13 pinine bağlı led ilk durumda pasiftir ve ışık kesildiği zaman led aktif olacaktır. Enkoder sinyallerini osiloskopta gözlemlemek için arduino nun D12 pini yardımcı çıkış olarak kullanılabilir.

arduino-hardware-550x359

TEST PROSEDÜRÜ

     Enkoder disk donanımına bağlı bir  photo-interrupter alın ve testi yapın. Arduino nun D12 pinini bir osiloskoba bağlayın ve enkoder diskinizi elle ya da düşük RPM de bir DC motor ile çevirin. Osiloskop yoksa çıkış pals lerini saymak için arduino nun D13 pinine bağlı ledi kullanın. Pals durumlarını görmek için diski yavaşça çevirin.

     Bu kod ihtiyacınız olan çok temel bir koddur. Donanımınız ve temel yazılımınız çalışmaya hazır. Şimdi bu kodu istediğiniz şekilde geliştirebilirsiniz.

KODU GELİŞTİRME

     Mikroişlemcinin dijital girişini okumak için 2 temel yol vardır. Bunlar tarama ve kesmedir. Bizim kodda kullandığımız gibi tarama işleminde, sistem bir döngü içinde sürekli olarak girişleri okur. Bu metodun ana sorunu, tarama işlemi yapılırken diğer işlemleri yapmakta mikroişlemcinin zorlanmasıdır. Bu metot da mikroişlemcinin tek görevi bu girişleri okuyup işlemektir. Aksine kesme kullanıldığı zaman sistem herhangi bir aksilik olmadan diğer işleri yapabilmektedir. Giriş sinyali geldiği zaman sistem o anki işini durdurur ve kesme rutinine gider ve daha sonra önceki işine geri döner. Bu tip bir uygulamada kesme daha iyi bir yoldur.

ARDUINO KODLARI

const int encoderIn = 8;  
const int statusLED = 13; 
const int pulseOutput = 12; 
int detectState=0; 
void setup()
{
   pinMode(encoderIn, INPUT); 
   pinMode(statusLED, OUTPUT); 
   pinMode(pulseOutput, OUTPUT); 
}
void loop() {
   detectState=digitalRead(encoderIn);
   if (detectState == HIGH) { 
      digitalWrite(statusLED, HIGH); 
      digitalWrite(pulseOutput,HIGH); 
   }
   else {
      digitalWrite(statusLED, LOW); 
      digitalWrite(pulseOutput,LOW); 
   }
}

Kaynak : http://www.electroschematics.com/10494/arduino-optical-position-rotary-encoder/

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz