Arduino, PIC ve diğer gömülü sistemlerle Enkoder Kullanımı

 

Bu yazımda size arduino enkoder modülünü ve diğer endüstriyel enkoderlerin çalışmasını anlatacağım. Öncelikle enkoder nedir ona bakalım.
Enkoder : Harekete geçirildiğinde bir sinyal veya bir kod ile geri bildirim veren elektromekanik parçalardır.

Enkoderler öncelikle yapılarına göre ikiye ayrılırlar.
1-) Lineer enkoder (Doğrusal hareket eden)
2-) Rotary enkoder. ( Dairesel hareket eden)

Enkoderler Algılayıcılarına göre şu şekilde sınıflandırılırlar.
1-) Manyetik

manyetik enkoder
Sensör Hall manyetik sensörü rotor ise N ve S kutuplarına göre dizilmiş parçalardan ibarettir. N ve S kutuplarına göre sinyal yön değiştiriyor bu algılanıyor.

2-) Optik  Şekil 1 ve aşağıdaki resimler Optik olanlara örnektir.
3-) Kapasitif

manyetik enkoder
Kapasitif enkoder, sinüzoidal bir desenle oyulmuş bir rotordan yüksek frekanslı bir sinyal ileterek çalışır. Rotor hareket ettikçe, bu model sinyali öngörülebilir bir şekilde modüle eder. Alıcı modülasyonları okur ve yerleşik elektronik devrelerle, bunları dönme hareketi bilgisine çevirir.

 

Rotary enkoderlerin mil yapısı aşağıdaki şekildedir.
1-) Delik Milli Tip (Hollow Shaft Encoder) (Genelde Motora bağlı olarak gelir. )

manyetik enkoder

2-) Milli Tip (Shaft Encoder)

manyetik enkoder
Şayet motorunuz da milli ise ve bu tip bir enkoder seçmişseniz, araya adaptör konularak bağlamak mümkün olacaktır.

manyetik enkoder
Optik enkoderler de kendi içinde ikiye ayrılırlar. (Disk yapısına göre)
1-) İncremental enkoder  ( Artımsal enkoder : Bir sayaç gibi sıfırdan saymaya başlar. Her saydığında bir sinyal üretir. Elektrik kesilip geldiğinde sıfırdan başlar eski konumunu hatırlamaz. )
2-) Absolute enkoder.  ( Mutlak enkoder de denir. İçinde benzersiz kodlardan oluşan bir disk vardır. Bu disk sayesinde elektrik kesilip geldiğinde önceki durumunu kayıt yaptığından eski durumuna döner. Sıfırdan başlamaz. Ayrıca bir sinyal üretmez, her sayılacak hareket için bir kod verir. )

Artımsal enkoderler kullanıldıkları yerlerde, Konum bilgisi, Yön bilgisi, Açı ve Devir sayısı hakkında bilgileri verir.  Bunun yanı sıra artımsal enkoderler, Mutlak enkoderlere göre daha ucuz olduğundan Endüstride oldukça fazla  kullanılırlar.
Artımsal enkoderin dezavantajı ise, enerji verildiğinde bulunduğu konumu sıfır olarak görmesi. Bundan dolayı bazı artımsal enkoderlerde sıfır noktası için bir sensör daha vardır. Bulunduğu sistemde sıfır noktası olduğu düşünülen yere kadar gittiğinde, sıfır sensörü ile bulunduğu konumun başlangıç noktası olduğu varsayılır.
Bir kaç disk yapısı aşağıda görünmektedir. ( ROTARY ENCODER (Dairesel enkoder))

Trulli
Şekil-1 : Optik diskler

