Yazılardaki ürünleri komponentci.net'te inceleyebilir, hemen sipariş verebilirsiniz.komponentci.net →
KomponentciBlog Mağaza

KY-040 Rotary Encoder: Yön Algılama, Kesme ve Menü

KY-040 Rotary Encoder: Yön Algılama, Kesme ve Menü
Kısa cevap

KY-040 rotary encoder, döndürüldükçe CLK ve DT pinlerinden birbirine göre kaydırılmış iki darbe dizisi üreten, basılınca SW pinini GND'ye çeken bir döner kodlayıcı modülüdür. Dönüş yönü, CLK değiştiği anda DT'nin durumuna bakılarak bulunur. Arduino Uno'da CLK ve DT'yi kesme destekli D2 ve D3 pinlerine bağlamak adım kaçırmayı önler.

3D yazıcıların, laboratuvar güç kaynaklarının ve araç teyplerinin düğmesi sonsuz döner; bir sınırı yoktur ve her tıkta bir adım ilerler. Bu düğmenin adı rotary encoder'dır ve Arduino projelerinde en yaygın sürümü KY-040 modülüdür. Bu yazıda KY-040'ın pinlerini, dönüş yönünün nasıl anlaşıldığını, kesme ile güvenilir okumayı ve encoder ile basit bir menünün nasıl kontrol edildiğini anlatıyoruz.

KY-040 rotary encoder nedir?

KY-040, mil döndürüldükçe iki kanaldan darbe üreten artımlı bir döner kodlayıcıyı (rotary encoder) ve ona bağlı bir basma düğmesini aynı kartta toplayan bir giriş modülüdür. Mil sınırsız döner ve her tık bir adım sayılır.

Encoder mutlak konum bildirmez; yalnızca kaç adım ve hangi yöne dönüldüğünü bildirir. Konumu sayan ve saklayan Arduino'dur. KY-040 rotary encoder modülü ve Arduino rotary encoder modülü pin dizilimi hazır kartlardır. Kendi panelinize lehimleyecekseniz kartsız EC11 rotary encoder de aynı mantıkla çalışır; bu durumda pull-up dirençlerini siz eklersiniz. Tur başına tık sayısı modele göre değişir.

Rotary encoder ile potansiyometre arasındaki fark nedir?

Rotary encoder sonsuz döner ve adım sayar, potansiyometre ise yaklaşık bir turla sınırlıdır ve konuma göre değişen bir direnç verir. Bu yüzden encoder dijital, potansiyometre analog bir giriştir.

ÖzellikKY-040 rotary encoderPotansiyometre
DönüşSınırsız, tıklıSınırlı, sürekli
Çıkışİki kanal dijital darbeAnalog gerilim
Okunan değerAdım ve yönMutlak konum
Arduino piniİki dijital pin (+ buton)Bir analog pin
KapanıncaKonum kodda saklanmazsa kaybolurDüğme yerinde kalır
Uygun işMenü, sayı ayarı, çok turlu ayarSes, parlaklık, hız

Potansiyometrenin yapısı için potansiyometre nedir yazımıza bakabilirsiniz.

KY-040 Arduino'ya nasıl bağlanır?

KY-040 Arduino Uno'ya CLK D2'ye, DT D3'e, SW D4'e, + pini 5V'a ve GND GND'ye gelecek şekilde bağlanır. D2 ve D3, Uno'da harici kesme (interrupt) destekleyen iki pindir.

  1. Modülün GND pinini Arduino GND'ye, + pinini 5V'a bağlayın.
  2. CLK pinini D2'ye, DT pinini D3'e bağlayın.
  3. SW pinini D4'e bağlayın ve kodda bu pini INPUT_PULLUP olarak tanımlayın.
  4. Kodu yükleyip Seri Monitör'ü 9600 baud'da açın.
  5. Düğmeyi saat yönünde çevirin; sayı azalıyorsa CLK ve DT kablolarının yerini değiştirin.
KY-040 rotary encoder Arduino Uno bağlantı şeması: CLK D2, DT D3, SW D4, + 5V, GND GND; altta CLK ve DT sinyalleri, CLK düşerken DT HIGH ise konum artar, DT LOW ise azalır
CLK ve DT, Uno'da kesme destekleyen D2 ve D3'e bağlanır. Yön, CLK düştüğü anda DT'nin seviyesine bakılarak bulunur.

Bağlantıyı Arduino Uno R3 ve dişi-erkek jumper kablo ile lehimsiz kurabilirsiniz. KY-040 kartlarında CLK ve DT hatlarında genellikle pull-up direnci vardır, ancak SW hattında direnç bulunmayabilir; dahili pull-up bu boşluğu kapatır.

Rotary encoder dönüş yönünü nasıl algılar?

Rotary encoder dönüş yönünü, CLK ve DT sinyallerinden hangisinin önce değiştiğine göre bildirir; CLK değiştiği anda DT, CLK'den farklıysa bir yöne, aynıysa diğer yöne dönülüyordur. Bu iki sinyale aralarındaki çeyrek periyotluk kaymadan dolayı kuadratür sinyal denir.

Encoder'ın içinde iki kontak, milin üzerindeki dişlere göre sırayla açılıp kapanır. Saat yönünde dönerken bir kanal öne, ters yönde diğer kanal öne geçer. Hangi yönün "artı" sayılacağı kablolamaya bağlıdır; ters çıkarsa kodu değil kabloları değiştirmek yeterlidir.

KY-040 kesme (interrupt) ile nasıl okunur?

KY-040'ı kesme ile okumak için CLK pinine attachInterrupt() bağlanır; CLK her değiştiğinde kısa bir fonksiyon çalışır ve DT'ye bakarak sayacı artırır ya da azaltır. Böylece loop() başka işle meşgulken de adım kaçmaz.

const int CLK_PINI = 2;
const int DT_PINI = 3;
const int SW_PINI = 4;

volatile long konum = 0;
volatile int sonClk;

void enkoderOku() {
  int clk = digitalRead(CLK_PINI);
  if (clk != sonClk && clk == LOW) {
    if (digitalRead(DT_PINI) != clk) konum++;
    else konum--;
  }
  sonClk = clk;
}

void setup() {
  pinMode(CLK_PINI, INPUT);
  pinMode(DT_PINI, INPUT);
  pinMode(SW_PINI, INPUT_PULLUP);
  Serial.begin(9600);
  sonClk = digitalRead(CLK_PINI);
  attachInterrupt(digitalPinToInterrupt(CLK_PINI), enkoderOku, CHANGE);
}

void loop() {
  static long oncekiKonum = 0;
  noInterrupts();
  long k = konum;
  interrupts();
  if (k != oncekiKonum) {
    Serial.println(k);
    oncekiKonum = k;
  }
  if (digitalRead(SW_PINI) == LOW) {
    Serial.println("Buton");
    delay(250);
  }
}

Kesme içinde değişen değişkenler volatile tanımlanır ve loop() içinde kesmeler kısa süre kapatılarak okunur. Mekanik kontaklar sıçrama (bounce) yapar; tek tıkta birden fazla adım sayılıyorsa CLK ve DT ile GND arasına küçük birer seramik kondansatör eklemek ya da her iki pini kesmeyle izleyen Encoder kütüphanesini kullanmak sorunu azaltır.

Rotary encoder ile menü nasıl kontrol edilir?

Rotary encoder ile menü kontrolünde dönüş seçenekler arasında gezinmeyi, SW düğmesi ise seçimi onaylamayı sağlar. Mantık, sayaç değerini menü eleman sayısına göre sınırlamaktan ibarettir.

  • Gezinme: Menüde 3 seçenek varsa seçili satır ((k % 3) + 3) % 3 ile hesaplanır; böylece negatif sayaçta da 0, 1 ya da 2 bulunur.
  • Seçim: SW pini LOW olduğunda seçili satırın işlevi çalıştırılır.
  • Değer ayarı: Seçimden sonra encoder bu kez sıcaklık eşiği gibi bir sayıyı artırıp azaltır; ikinci basış menüye döner.
  • Gösterge: Menü bir LCD ya da OLED ekranda gösterilir; ekran yalnızca sayaç değiştiğinde yeniden çizilir.

Menüyü göstermek için SSD1306 OLED ekran yazımızdaki bağlantıyı kullanabilirsiniz. Gece görünürlüğü gereken panellerde LED'li rotary encoder modülü tercih edilebilir. Tüm encoder seçeneklerini trimpot ve encoder kategorisinde bulabilirsiniz.

Sık sorulan sorular

KY-040 neden bir tıkta iki adım sayıyor?

Bir tıkta iki ya da daha fazla adım sayılması çoğunlukla kontak sıçramasından ya da kodun CLK'nin hem düşen hem yükselen kenarını saymasından kaynaklanır. Yukarıdaki kod yalnızca düşen kenarı sayar. Sorun sürüyorsa CLK ve DT hatlarına küçük kondansatör ekleyin. Encoder kütüphanesi kullanıyorsanız çoğu modülde bir tık dört sayıma karşılık gelir; değeri dörde bölün.

KY-040 kesme olmadan okunabilir mi?

Evet, KY-040 loop() içinde CLK pini sürekli okunarak da kullanılabilir. Bu yöntem, döngüde delay() ya da uzun süren ekran güncellemesi yoksa yavaş çevirmede yeterli olur. Döngü yavaşladığında ya da düğme hızlı çevrildiğinde adımlar kaçar. Ekranlı ve sensörlü projelerde kesmeli okuma daha güvenilir sonuç verir.

KY-040 3,3V ile çalışır mı?

Evet, KY-040 yalnızca kontak ve pull-up dirençlerinden oluştuğu için 3,3V ile de çalışır. ESP32 gibi 3,3V kartlarda + pinini 3,3V'a bağlayın; böylece CLK ve DT çıkışları da 3,3V seviyesinde kalır. ESP32'de hemen hemen her dijital pin kesme desteklediği için pin seçimi daha serbesttir.

Arduino kapanınca encoder konumu neden sıfırlanıyor?

Encoder konumu Arduino kapanınca sıfırlanır, çünkü encoder mutlak konum bildirmez ve sayaç RAM'de tutulur. Ayarın kalıcı olmasını istiyorsanız değeri EEPROM'a yazın ve açılışta geri okuyun. EEPROM'un yazma ömrü sınırlı olduğu için her tıkta değil, düğmeye basınca ya da değer bir süre değişmeyince kaydetmek daha doğrudur.

KY-040 ile joystick arasında hangisi menü için daha uygundur?

Uzun listelerde ve sayı ayarında rotary encoder daha uygundur, çünkü her tık tam bir adımdır ve sınırsız döner. Joystick ise dört yönlü gezinme ve oyun benzeri kontrol gerektiren arayüzlerde avantajlıdır. İkisi aynı projede birlikte de kullanılabilir. Ayrıntılar için joystick modülü Arduino bağlantısı yazımıza bakabilirsiniz.

Özet

  • KY-040, sınırsız dönen milin adımlarını CLK ve DT'den iki dijital sinyalle bildiren, SW düğmeli bir rotary encoder modülüdür.
  • Bağlantı: CLK D2, DT D3, SW D4, + 5V, GND GND; SW için INPUT_PULLUP kullanılır.
  • Yön, CLK değiştiği anda DT'nin durumuna bakılarak bulunur; yön ters çıkarsa CLK ve DT yer değiştirilir.
  • Kesme ile okuma, loop meşgulken bile adım kaçırmayı önler.
  • Menüde dönüş gezinmeyi, SW seçimi sağlar; konum kalıcı olacaksa EEPROM'a yazılır.

Bu yazıdaki ürünler

Diğer yazılar