Arduino ile Rotary Encoder Kullanımı

Rotary Encoder Nedir?

Bu yazımızda Arduino ile Rotary Encoder kullanımını ele alacağız. Öncelikle Rotary Encoder’in tanımına değinelim. Türkçe karşılığı “Döner Kodlayıcı” olan Rotary Encoder’ler, şaftındaki/milindeki harekete bağlı olarak elektriksel sinyal üreten ve bu sinyal yardımı ile şaftın/milin konumunu tespit etmemize yarayan bir elektro-mekanik cihazdır.

Direnc.net stoklarında çok sayıda encoder ürünü mevcuttur. Bizler bu yazımızda Rotary Encoder OVW6-10-2HC 600 Pulse ürünü üzerine duracağız. Ancak öncesinde Rotary Encoder’lerin çalışma mantığına değinelim.

Optik algılama teknolojisinin kullanıldığı Rotary Encoder cihazlarında, üzerinde mat çizgiler ve desenler bulunan bir dahili kod diskinin dönmesi üzerine işlem görür. Disk, bir LED gibi bir ışık demeti içinde döndürülür. Disk üzerindeki desenler, ışığı engeller veya önünü açar.

Rotary Encoder

Dahili bir foto-diyot veya foto-transistör, değişen ışık demetini algılar. Ardından Rotary Encoder çıkışı, değişen ışık demetini harici bir kontrol sistemine ileterek bir elektrik sinyali oluşturur.

Rotary Encoder OVW6-10-2HC 600 Pulse ürününün 5 tane kablo çıkışı bulunmaktadır. Ürünün etiketi üzerinde yazılmaktadır. Kırmızı kablo +5VSiyah kablo GNDSarı kablo A fazı, Yeşil kablo fazıdır. Diğer kablo kullanılmamaktadır. Bağlantı şemamız şöyledir:

Arduino Rotary Encoder

Bağlantılar sağlandıktan sonra kodu, Arduino Ana Board’a atıyoruz. Arduino uygulamasından yeni bir sayfa açıp hazırlamış olduğumuz kodu yazıyoruz:

volatile unsigned int temp, counter = 0; //Bu değişkenleri encoder hareket ederken ve daha önceki konumu ile karşılaştırmak için kullanacağız
    
void setup() {
  Serial.begin (9600);
  pinMode(2, INPUT_PULLUP); // Encoderden çıkan yeşil yada sarı kabloyu Arduinonun 2. pinine
  pinMode(3, INPUT_PULLUP); // Encoderden çıkan yeşil yada sarıdan hangisikaldıysa kabloyu Arduinonun 3. pinine 
  
  /*  Aşağıda "interrupt" dediğimiz bölme,araya girme anlamları olan fonksiyonları tanımlıyoruz burada temel mantık şu;
   *  Bu pinlerdeki sinyalde değişiklik olduğu anda işlemci yaptığı işi yarım bırakıp bu pine bağlı fonksiyonu yapıp normal işlemlerine geri dönecek.
   *  Bu işlemi yaptırtabilemek için bu pinlere interrupt koyduğumuzu belirten kodu yazıyoruz.
   */
  
  
  //Burada 2 numaralı pinde sinyal seviyesi yükselidinde "Interrupt_fonksiyonu1" i çalıştır diyoruz
  attachInterrupt(digitalPinToInterrupt(2), Interrupt_fonksiyonu1, RISING);
   
  //Burada 3 numaralı pinde sinyal seviyesi yükselidinde "Interrupt_fonksiyonu2" i çalıştır diyoruz
  attachInterrupt(digitalPinToInterrupt(3), Interrupt_fonksiyonu2, RISING);
  }

  //Yukarıdaki kodda "Interrupt_fonksiyonu1" ve "Interrupt_fonksiyonu2" içerisinde ne olacağını en aşağıda belirledik
   
  void loop() {
  // Aşağıdaki if kodunda elimizdeki "counter" değeri ile kayıtlı olan "temp" değeri aynı mı onu kontrol ediyoruz aynı ise işlem yapmıyoruz fakat farklı 
  // ise "counter" değerimizi serial porta yazdırıyoruz ve yeni counter değerimizi "temp" değerine kayıt ediyoruz
 
  if( counter != temp ){
  Serial.println (counter);
  temp = counter;
  }
  }
   
  void Interrupt_fonksiyonu1() { 
    // bu fonksiyon 2 numaralı pinde sinyal değerimiz yükseldiğinde çalışıyor diğer pinin sinyaline bakıp saat yönünde yada tersine döndüğünü tayin ediyoruz
    // dönüş yönüne göre değeri arttırıp azaltıyoruz
  if(digitalRead(3)==LOW) {
  counter++;
  }else{
  counter--;
  }
  }
   
  void Interrupt_fonksiyonu2() {
     // bu fonksiyonda aynı üsteki fonksiyon gibi 3 numaralı pinde sinyal değerimiz yükseldiğinde çalışıyor diğer pinin sinyaline bakıp saat yönünde yada tersine döndüğünü tayin ediyoruz
    // dönüş yönüne göre değeri arttırıp azaltıyoruz
  if(digitalRead(2)==LOW) {
  counter--;
  }else{
  counter++;
  }
  }

Rotary Encoder’in şaftını/milini parmağımızla döndürdüğümüzde, Arduino Seri Port ekranından değişimi gözlemleyebilmemiz mümkün.

Rotary Encoder ürünü endüstriyel kontrol cihazlarında, robotik uygulamalarda, fotoğraf lenslerinde, bilgisayar mause’larında ve dönen radar platformlarında vs. kullanılmaktadır.