Arduino İle Buton Kullanımında Yapılan Hatalar
Basmalı düğmeler, LED’leri, röleleri, motorları ve aklınıza gelebilecek hemen hemen her şeyi kontrol etmek için kullanılabilir. Bu yazıda Arduino’ya bir buton nasıl bağlanacağını ve programlanacağını öğreneceğiz. Ayrıca kayan pinler, Pull Up ve Pull Down dirençleri, digitalRead() işlevi ve Arduino’nun dahili Pull Up direnci hakkında da bilgi edineceğiz. Bu makaleyi okuduktan sonra, herhangi bir projeye basmalı düğmeler ekleyebileceksiniz.
Basmalı Düğmeler(Buton) ve Çeşitleri
Basmalı düğmeler çeşitli farklı biçimlerde mevcuttur:
Bu makalede kullanacağımız basma düğmesi, dokunsal anahtar veya anlık basma düğmesi olarak da bilinir:
Düğmenin her iki yanındaki pimler, düğme muhafazasının içinde elektrik kontaklarına sahiptir. Düğmenin kendisine bağlı elektriksel olarak iletken bir metal parçası vardır. Düğmeye basıldığında, devre her iki taraftaki pinler arasında kapanır ve aralarından akım geçmesine izin verilir:
Arduino İle Buton Kontrol Projesi
Cihazların buton ile nasıl kontrol edileceğini göstermek için butona basıldığında LED’i açan bir devre oluşturalım. LED sadece bir örnektir, bu devreyi 5 voltluk bir sinyalle çalışan herhangi bir cihazı kontrol etmek için kullanabilirsiniz.
Projede gerekli malzemeler:
Aşağıdaki devremizi kuralım ve kodumuzu yazalım.
Led için akım sınırlayıcı direnç değeri 200 Ohm ile 1K Ohm arasında herhangi bir değer olabilir.
Basmalı butonun bir tarafı 5 volta, diğer tarafı pin 7’ye bağlanır. Butona basıldığında akım pin 7’ye akacak ve onu yükseltecektir. Bunun ne zaman olduğunu algılamak için digitalRead() işlevini kullanacağız. Ardından, pin 11’i HIGH ayarlamak için digitalWrite() işlevini kullanacağız ve LED’in yanmasını sağlayacağız.
Arduino Buton Kontrol Kodu
Devreyi bağladıktan sonra bu kodu Arduino’ya yükleyin:
int buttonPin = 7;
int ledPin = 11;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
int buttonState = digitalRead(buttonPin);
digitalWrite(ledPin, buttonState);
}
Çizimin üst kısmında iki pin değişkeni tanımlıyoruz. buttonPin değişkeni, butona bağlı olan Arduino pininin pin numarasını tutacaktır (pin 7). ledPin değişkeni, LED’e bağlı Arduino pin numarasını tutacaktır.
setup() bölümünde, buttonPin’i girdi olarak ayarlamak için pinMode() fonksiyonunu kullanıyoruz. Ardından ledPin’i çıkış olarak ayarlıyoruz.
loop() bölümünde, buttonState adında bir int değişkeni tanımlıyoruz ve onu digitalRead(buttonPin) değerine eşitliyoruz. Düğmeye basılmadığında, buttonPin’deki voltaj LOW olacak, bu nedenle digitalRead() işlevi LOW bir değer döndürecektir. LOW değeri buttonState değişkeninde saklanır. Düğmeye basıldığında, buttonPin’deki voltaj HIGH olacaktır, bu nedenle buttonState değişkeninde HIGH değeri saklanacaktır.
LED’e bir voltaj sinyali göndermek için digitalWrite() işlevini kullanırız. Gerilimi göndermek istediğimiz pin ledPin yani ilk argüman bu. digitalWrite() işlevinin ikinci argümanı, fonksiyona pine HIGH veya LOW voltaj göndermesini söyler. Ancak HIGH veya LOW yazmak yerine buttonState değişkenini kullanabiliriz ve fonksiyon o değişkende depolanan değeri ledPin’e yazacaktır.
Kayan Pinler
Yukarıdaki projeyi derler ve test ederseniz, garip bir şeyler olduğunu fark edeceksiniz. Elinizi düğmeye her yaklaştırdığınızda LED muhtemelen yanıp sönecektir. Buna ne sebep olabilir?
Arduino’nun dijital pinleri son derece hassastır. Elinizin yarattığı zayıf elektromanyetik alanlar bile Arduino tarafından algılanabilir. Ve bunlar digitalRead() işlevi tarafından yüksek sinyaller olarak kaydedilir.
GPIO pinlerinin başıboş elektromanyetik alanları almasına izin verildiğinde, bunlara kayan pinler denir. Butona basılmadığında buttonPin’in düşük kalmasını sağlayarak bunu düzeltmemiz gerekiyor. Peki bunu nasıl yapabiliriz?
Arduino İle Pull Down Direnci
En kolay yol, basma düğmesinin sol tarafından toprağa bir direnç bağlamaktır:
Düğmeye basılmadığında, direnç üzerinden kaçak elektromanyetik enerji toprağa akacaktır. Düğmeye basıldığında, direnç toprağa akımı sınırlayacak ve akım pim 7’ye akacaktır. Buna Pull Down direnci denir, Çünkü düşük voltaj durumunda tutmak için bir pimi toprağa bağlar. Pull Down direncinin değeri değişebilir, ancak genellikle 10K Ohm’dan yüksektir.
Arduino İle Pull Up Direnci
Pull Up dirençleri, Pull Down dirençlerinden daha yaygındır. Pull Up dirençleri bir voltaj kaynağına bağlanır ve pimi yüksek voltaj durumunda tutar:
Bu devrede pull up direnci 5 volta, butonun sağ tarafı ise toprağa bağlanmıştır. Düğmeye basmak, LED’i açarak pim 7’ye düşük bir sinyal gönderir. Yukarı çekme direnci 5 volta bağlıdır ve düğmeye basılana kadar pim 7’yi yüksek tutar.
Arduino Pull Up Direçli buton kontrol kodu:
int buttonPin = 7;
int ledPin = 11;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH);
}
if (buttonState == HIGH) {
digitalWrite(ledPin, LOW);
}
}
Önceki programa benzer şekilde buttonPin ve ledPin değişkenleri için değişkenler tanımlıyoruz ve bunları çıktı olarak ayarlıyoruz. Ardından buttonPin’in voltaj durumunu tespit etmek için digitalRead() işlevini kullanırız ve onu buttonState değişkeninde saklarız.
ButtonState değişkeni düşük olduğunda Arduino’nun ledPin’e yüksek bir sinyal göndermesini istiyoruz. loop() bölümünde, buttonState değişkeni HIGH veya LOW olduğunda ne olacağını kontrol etmek için iki if ifadesi kullanırız. buttonState LOW ise, ilk if ifadesi yürütülür ve ledPin HIGH yazılır. buttonState değişkeni HIGH ise program ikinci if deyimine girer ve ledPin’e LOW voltaj yazılır.
Yani şimdi düğmeye bastığınızda, elinizi devrenin etrafında hareket ettirdiğinizde LED yanmalı ve titrememelidir. Kayan pin sorunu çözüldü.
Arduino Dahili Pull Up Direnci
Bu yazıda incelediğimiz Pull Up ve Pull Down dirençleri harici devre bileşenleridir. Ancak Arduino’nun aynı amaç için kullanabileceğiniz dahili bir Pull Up direnci de vardır. Arduino’nun dahili Pull Up direncini kullanmak için, buttonPin için pinMode() işlevinde ikinci argüman olarak INPUT_PULLUP kullanın:
int buttonPin = 7;
int ledPin = 11;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH);
}
if (buttonState == HIGH) {
digitalWrite(ledPin, LOW);
}
}
Şimdi devreyi 5 volta bağlı Pull Up direnci olmadan bağlayabilirsiniz. Dahili Pull Up direnci, daha az bileşen kullanır ve devreyi biraz daha basitleştirir.