Yukarıdaki disk yapıları incelendiğinde rotary enkoder disklerinin farkını görebilirsiniz. Mesela Arduino enkoder modülünde kullanılan diskin üst soldan 3. resim olduğunu tahmin edebilirsiniz. Ya da 1. resim gibi düşünülebilir bu ayrım aşağıda anlatılacaktır.  Bu modülde kullanılan enkoder artımsal enkoderdir. Fakat sıfır başlangıç noktası yoktur. Güç verildikten sonra her çevirdiğinizde baştan saymaya başlar.
Neden 1. resim değil de 3. resim. Çünkü 1. resimde tek sensör kullanılıyor bu da sadece adım sayıcı gibi devrelerde kullanılan türdür. yön belirlenemez. Fakat Arduino enkoder modülünde kullanılanda 2 çıkış vardır. Bu çıkışların durumuna göre sağa ya da sola çevirdiğinizi  programınız belirleyebilir.

Burada bir başka kodlayıcıya da yer vermemiz gerek. Normalde 1. resimdeki tek çizgili disk sadece tek sensörle adımsayar gibi kullanılsa da yön belirleyebileceğimiz hale de dönüştürülmüştür. Bu tip kodlayıcılara Quadrature kodlayıcı denilmektedir. Bu özel bir kodlayıcıdır. Tek çizgili disk içerisinde 90 derece faz kaymalı 2 sensör yerleştirilerek yön bilgisinin de alınması sağlanmıştır. Çıkan sinyal ise Artımsal sinyal ile aynıdır. Fakat sıfır sensörü yoktur.
Yukarıdaki 2. resimdeki diski kullanan Quadrature larda vardır. Bunlar da sıfır noktası için sensör de mevcuttur.

Trulli
Quadrature kodlayıcının çalışması

Arduino enkoder modülünde bu tip bir kodlayıcı kullanılmaktadır. 

Artımsal enkoderlerin önemli özelliği sıfır noktasındadır. Bu da 3 çıkış yani 3 sensör demektir. Endüstride kullanılan enkoderlerin sıfır nokta  belirleme özelliği büyük önem taşır. Fakat bu kendi başına bir işe yaramaz. Bununla ilgili bir örnek vermem gerekirse, artımsal enkoder kullanan makineler ilk güç verildiğinde sıfır noktasını görmeleri gerekir. Buna sıfırlama işlemi denir. Başlangıç noktasını bulur ve sonrasında Güç kesilesiye kadar istenen koordinata gider. Hatta enkoderin durumuna göre 0,01 mm hassasiyette bile bunu yapabilir. Aşağıdaki kısa video bu sıfırlama Yani ZERO işlemini göstermektedir.
ZERO işlemi için Öncelikle makinenin bir zero anahtarına ihtiyacı vardır. Bu anahtara kadar motor eksen üzerinde hareket ettirilir. Sonrasında hareketli tabla anahtara bassa bile motor kısa  bir müddet daha ilerlemeye devam eder. ENKODER diski üzerindeki sıfır sensörü çıkış verdiğinde motor durur. Burası hem makinenin hem de enkoderin sıfır noktasıdır. Artık motor başlangıç noktasına döner ve dönerken devamlı enkoder adımları program tarafından saymaya devam eder. sıfır noktasından uzaklığı hesap edilir. Güç kesilesiye kadar da program bunu unutmaz.
Videoda Hareketli  parçaların güç verildiğinde ZERO işlemiyle sıfırlama yaptığı görülmektedir. Videonun sonuna doğru ön kısımdaki X eksenindeki, sıfırlama anahtarına basma durumu belirgin olarak görülüyor. 


Bu işlemi yapmakla makine programı, hangi hareketli parçanın nerede olacağını bildiği için koordinat vererek doğru koordinata gitmesini sağlar. Bunun mantığı da şudur. Bir koordinat verilir bu koordinat bulunulan noktanın sağındaysa oraya doğru motor hareket eder. Bu işlemi yaparken enkoder, motordan hareket aldığından geri bildirim verir. Bu geri bildirim ile istenilen koordinata gelindiyse motor durdurulur.

Sanırım artımsal enkoderin nasıl çalıştığını anlamışsınızdır. Ya mutlak enkoder nasıl çalışır.
Mutlak enkoderin sıfır noktasını bilmesine gerek yok. Kaldığı noktayı bir kod ile belirlediğinden bu kod program tarafından algılanıp nerede olduğu bilinir. Fakat burada ki sorun şu, enkoder kaç tam tur attı. kaçıncı turda belli değildir. Tabii ki bu da MULTI TURN ABSOLUTE ENCODER (çoklu tur mutlak enkoder) ile mümkün. Gelen data kod şeklindedir. binary ya da gray kodu ile çalışıyor. Bu gönderilen kodun içerisinde takıldığı andan itibaren kaçıncı turda olduğunu da hafızasında tutar.
Bu ürünlerden biri budur. İncelemenizi tavsiye ederim. 
Bundan dolayı bu tip enkoderler söküldüğünde aynı konumda takılmalıdır. Ya da baştan sıfırlanmalıdır. Artımsal enkoderlerde bu kadar hassas değildir. 

Lineer Enkoderlerde kendi arasında incremental (Artımsal),  Absolute Enkoder (Mutlak) olarak ayrılır. Yapılan hareket doğrusal bir hareketse bir cetvel gibi düşünebiliriz. Hatta piyasada bazen enkoder diye söylemezler cetvel diye söyleyenler olur. Diğer rotary enkoderler  gibi bunlarda aynı mantıkla  çalıştığından bundan sonraki  anlatımlar  ortak olacaktır.

Trulli

lineer enkoder
Doğrusal enkoderin çalışma yapısı bu şekildedir. R ise sıfır nokıtası sinyalini gösterir.

 

Nasıl Kontrol edebiliriz :
Bu minimum çift kanal artımsal enkoder mantığıdır. Arduino enkoder modülü de bu mantıkla çalışıyor.
Öncelikle programlarken sinyali nasıl yakalayacağız buna bakalım. Bunun için aşağıdaki resimde A kanalının sinyalini kullanacağız. Bu sinyalin 1 den 0 durumuna düşmesi, bizim B kanalını kontrol edeceğimiz anlamına gelir. Bu kontrolde A=0 iken B=1 ise  Clockwise ( saat yönünde ) döndüğü sonucunu çıkarırız. Şayet A=0 iken B=0 ise bu da Counter Clockwise  (saat yönünün tersi) döndüğü sonucunu çıkarırız. Buraya kadar hangi yöne döndüğünü elde etmiş olduk.
Tabii ki bu karşılaştırma her bir adımda yapılacağından sayaç belirlediğinizde, sayaç saat yönünde yukarı doğru sayacak, saat yönünün tersinde ise sayaç aşağı doğru sayacak. Bu şekilde hangi konumda olduğunu bileceksiniz.
Ayrıca AÇI sını da bulabilirsiniz. 100 çizgili bir enkoder ise 25 saydığınızda 90 derece diyebiliriz. buna göre saydığınız değere göre kaç derece olduğunu bulabilirsiniz. Bunun yanı sıra bir de HIZINI tespit etmemiz lazım. bu nasıl olacak?
O da yine bu sinyalde var. Hareket ne kadar hızlıysa sinyalin frekansı da o kadar büyük olacaktır. ( Bu durumu videoda göreceksiniz.)

Trulli

 

Arduino enkoder modül yapısı:  Buradaki Switch sadece buton anahtar görevi görür. Enkoderin iç yapısı ile bağlantısı yoktur. Ayrı olarak buton kullanılmaması için yapılmıştır.

Bu datasheet belki size fikir verebilir. 

Arduino enkoder

Arduino enkoder çizim

Arduino enkoder calisma
Sıfırlama sinyali olmayan Arduino Enkoder modülünün çalışması.

 

Aşağıdaki  resimde ise endüstriyel sistemlerde kullanılan enkoder diskinin çalışması görülüyor.
Tek fark ise Z ( zero=sıfırlama ) sinyalidir. Arduino enkoderinde bu sinyal yok fakat piyasadaki endüstriyel Artımsal enkoderlerde bu sinyal var.
Bir hareketli tablanın nereden başlaması gerektiğini bilmeniz gerekiyorsa Enkoder diskindeki sıfırlama sinyalini kullanmalısınız. Yoksa her defasında aynı yerden başlamaz. ( Bu konuda açıklama yukarıda yapılmıştır. Yukarıda Video vardır.)

