Robotik ve Kodlama

Arduino

Dış Kesmeler (External interrupt)

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

Arduino projelerinde sıkça kullanılan diğer bir kesme çeşidi de dış kesmelerdir. Dış kesmeler, Arduino'nun özel pinlerinde gerçekleşen voltaj değişimlerini takip eden kesmelerdir. Örneğin Arduino'nun dış kesme pinine bağlanmış bir düğmeye basıldığında, dış kesme Arduino'ya otomatik olarak haber verir. Bu kesme sayesinde Arduino sürekli olarak düğmeye basılıp basılmadığını kontrol etmek zorunda kalmaz, bu sırada başka işlemleri yerine getirebilir.

Dış kesmelere sahip pinler Arduino türüne göre değişiklik gösterir. Aşağıdaki tabloda Arduino türlerine göre dış kesme özelliğine sahip pinler gösterilmiştir.

Arduino Türü Int.0 Int.1 Int.2 Int.3 Int.4 Int.5
Arduino Uno 2 3 - - - -
Arduino Mega 2 3 21 20 19 18
Arduino Leonardo 3 2 0 1 7 -

Kullanılacak dış kesme pini, setup fonksiyonu içerisinde "attachInterrupt" fonksiyonu ile belirtilmeli. Bu fonksiyonun içinde kullanılacak olan pinin numarası değil, kesme numarası girilir. Örneğin Arduino Uno kullanıcısı 2. pindeki kesmeler için 0, 3. pindeki kesmeler için 1 değerini kullanmalıdır. "attachInterrupt" fonksiyonun ikinci değeri kesme durumunda çalışacak fonksiyonu belirler, üçüncü değer hangi durumlarda kesmenin gerçekleşeceğini belirler.

Aşağıda "attachInterrupt" fonksiyonu için tanımlanabilecek dış kesmelerin türleri belirtilmiştir.

  • LOW: Pindeki voltaj 0 ise kesme oluşur.
  • CHANGE: Pinde oluşacak voltaj değişimlerinde kesme gerçekleşir.
  • RISING: Yükselen kenarlarda kesme gerçekleşir. Yani pindeki voltaj değeri 0'dan 5 Volta çıktığında kesme gerçekleşir.
  • FALLING: Düşen kenarlarda kesme gerçekleşir. Yani pindeki voltaj değeri 5'ten 0'a düştüğünde kesme gerçekleşir.

Örneğin Arduino Uno'nun 2. pinine düğme bağlamış olalım. Bu düğmeye basıldığında "butonaBasildi" fonksiyonunun çalışmasını istemekteyiz. Bunun için setup fonksiyonunun içerisine attachInterrupt (0, butonaBasildi, RISING) yazmamız gerekir. Böylece düğmeye her basıldığında "butonaBasildi" fonksiyonu otomatik olarak çalışır.

 

Dış kesmeler ile düğme kontrollü LED

Bu uygulamada dış kesme özelliğinden faydalanarak düğme kontrolü yapılır. Düğmeye basıldığında Arduino'nun 5. pinine bağlanmış olan LED yakılır. Kullanıcı düğmeden elini çektiğinde yine dış kesme kullanılarak, LED otomatik olarak söndürülür. Dış kesme kullanılması Arduino'nun sürekli düğme durumunu kontrol etmek zorunda kalmasını engeller. Düğmeye basıldığında veya düğmeden el çekildiğinde, Arduino otomatik olarak anlar. Böylece Arduino düğmeyi kontrol etmeden diğer işlemleri yerine getirebilir.

Bu uygulamayı yapmak için ihtiyacımız olan malzemeler;

  • 1 x Arduino
  • 1 x düğme
  • 1 x 10K ohm direnç
  • 1 x LED
  • 1 x 220 ohm direnç
  • 1 x Breadboard

int LED = 5;
/* LED'in bağlı olduğu pin 5 olarak belirlendi */

void setup()
{
  pinMode(LED, OUTPUT);
  /* LED çıkış olarak ayarlandı */
  
  attachInterrupt(0, LEDiyak, RISING);
  
  /* 0 dış kesmesi ayarlandı. Yani Arduino Uno için dugme 2. pine bağlanmalıdır */
  
  Serial.begin(9600);
}

void loop()
{
 Serial.println("Arduino burada baska islemler yapabilir");
 delay(100);
}

void LEDiyak()
{
  /* Dugmeye basıldığında çalışacak fonksiyon */
  digitalWrite(LED,HIGH);
  attachInterrupt(0, LEDisondur, FALLING);
}

void LEDisondur()
{
  /* Dugmeden el çekildiğinde çalışacak fonksiyon */
  digitalWrite(LED,LOW);
  attachInterrupt(0, LEDiyak, RISING);
}

Arduino kodunda öncelikle LED'in bağlanacağı pin, 5 olarak belirlenmiş ve bu pin çıkış olarak ayarlanmıştır. Devrede düğme, 2. pine bağlanmıştır. Bu pin 0. dış kesmeye karşılık gelmektedir (Arduino Uno için). Düğmeye basıldığında ve düğmeden el çekildiğinde, Arduino farklı kesmelere girmekte ve LED'in konumunu değiştirir.

Setup fonksiyonu içinde düğmeye basıldığında yapılacak olan görev tanımlandı. Bu alanda düğmeden çekilince yapılacak görevin tanımlanmama nedeni, Arduino'nun aynı anda sadece bir adet dış kesme görevi atayabilmesidir. Bu yüzden 'LEDiyak' ve 'LEDisondur' fonksiyonlarında dış kesme fonksiyonları tekrar tanımlandı.

Zaman ve dış kesmelerin nasıl kullanıldığını öğrendik. Kapsamlı projelerde bu kesmeler kullanılarak Arduino üzerindeki yük azaltılabilir ve projenin daha sağlıklı çalışması sağlanabilir.