Arkadaşlar Merhaba, bu yazımızda buton arkı nedir, neden oluşur ve nasıl çözülür bunlardan bahsedeceğiz.

Buton Arkı Nedir? Neden Oluşur?

   Buton arkı nedir? Buton arkı, push buton ve anahtar uygulamaların da butona basıldığında ya da aç kapa yapıldığında iki metalin kısa bir süre içinde birçok kez bir araya gelme durumudur. Bunu daha iyi anlayabilmek için butonların iç yapılarını iyi bilmeliyiz.

2 ve 4 Bacaklı Push Butonlar

    Genellikle 2 veya 4 adet bacaktan oluşan push butonların 4 bacaklı olanlar için karşılıklı iki bacakları kısa devredir.

Bacaklı Push Butonların İç Kısımdaki Bağlantıları

  Bu mekanik yapıların iç yapısını incelediğimizde 2 adet plastik yüzey ve iki adet metal yüzey karşımıza çıkar. Butona basıldığında iki metal plaka birbirine değerek kısa devre olur. Bu sayede devre iletime geçer. Kullanıcı için sadece 1 kez temas yapılmış gibi görünebilir ancak butonun içindeki hareketli parçalar kısa bir süre içinde birçok kez temas kurar. Sonunda tamamen açılır ve kapanır. Farklı buton türleri için bu durum değişkenlik göstermek ile beraber yaklaşık olarak 1 ms’lik periyotta 10 ila 100 kez olabilir.

Push Butonların İç Yapıları

   Bu durum devrede veya sistemde butona birkaç kez basıldığının düşünülmesine sebep olabilir. Devrelerde olumsuz ve yanlış durumlara sebebiyet verebilir. Bu istenmeyen durumun donanımsal ve yazılımsal çözümleri mevcuttur.

Buton Arkı Çözümleri Nelerdir?

1)Donanımsal:

 Aşağıdaki devrede mikrodenetleyici ile yapılan normal buton bağlantısına yer verilmiştir. Bu bağlantıda buton açık durumda iken devre 10k pull-down direnci ile toprağa bağlanmıştır yani digital pinden 0 değeri okunmaktadır. Buton kapalı duruma geçtiğinde buton arkından dolayı atlamalar olacak digital pinden birkaç kez 1 veya 0 değerlerini okuduktan sonra 1 değeri görülecektir.

Normal Buton Bağlantısı
Normal Buton Bağlantısında Oluşan Buton Arkı

  Yukarıdaki fotoğrafta da görüldüğü gibi butona basılma anında oluşan buton arkları çıkışta rastgele 1 veya 0’ların okunmasına sebep oluyor. Bu buton arklarını RC filtreleme yaparak önleyebiliriz. Bunun için butonumuza paralel 0.1uF değerinde seramik kapasitör ekleyebiliriz. Aşağıda devreye 0.1uF seramik eklendikten sonraki hali verilmiştir.

Butona Paralel Olarak Seramik Kapasitör Eklendikten Sonraki Devre

Devremiz bu şekilde düzenlendiğinde buton arklarının filtrelendiği, 0’dan 1’e geçişin daha yumuşak olduğu aşağıdaki osiloskop fotoğrafında gözükmektedir.

Butona Paralel Kapasitör Eklendikten Sonra Gözlemlenen Sonuç

2)Yazılımsal:

  Butonlarda oluşan bu arkları yukarıda bahsettiğimiz yol ile çözebileceğiniz gibi yazılımsal olarak da çözmek mümkündür. Buton aktif edildikten sonra işlemcinin hızına göre 50ms-150ms arasında bir bekleme vermek bir çözüm gibi görünse de işlemciyi meşgul etmek iyi bir yöntem değildir. Buton arklarını bekleme vererek çözmek yerine zamanlayıcı(timer) veya arduino platformunda çalışıyorsanız millis() komutu ile yapmak program optimizasyonu açısından daha iyi sonuçlar verecektir.

 Aşağıda yazılımsal olarak buton arkını önlemek için arduino ide üzerinde yazılmış kodu bulabilirsiniz. Buton devrelerinizde kullanabilirsiniz.

Devre Şemamız

Arduino Kodu:

const int butonPin = 2;    // butonun bağlı olduğu pin
const int ledPin = 13;      // led'in bağlı olduğu pin

int ledDurum = HIGH;         // çıkış pininin son durumu
int butonDurum=0;           // giriş pininin son durumu
int butonSonDurum = LOW;   // giriş pininden okunan önceki durum

unsigned long sonArkSuresi = 0;      
unsigned long gecikme = 50;    

void setup() {
  pinMode(butonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  
  digitalWrite(ledPin, ledDurum);
}

void loop() {
  
  int butonDeger = digitalRead(butonPin); // ilk değerrimizi okuyoruz.

  if (butonDeger != butonSonDurum) {// ilk durumdan farklı ise millis komutu ile süreyi //başlatıyoruz
    sonArkSuresi = millis();
  }

  if ((millis() - sonArkSuresi) > gecikme) {// başta atadığımız gecikme süresini aşmış ise //butonun 1 veya 0 olduğuna dair kesin bir atama yapıyoruz.
    if (butonDeger != butonDurum) {
      butonDurum = butonDeger;
      if (butonDurum == HIGH) {
        ledDurum = !ledDurum;
      }
    }
  }

  digitalWrite(ledPin, ledDurum);

  butonSonDurum = butonDeger; // en son aldığımız değeri buton son durumuna yazıyoruz.
}

Arduino gibi mikrodenetleyicilerde buton arkını önlemek için hem donanımı sade tutmak hem de paradan tasarruf etmek için genellikle yazılımsal yollar tercih edilmektedir. Sizler de kurduğunuz devreler de donanımsal veya yazılımsal yolu tercih ederek sisteminizi geliştirebilirsiniz. Umarım yazımız sizler için faydalı olmuştur, diğer yazılarımızda görüşmek üzere.Sağlıcakla kalın.

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz