Arduino ile döner(rotary) enkoder(encoder) kullanımı

👤 Yazar: ozcan 📅 Tarih: 10.05.2026 08:15 👁️ Görüntüleme: 16

Döner enkoderlerde genelde 4 uç bulunur. Bunlar Vcc, Gnd, A ve B uçlarıdır. Vcc + besleme ucu Gnd - besleme ucu A ve B uçları da kod çıkış uçlarıdır. Bu çıkışlardan A ve B birbirlerine göre 90 derece faz farkı olan 2 kare dalgadır. Ürettikleri pals sayıları aynıdır. Bir tam turda enkoderin çözünürlüğü kadar pals üretirler. Eğer A çıkışı, B çıkışından 90 derece önde ise dönme yönü saat yönünde, B çıkışı A çıkışından 90 derece önde ise dönme yönü saat yönünün tersi yönündedir. Bu iki çıkış karşılaştırılarak dönme yönü belirlenebilmektedir.


Basitçe anlatmak gerekirse 2 kanalında sıfır olduğu zamanı başlangıç kabul eder isek önce A kanalı 1 oluyor ise saat yönü B kanalı bir oluyorsa Saatin ters yönü dönüş olmaktadır.

Örnek Arduino devresi:


Bu kullandığımız enkoderi bulmak oldukça kolaydır. Bu devreyi gerekli eklemeleri yaparak değer değiştirme, devir sayma veya menü ayarlamada kullanabiliriz. Enkoderin ortasında bir tanede butun bulunmaktadır, bu buton ile menülerde seçme işlemi yapılabilir. Enkoder uçları ise CLK kanal A, DT Kanal B, SW buton ucu,+ pozitif besleme, GND ise negatif beslemedir.

Örnek Arduino kodu:

// Pin Tanımlamaları 
const int swPin = 3;  // Buton pini
const int clkPin = 4; // CLK (A kanalı)
const int dtPin = 5;  // DT (B kanalı)

int sayac = 0; 
int sonDurumCLK;
unsigned long sonDebounceZamani = 0;

void setup() {
  pinMode(clkPin, INPUT);
  pinMode(dtPin, INPUT);
  pinMode(swPin, INPUT_PULLUP); // Dahili pull-up direnci aktif

  Serial.begin(9600);

  // Başlangıç durumunu oku
  sonDurumCLK = digitalRead(clkPin);
  
  Serial.println("Enkoder Hazir!");
}

void loop() {
  // CLK pinindeki değişimi oku
  int simdikiDurumCLK = digitalRead(clkPin);

  // Eğer CLK durumu değişmişse (Dönüş başladıysa)
  if (simdikiDurumCLK != sonDurumCLK) {
    
    // DT pininin durumu, CLK ile aynı değilse saat yönüne dönüyordur
    if (digitalRead(dtPin) != simdikiDurumCLK) {
      sayac++;
    } else {
      sayac--;
    }

    // Yeni değeri seri monitöre yazdır
    Serial.print("Pozisyon: ");
    Serial.println(sayac);
  }

  // Mevcut durumu bir sonraki döngü için kaydet
  sonDurumCLK = simdikiDurumCLK;

  // Buton Kontrolü (Sayacı sıfırlar)
  if (digitalRead(swPin) == LOW) {
    if (millis() - sonDebounceZamani > 200) { 
      sayac = 0;
      Serial.println("Pozisyon Sifirlandi!");
      sonDebounceZamani = millis();
    }
  }
}

💬 Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
Sayfa Başı
Yenidir CMS V0.1