Arduino ile Encoder Değerleri Nasıl Okunur

D

Daniel Zhang

Son güncelleme tarihi Jul 12, 2026

Encoder değerinin nasıl okunacağı, encoder türüne bağlıdır. Artımlı ve mutlak encoder'lar için okuma yöntemleri aşağıda açıklanmıştır.

Artımlı Encoder

Artımlı encoder'lar iki çıkış sinyal kanalı sunar: Kanal A ve Kanal B. Bunlar, birbirine göre 90 elektriksel derece kaydırılmış darbe sinyalleridir. Kanal A ve Kanal B üzerindeki durum değişikliklerini algılayarak hem yönü hem de dönme açısını belirleyebilirsiniz. Aşağıda, bir Arduino ile artımlı encoder okumak için temel adımlar yer almaktadır.

  1. Encoder'ın Kanal A ve Kanal B uçlarını Arduino'nun kesme (interrupt) destekli pinlerine bağlayın (örneğin, pin 2 ve pin 3).
  2. Arduino kodunda encoder sayacını saklamak için global bir değişken tanımlayın.
  3. Kanal A ve Kanal B üzerindeki durum değişikliklerini işlemek için bir kesme servis rutini (ISR) yazın. Bu rutin içinde, bir kanalın mevcut durumunu diğer kanalın önceki durumuyla karşılaştırarak dönme yönünü belirleyin ve encoder sayacını buna göre güncelleyin.
volatile long encoderCount = 0;
int lastB = 0;

void encoderInterrupt() {
  int A = digitalRead(2);
  int B = digitalRead(3);
  // Basit quadrature çözümleme: mevcut A ile önceki B'yi karşılaştır
  if (A == lastB) {
    encoderCount++;
  } else {
    encoderCount--;
  }
  lastB = B;
}
  1. setup() fonksiyonunda pin modlarını yapılandırın ve Kanal A veya Kanal B'nin durumu her değiştiğinde ISR'nin tetiklenmesi için kesmeleri ekleyin.
void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  lastB = digitalRead(3);
  attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
  attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
  1. Ana loop() içinde, motor milinin bağıl konumunu ve dönme yönünü elde etmek için encoderCount değişkenini okuyun.

Not: Yukarıdaki örnek, basitleştirilmiş bir quadrature çözümleme yaklaşımı kullanmaktadır. Yüksek hızlı veya yüksek çözünürlüklü encoder'lar için, sinyal titreşimi veya kontak sekmesi (contact bounce) nedeniyle oluşabilecek sayım kayıplarını önlemek adına tam bir quadrature durum makinesi veya özel bir encoder arayüz kütüphanesi kullanmayı düşünün.

Mutlak Encoder

Mutlak encoder'lar, motor milinin mutlak konumunu temsil eden bir dijital sinyal çıkarır. Aşağıdaki örnek, özellikle paralel çıkışlı mutlak encoder'lar için geçerlidir; bu tür encoder'larda konum değerinin her biti ayrı bir veri hattında sunulur.

Not: Endüstriyel mutlak encoder'ların çoğu, paralel çıkışlar yerine SSI, SPI veya RS-485 gibi seri haberleşme arayüzleri kullanır. Bu arayüzler farklı okuma yöntemleri gerektirir ve bazı durumlarda özel protokol kütüphanelerine ihtiyaç duyar. Doğru arayüz ve kablolama detayları için her zaman encoder'ınızın veri föyüne (datasheet) başvurun.

  1. Encoder'ın her bir veri pinini Arduino'nun bir dijital giriş pinine bağlayın.
  2. setup() fonksiyonunda her bir veri pinini giriş moduna ayarlayın.
void setup() {
  pinMode(dataPin1, INPUT);
  pinMode(dataPin2, INPUT);
  // ... Encoder bit sayısına bağlı olarak ek veri pinleri
}
  1. Encoder değerini okumak için bir fonksiyon yazın. Bu fonksiyonda, her bir veri pininin durumunu digitalRead() ile okuyun ve sonuçları tek bir tamsayı değerinde birleştirin.
int readEncoder() {
  int value = 0;
  value |= digitalRead(dataPin1) << 0;
  value |= digitalRead(dataPin2) << 1;
  // ... Encoder bit sayısına bağlı olarak ek veri pinleri
  return value;
}
  1. Ana loop() içinde, motor milinin mutlak konumunu elde etmek için readEncoder() fonksiyonunu çağırın.

Not: Bu örnekler temel encoder türlerini kapsamaktadır. Gerçek dünya uygulamalarındaki encoder'lar, sinyal sekme önleme (debouncing) uygulanması veya özel bir encoder arayüz IC'si kullanılması gibi daha gelişmiş işleme gerektirebilir. Doğru kablolama ve sinyal işleme için her zaman encoder'ın veri föyüne (datasheet) başvurun.