Arduino'ya bir düğme bağlamaya zaten baktık ve kontakların "zıplama" konusuna değindik. Bu, tekrarlanan düğmeye basılmasına neden olan ve düğme tıklamalarını programlı olarak işlemeyi zorlaştıran çok can sıkıcı bir olgudur. Temas sıçramasından nasıl kurtulacağımız hakkında konuşalım.
Gerekli
- -Arduino;
- - dokunma düğmesi;
- - nominal değeri 10 kOhm olan direnç;
- - Işık yayan diyot;
- - bağlantı kabloları.
Talimatlar
Aşama 1
Kontak sıçraması, mekanik anahtarlarda, basmalı düğmelerde, geçiş anahtarlarında ve rölelerde yaygın bir olgudur. Kontakların genellikle esnekliğe sahip metallerden ve alaşımlardan yapılması nedeniyle, fiziksel olarak kapatıldıklarında hemen güvenilir bir bağlantı kurmazlar. Kısa bir süre içinde kontaklar birkaç kez kapanır ve birbirini iter. Sonuç olarak, elektrik akımı anında değil, bir dizi iniş ve çıkıştan sonra sabit durum değeri alır. Bu geçici etkinin süresi, temas malzemesine, boyutuna ve tasarımına bağlıdır. Şekil, dokunma düğmesinin kontakları kapatıldığında tipik bir osilogramı göstermektedir. Kararlı duruma geçiş anından itibaren geçen sürenin birkaç milisaniye olduğu görülebilir. Buna "sıçrama" denir.
Bu etki, aydınlatmayı, motorları veya diğer atalet sensörlerini ve cihazlarını kontrol eden elektrik devrelerinde fark edilmez. Ancak bilginin hızlı okunması ve işlenmesinin olduğu devrelerde (frekansların "sıçrama" darbeleriyle aynı veya daha yüksek olduğu durumlarda), bu bir sorundur. Özellikle 16 MHz'de çalışan Arduino UNO, 0'dan 1'e tek bir anahtar yerine birler ve sıfırlar dizisini kabul ederek temas sıçramasını yakalamada mükemmeldir.
Adım 2
Temas sıçramasının devrenin doğru çalışmasını nasıl etkilediğini görelim. Bir pull-down direnç devresi kullanarak saat düğmesini Arduino'ya bağlayalım. Butona basarak led'i yakacağız ve butona tekrar basılana kadar açık bırakacağız. Anlaşılır olması için, yerleşik olandan vazgeçilebilmesine rağmen, dijital pim 13'e harici bir LED bağladık.
Aşama 3
Bu görevi gerçekleştirmek için akla gelen ilk şey:
- düğmenin önceki durumunu hatırlayın;
- mevcut durumla karşılaştırın;
- durum değiştiyse, LED'in durumunu değiştiririz.
Böyle bir eskiz yazıp Arduino hafızasına yükleyelim.
Devre açıldığında, temas sıçramasının etkisi hemen görülür. Düğmeye bastıktan hemen sonra LED'in yanmaması veya yanması ve ardından sönmesi veya düğmeye bastıktan hemen sonra kapanmaması, ancak açık kalması ile kendini gösterir. Genel olarak devre stabil çalışmıyor. Ve LED'i açan bir görev için bu çok kritik değilse, o zaman diğer, daha ciddi görevler için kabul edilemez.
4. Adım
Durumu düzeltmeye çalışacağız. Bir kontak kapandıktan sonra kontak sıçramasının birkaç milisaniye içinde gerçekleştiğini biliyoruz. Diyelim ki butonun durumunu değiştirdikten sonra 5ms bekleyelim. Bir kişi için bu süre neredeyse bir an ve bir kişinin bir düğmeye basması genellikle çok daha uzun sürer - birkaç on milisaniye. Ve Arduino bu kadar kısa sürelerle harika çalışıyor ve bu 5ms, bir düğmeye basarak kontakların sıçramasını kesmesine izin verecek.
Bu eskizde, girişine düğmenin önceki durumunu sağladığımız debounce () prosedürünü (İngilizce'de "sıçrama" sadece "sıçrama", "de" öneki ters işlem anlamına gelir) ilan edeceğiz. Bir düğmeye basılması 5 msn'den fazla sürerse, gerçekten basılmış demektir.
Baskıyı algılayarak LED'in durumunu değiştiriyoruz.
Krokiyi Arduino panosuna yükleyin. Artık her şey çok daha iyi! Düğme hatasız çalışıyor, basıldığında LED istediğimiz gibi durum değiştiriyor.
Adım 5
Benzer işlevsellik, Bounce2 kitaplığı gibi özel kitaplıklar tarafından sağlanır."Kaynaklar" bölümündeki bağlantıdan veya https://github.com/thomasfredericks/Bounce2 web sitesinde indirebilirsiniz. Kütüphaneyi kurmak için Arduino geliştirme ortamının kütüphaneler dizinine yerleştirin ve IDE'yi yeniden başlatın.
"Bounce2" kitaplığı aşağıdaki yöntemleri içerir:
Bounce () - "Bounce" nesnesinin başlatılması;
boşluk aralığı (ms) - gecikme süresini milisaniye olarak ayarlar;
geçersiz takma (pin numarası) - düğmenin bağlı olduğu pimi ayarlar;
int update () - nesneyi günceller ve pin durumu değiştiyse true, aksi takdirde false döndürür;
int read() - pinin yeni durumunu okur.
Kütüphaneyi kullanarak eskizimizi yeniden yazalım. Ayrıca butonun geçmiş durumunu hatırlayabilir ve mevcut durumu ile karşılaştırabilirsiniz, ancak algoritmayı basitleştirelim. Düğmeye basıldığında, basışları sayacağız ve her bir tek basış LED'i açacak ve her çift basış onu kapatacaktır. Bu eskiz özlü, okunması kolay ve kullanımı kolay görünüyor.