Trulli

Trulli
Sıfırlamalı, Artımsal enkoder Disk

Encoder Seçiminde nelere  Dikkat Etmeliyiz.
Bir kodlayıcı seçmek, uygulamanın çevresel koşullarının ve istenen performans seviyelerinin anlaşılmasını gerektirir. Aşağıda, bir kodlayıcı ürünü seçme kararı verirken gözden geçirilmesi gereken bazı seçimler bulunmaktadır.

  1. Ne tür bir hareket izleniyor – doğrusal mı yoksa döner mi?
  2. Hangi parametreler ölçülüyor – konum, hareket hızı?
  3. Yön kaydı önemli mi? – bu, tek bir kanalın mı yoksa çok kanallı bir enkoderin yeterli olup olmayacağını belirlemeye yardımcı olacaktır.
  4. Enkoderin, maruz kalacağı belirli çevresel koşullar nelerdir? Bu, kodlayıcı için en uygun algılama teknolojisinin belirlenmesine yardımcı olacaktır. Aşağıdaki durumlar göz önüne alınır.
    1. Toz
    2. Nem
    3. Yakıcı veya aşındırıcı kimyasallar
    4. Şok
    5. Titreşim
    6. Aşırı sıcaklıklar
  5. Güç kesintisi durumunda amaçlanan uygulama direkt eski yerine gelmesi olabilir mi? Bu, artımlı ve mutlak kodlayıcılara olan ihtiyacın belirlenmesine yardımcı olacaktır. ( Kol tipi robotlar enerji verildiğinde hemen yerine gelmesi istenir. Sıfırlama istenmez. gibi)
  6. Ölçüm için ne kadar çözünürlük gerekiyor?  bir tur 100 yada 500 çizgi olarak düşünebilirsiniz. Hassaslığa göre seçim.
  7. Sistemin elektrik gereksinimleri nelerdir? Bu, noktadan noktaya arayüzler, fieldbus arayüzleri veya ethernet arayüzleri gibi çıkış arayüzüne ilişkin değerlendirmeleri içerir. Ayrıca 5VDC., 5-30VDC, 11-24VDC.vb. gib gerilimlere de bakılmalı.
  8. Uygulamaya hangi mekanik paketleme ve tasarım uygundur? Döner enkoderler için, bu, delikli mi yoksa şaftlı enkodere mi, kilitleme mekanizmasının tipine, delik boyutuna ve kapalı veya açık enkoder paketinin daha iyi olup olmadığına karar vermeyi içerir.
  9. Fiziksel Özellikler Gövde Çapı / Gövde Uzunluğu: mil çapı gibi.
  10. Soket / Kablo Çıkış Yönü (Eksenel / Yandan Çıkışlı)
  11. Koruma Sınıfı ( IP koruma sınıflarına bakınız. )

 

Enkoder ve kullanım bilgileri için ek olarak bu sayfayı da inceleyebilirsiniz. Animasyonlar size fikir verecektir. 

NOT : **************************************************
Ayrıca şunu da not olarak düşmeliyim. Bir kısım enkoder, motora bağlı olarak gelebilir. Bu durumda motor ısındıkça enkoder de ısınacağından bazı istenmeyen sapmalara neden olabilir. Genelde ise enkoderler motor miline değil de gerekli hesaplamalara uygun dişli takımlarıyla motora bağlanır. Bu ısınma problemlerini de en aza indirmektedir.
Aşağıdaki video Bu tip ısınmaların nasıl bir sorun oluşturabileceğini güzel bir şekilde anlatmış. Sizlerde dizaynlarınızda bu hususu dikkate alınız.
Video youtube üzerinden izlenir. 

 

BURADAN SONRASI İSE PIC VE ARDUINO PROGRAMLARI VE ÇALIŞTIRMA VİDEOLARIDIR. 

Öncelikle PIC programını vereyim. Bu program PIC12F683 8 bacaklı bir entegre ile denenmiştir. (PICBASIC ile yapılmıştır.) Mantığı yukarıda zaten belirtilmiştir. Burada söylemem gereken nokta ise Arduino enkoder modülü çalıştırırken A kanalını yakalamak için while döngüsü kullandım. Bu döngü A kanalı 1 olduktan sonra 0 seviyesine düşünceye kadar bekletiyor. Sonrasında ise B kanalını kontrol edip işleri yapıyor.
Bunun yanı sıra Bu kontrolden sonra bile A kanal hala 0 durumunda olduğundan programın en altında while döngüsü ile 0 durumunun son bulması için döngüde bekletiliyor. bu yapılmazsa arka arkaya sayaç sayabilir. yanlış saymalar olabilir.
Bir de burada LCD olarak EASYLCD modülümü kullandım. entegrenin bacak sayısı az olduğundan seri haberleşmeyi tek kablodan kullanarak, EASYLCD ye değerleri yazdırdım.
Program basit olarak kontrolü göstermek için yapıldı. Bundan dolayı istediğiniz durumlara göre geliştirmeniz gerekecek.

'****************************************************************
'* Name : Rotery_encoder *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2020 [ *
'* Date : 15.09.2020 *
'* Version : 1.0 *
'* Notes : Gerçek endüstriyel çalışma. zero butonlu. limit butonlu *
'* : *
'****************************************************************
DEFINE OSC 8

#config                 ;*** bu config şekli PBP3.0 ve sonrası için geçerlidir. öncesi için kendi satırınızı                                   ;kullanın.
__config _FCMEN_OFF & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
#ENDCONFIG

OSCCON=%01110101
CMCON0 = 7
ADCON0=%00000000
ANSEL=0 ;ADC ler iptal
TRISIO=%00001011

say var word ;65536 ya kadar sayılabilir. Binary olarak 16 bit. 1111 1111 1111 1111

INA var GPIO.0
INB var GPIO.1
INZ var GPIO.3
Limit var GPIO.2
Msag var GPIO.4
Msol var GPIO.5
temp var byte
temp1 var byte
say2 var byte

high GPIO.2
pause 3000
low GPIO.2
pause 3000
high GPIO.2
pause 3000
SEROUT2 GPIO.5,84,[“LCDDD”]
pause 100
SEROUT2 GPIO.5,84,[“LCDDD”]
pause 100

say=0
basla:
while INA=1
temp=1
wend
if temp=1 then
if INA=0 and INB=1 then
SEROUT2 GPIO.5,84,[“LCDWR 1,1-RIGHT : “]

pause 100
SEROUT2 GPIO.5,84,[“LCDWR 2,6-“,dec5 say]

say=say+1
if say>50 then
high msag
endif
temp=0
endif
if temp=0 then goto basla

if INA=0 and INB=0 then
SEROUT2 GPIO.5,84,[“LCDWR 1,1-LEFT : “]

pause 100
SEROUT2 GPIO.5,84,[“LCDWR 2,6-“,dec5 say]
temp=0
say=say-1

if say<50 then
low msag
endif

endif

endif

goto basla

end

;=================================================== program sonu

PIC12F683 Gerçek devre videosu:

Arduino programı da Aynı mantıkla buradadır. Bu sadece arduino enkoder modülünü kütüphanesiz olarak kullanmak için gerçekleştirildi. Program basit olarak kontrolü göstermek için yapıldı. Bundan dolayı istediğiniz durumlara göre geliştirmeniz gerekecek.

=======================================================
int temp1=0;
int temp=0;
double say=0;
int INA = 5;
int INB = 4;
int INZ = 2; // Led kontrol için kullanılıyor.
int limit = 3; // kullanılmıyor.
int baka=0;
int bakb=0;
int fren=6; // kullanılmıyor.

void setup() {

pinMode(10, OUTPUT);// msağ
pinMode(9, OUTPUT); // msol
pinMode(fren, OUTPUT);
pinMode(INZ, OUTPUT);
pinMode(limit, OUTPUT);
pinMode(INB, INPUT);
pinMode(INA, INPUT);
Serial.begin(9600);

delay(1000);

}
void loop(){
baka=digitalRead(INA);
while (baka==1){ // start palsi bekliyor. baka=1 den baka=0 a düştüğünde bakb yi kontrol etmeye gidiyor.
// Serial.println(” iceride “);
temp=1; // 2 kez çalışmasın diye değişken
baka=digitalRead(INA);
}

if (temp==1){

baka=digitalRead(INA);
bakb=digitalRead(INB);
if (baka==0 && bakb==1 && temp==1){ // sağa dönüş baka=0 olduğunda bakb=1 ise sağa dönüyor demektir.
Serial.print(” Turning RIGHT “);
Serial.print(baka);
Serial.print(” “);
Serial.println(bakb);
Serial.print(” Counter : “);
Serial.println(say);
say=say+1;
temp=0;
if (say>20){
digitalWrite(INZ, HIGH); // deneme için led bağlandı. sayaç 20 den büyük olduüunda yanacak düşük olursa yanmayacak.
// isterseniz değişkene bağlarsınız istediğiniz sayıyı yazarsınız o sayıya geldiğinde led yanar.
}
}
baka=digitalRead(INA);
bakb=digitalRead(INB);
if (baka==0 && bakb==0 && temp==1){ // sola dönüş baka=0 olduğunda bakb=0 ise sola dönüyor demektir.
Serial.print(” Turning LEFT “);
Serial.print(baka);
Serial.print(” “);
Serial.println(bakb);
Serial.print(” Counter : “);
Serial.println(say);
say=say-1;
temp=0;
if (say<20){
digitalWrite(INZ, LOW);
}
}

}
baka=digitalRead(INA);
while (baka==0){ // baka =0 olduğu müddetçe bir kez daha çalışmasın diye while döngüsünde baka=1 olasıya kadar bekliyor.
baka=digitalRead(INA);
}
}

//=========================================================program sonu

Arduino ile Arduino enkoder modül kullanımı gerçek devre videosu:
Yukarıdaki programlar yazıyı anlamanız için burada örnek verildi.

Tüm programlara ve linklere ise bu linkten ulaşabilirsiniz. 

BU videoda anlatılan işlemlerin Proteus üzerinde simüle edilmesi vardır. Proteus 7.10 kullandığım için bu ve bunun üzerinde herhangi bir proteus versiyonu ile simülasyonu çalıştırabilirsiniz.

 

Burada ise ZERO videosunu gördüğünüz makinenin normal çalışması bulunmaktadır. Endüstride kullanım örneklerinden biri.

3 Comments

  1. Yaklasik bir yil önce Tea5767 Radyosunu enkoder pot. la kontrol emeyi istedim. Ama ozaman basarili olmadi. Bu kez bir de bu programla deneyecegim. Bakalim nasil olacak. Elinize saglik Safak Bey.

  2. Arduino icin vermis oldugunuz programi denedim. Siz deneylerinizi proteusla yaptiginiz icin belki , calismis olabilir. Ama arduino ide /Serial.print(” Counter : “); bu yukardaki “” isaretleri kabul etmiyor. Program icin tesekkürler. Arduino ide ile denemek isteyen arkadaslar bu isaretleri (“”) bu sekilde verebilirler sonra sorun olmuyor. Selamlar.

    1. Buraya kopyaladığımda bazı karakter sorunları oluyor diye ben de son yazılarımda tüm programları download edilecek şekilde GITHUB sitesine koyuyorum. Artık herkes oradan çalışan programları alabiliyor.
      Sizin dediğinizle bende başka sitelerde karşılaşıyorum. Proteustan dolayı değil sayfaya kopyaladığımda bazı karakterlerin değişmesi söz konusu.
      uyarı için teşekkürler

Şafak Ağustoslu için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak.