Arduino programlama konularımızda bir adım daha ileri gidiyoruz. Önceki konularımızda Arduino ile led yakmıştık. Şimdi ise Arduino'muza bir buton bağlayıp ledimizi buton yardımıyla yakacağız. Böylece Arduino'da digital giriş-çıkış işlemlerinin nasıl olduğunu öğrenmiş olacağız.
Bu konuya başlamadan önce atmel-avr-9-buton-baglantları konusunu okursanız faydalı olacaktır. Buton bağlantılarının nasıl yapıldığı konusunda detaylı bilgi sahibi olacaksınız. Konuyu anlatırken buton bağlantılarının nasıl yapıldığını bildiğinizi varsayarak anlatacağım.
Bu konumuzda yapmak
istediğimiz Arduino'nun Digital giriş/çıkışlarından (D0,D1,........D13)
herhangi birine bir buton ve diğer bir tanesine de led bağlayıp,
butonumuza bastığımız zaman led'i yakmak.
Önce devremizi hazırlayalım. Daha sonra devre bağlantılarına göre programımızı yazmaya başlayacağız.
Buton bağlantısının nasıl olması gerektiğine karar vermeliyiz. atmel-avr-9-buton-baglantları buradaki konuda da bahsettiğim gibi genellikle pull-up buton bağlantısını tercih ediyorum.
Şekilde de gördüğünüz gibi butona basılmadığı durumlarda buton için belirlenen mikrodenetleyici pini lojik 1(HIGH) durumundadır. Butona basıldığı zaman ise bu pin Lojik 0 (LOW) durumuna geçecektir. O zaman biz de programımızda normalde Lojik 1(HIGH) durumunda olan pini devamlı olarak kontrol eder Lojik 0 durumuna geçip geçmediğine bakarız. Eğer pinin durumu lojik 0 durumuna geçtiyse anlarız ki butona basılmış. Şunu da bilmeliyiz ki butondan bilgi pine geldiği için bu pin giriş pini olmalı ve giriş olarak yönlendirilmelidir.
Dijital giriş pininin durumunu, o pinin o anki değerini okuyarak öğrenebiliriz. Bunun için Arduino 'nun digitalRead(pin) fonksiyonundan yararlanacağız.
digitalRead(pin) bize pin ile belirtmiş olduğumuz pinin o anki değerini okur ve LOW veya HIGH olmak üzere bize durum bildirir.
Örneğin buton D11 pinine yukarıdaki şekildeki gibi pull-up olarak bağlı olmuş olsun.
digitalRead(11) =HIGH ise butona basılmamış
digitalRead(11)=LOW ise butona basılmıştır deriz.
digitalRead(pin) fonksiyonunda pin ifadesi önceden tanımlanabilir ve tipi int (integer) olmalıdır. (değişken tipleri konusunda bir sonraki konuda bilgi vereceğim.)
Devremizin tamamı aşağıdaki gibi olacak
Devrede de görüldüğü gibi led D12 pinine bağlanmış. bağlantı şekline göre D12 pininin durumu lojik 1(HIGH) olduğunda led yanacak, Lojik 0 (LOW) olduğunda led sönecek.
Programımızda öncelikle led ve buton pin tanımlamalarını yapmalıyız.
#define led 12
#define buton 11
#define buton 11
led ve butonun bağlı olduğu pinler için pinlerin giriş/çıkış yönlendirmesini yapmalıyız. Bunu setup() fonkisyonu içersinde yapacağız.
pinMode(led,OUTPUT); led pini çıkış
pinMode(buton,INPUT); buton pini giriş
Şimdi sıra geldi butonun bağlı olduğu pinin durumunu okumaya . Bunun için if () - else deyimini kullanacağız. Önce atmel-avr-10-buton-led-uygulamas konusunu incelemenizde fayda var.
kabaca programımız şöyle olmalı
Eğer buton sıfır ise led yak
değil ise led söndür
yani
{
digitalWrite(led,HIGH);
}
burada if(digitalRead(buton)== LOW) ifadesindeki "==" iki tane eşit "eşit midir? " anlamına gelir.
if(digitalRead(buton)== LOW) ifadesini if(!digitalRead(buton)) şeklinde de yazabiliriz. aynı anlama gelir. burada "!" sıfır anlamı taşımaktadır. if( şart ) deyiminde şart kısmının sonucu sıfır veya LOW oluyursa , "== LOW " ifadesi yerine başa "!" konulabilir.
yukarıdaki kod parçasında "EĞER BUTON LOW İSE LED'İ YAK "demiş olduk.
peki "EĞER BUTON LOW DEĞİL İSE " ne yapacağını nasıl belirteceğiz. burada devreye else ifadesi giriyor. if (şart) içersinde şart doğru değil ise if(şart)'tan sonra gelen {..} parantez aralığındaki işlemler yapılmayacak bu sefer else {...} 'teki işlemler yapılacak.
else
{
digitalWrite(led,LOW);
}
{
digitalWrite(led,LOW);
}
burada da "EĞER BUTON LOW DEĞİL İSE (HIGH İSE) LED'İ SÖNDÜR " demiş olduk.
buna göre programımızın tamamı :
#define led 12
#define buton 11
void setup() {
pinMode(led,OUTPUT);
pinMode(buton,INPUT);
}
void loop() {
if(!digitalRead(buton))
{
digitalWrite(led,HIGH);
}
else
{
digitalWrite(led,LOW);
}
}
#define buton 11
void setup() {
pinMode(led,OUTPUT);
pinMode(buton,INPUT);
}
void loop() {
if(!digitalRead(buton))
{
digitalWrite(led,HIGH);
}
else
{
digitalWrite(led,LOW);
}
}
Programımızı Arduino kütüphanesindeki digitalRead() ve digitalWrite() fonksiyonlarını kullanarak yazdık. Şimdi de bu fonksiyonları kullanmadan Arduino Nano içindeki Atmega328p mikrodenetleyicisinin registerlarını kullanarak yazacağız. Programları bu şekilde yazıp yazmamak sizin tercihinize kalmış . Sadece ben kütüphane fonksiyonlarını öğrenmek istiyorum diyebilirsiniz. Ancak mikrodenetleyici ile register seviyesinde kod yazmak mikrodenetleyiciye daha çok hakim olmanızı sağlar. Arka planda neler döndüğünü , mikrodenetleyicinin nasıl davrandığını bilmenizi sağlar.
Atmega328p ile Atmel Studio programında atmel-avr-10-buton-led-uygulamas konusunda register seviyesind nasıl kod yazdığımız anlatmıştım. Bu konuyu incelemelisiniz. burada yapmış olduğumuz programı şimdi arduinoya uyarlayacağız.
Öncelikle led için kullandığımız D12 ve buton için kulandığımız D11 pinlerinin gerçekte Atmega 328p'de neye karşılık geldiğini bilmeliyiz.
D12 = PB4 ve D11 = PB3
led ve buton tanımlamalarımızı baştan yapmalıyız.
#define led 4
#define buton3
giriş /çıkş yönlendirmemiz için DDRB registerını kullanmalıyız. DDRB registerı portb'nin giriş/çıkış yönlendirmesini yapar. atmel-avr-4-ilk-programmz-led-yakmaca buradaki konuda port yönlendirme işlemi detaylı olarak anlatılmıştır.
DDRB|=(1<<led); led pini çıkış
DDRB&=~(1<<buton); buton pini giriş yapıldı
şimdi sıra geldi buton pinini okumaya
if(!(PINB & 0X80)) // butona basıldıysa
{
PORTB|=(1<<led); // led yak
}
else
{
PORTB&=~(1<<led); // led söndür
}
{
PORTB|=(1<<led); // led yak
}
else
{
PORTB&=~(1<<led); // led söndür
}
programın tamamı :
#define led 4
#define buton 3
void setup() {
DDRB|=(1<<led); // buton pini giriş
DDRB&=~(1<<buton); // led pini çıkış
}
void loop() {
#define buton 3
void setup() {
DDRB|=(1<<led); // buton pini giriş
DDRB&=~(1<<buton); // led pini çıkış
}
void loop() {
if(!(PINB & 0X80)) // butona basıldıysa
{
PORTB|=(1<<led); // led yak
}
else // butona basılmadıysa
{
PORTB&=~(1<<led); // led söndür
}
}
Yorumlar
Yorum Gönder