Arduino – Kesmeler – Dış Kesme – Aynı Anda iki işlem kontrolü – interrupt – konularına yer vereceğiz.
Arduino ile çalışırken algoritma içinde sırası gelen işlemler yukarıdan aşağıya satır satır çalışmaktadır. Bizim belirleyeceğimiz şartlara ve koşullara göre tüm kod blokları çalışır yada atlanır. Algoritma içinde bazı durumlarda delay, for gibi algoritmayı bekleten yada oyalayan döngüler kullanılmaktadır. Bu esnada arduino bazı sensörleri okumaz ve veri akışı gerçekleşmez. Çok hassas anlık durumlarda ikinci bir şartı da sorgulamak yada çalıştırmak isteyebiliriz.
Örnek vermek gerekirse; “Evde müzik dinliyorsunuz ve postacı posta kutusuna bir mektup bıraktı. Siz müzik dinlerken postacının gelip gelmediğini beklemiyordunuz sadece kendinizi müziğin ritmine verdiğinizi varsayalım. Postacının geldiği gördünüz mektubu bıraktığını da gördünüz ve gidip o mektubu alıp açmanız gerekiyor ve ne yazdığını okumak istiyorsunuz fakat o anda dinlediğiniz müziği de hala dinlemeye devam etmek istiyorsunuz. Müziği kapatmadan dinlerken yerinizden kalkıp mektubu posta kutusundan alıp okursunuz ve sonra önemli bir mektup olmadığını görür bir kenarıya bırakırsınız. Bu sırada dinlediğiniz müzik hala çalıyor ve siz onu hala aynı şekilde dinlemeye devam ediyorsunuz.”
Arduino yukarıdaki örnekteki gibi “void loop” içerisinde her ne yapılıyorsa yapılsın beklenmedik ikinci bir olaya da farkedince tepkiler verebilir ve yürütebilir hem de loop içindeki işine ara vermeden. Arduinonun bu yaptığı işe KESME adı verilmektedir. Kesmeler iki çeşittir. Zaman Kesmesi(Timer Interrupt) ve Dış Kesme(External Interrupt) olarak ikiye ayrılır.
1-Dış kesmeler
2-Zaman kesmesi
Bu yazımızda sizlerle DIŞ KESMELER üzerinde duracağız. Zaman kesmelerini bu yazımızdan okuyabilirsiniz.
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.
Arduino kartlarının her birisinin dış kesme pini vardır. Arduino uno için bu pinler Dijital 2 ve 3 numaralı pinlerdir. Bu pinlerden arduino sürekli olarak dinleme yapabilir ve pindeki voltaj değişimlerini anında algılayabilirler.
Dış kesme, Arduino’nun özel pinlerindeki voltaj değişimlerine göre davranan kesmedir.
Board | Kesme için kullanılabilecek dijital pinler |
Uno, Nano, Mini, other 328-based | 2, 3 |
Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, other 32u4-based | 0, 1, 2, 3, 7 |
Zero | 4. hariç tüm dijital pinler |
MKR1000 Rev.1 | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
Due | Tüm dijital pinler |
Arduino UNO’nun 3. pinine bir buton bağlayalım ve kesme olarak kullanılacak şekilde ayarlayalım. Bu butona basıldığında kod her nerde olursa olsun bizim istediğimiz işlemleri yapacaktır.
Dış kesme 4 farklı şekilde yapılabilir. Bunlar;
LOW – Dijital pindeki gerilim 0 olduğunda kesmeye girer
CHANGE – Belirli dijital pinde oluşacak her gerilim değişiminde kesmeye girer. Yani pindeki gerilim 0’dan 5’e yükseldiğinde veya 5’ten 0’a düştüğünde kesmeye girer.
RISING – Yükselen kenar olduğunda kesmeye girer. Yani dijital pindeki gerilim 0’dan 5 Volta çıktığında kesmeye girer.
FALLING – Düşen kenar olduğunda kesmeye girer. Yani dijital pindeki gereilim 5’dan 0 Volta çıktığında kesmeye girer.
şeklindeki kesmelerdir.
Arduino da dış kesme AttachInterrupt(); fonksiyonu kullanılarak yapılmaktadır. AttachInterrup fonksiyonu içerisinde 3 adet değişken barındırır.
AttachInterrupt(dijitalPin,kesme fonksiyonu, kesme modu);
Bu değişkenlerin ilki dijitalPin olup Arduino’nun kesme için kullandığımız pinidir. Fakat burada dijital pin olarak Arduino’da kaçıncı pine bağladığımız değil örneğin Arduino UNO da 2. dijital pine bağlı ise 0, 3. dijital pine bağlı ise 1 yazılmalıdır.
Kesme fonksiyonu, kesmeye girildiğinde yapılması gereken işlemlerin içinde bulunduğu fonksiyondur. Void loop’un altına yazılmalıdır.
Kesme modu, kesmeye ne zaman girileceğini gösteren modlar. LOW, RISING vb.
Dış Kesme Örneği; Burada 6 adet mavi led void loop içinde for döngüsü ile animasyonlu şekilde açılıp kapanacaklardır. Butonumuz arduinonun dijital 3 numaralı kesme pinine bağlanmış durumda ve pinde bir değişim olursa kırmızı led buna göre açılıp kapanacaktır. Yani void loop içerisinde mavi ledler animasyon yaparken butona basacak olursak mavi ledler animasyona ara vermeden devam ederlerken kırmızı led yanacak butondan parmağımızı çekince kırmızı led kapanacak. mavi ledler ne butona basında ne de butondan parmağımızı çekince bu işlemden etkilenmeyecekler.
//Görsel İşitsel Teknoloji Kanalı //wwww.teknikerler.com //Kerim Arı Youtube kanalı Dış Kesme Kodları - kullanımı örnek Kodları #define kesme_led 4 void setup() { pinMode(kesme_led, OUTPUT); for(int i=5;i<11;i++) { pinMode(i,OUTPUT); } attachInterrupt(0, LEDiyak, RISING); Serial.begin(9600); } void loop() { Serial.println("Arduino burada baska islemler yapabilir"); delay(100); for(int i=5;i<11;i++) { digitalWrite(i,HIGH); delay(500); } for(int i=9;i<12;i++) { digitalWrite(i,LOW); delay(500); } } void LEDiyak() { /* Dugmeye basıldığında çalışacak fonksiyon */ digitalWrite(kesme_led, HIGH); attachInterrupt(0, LEDisondur, FALLING); Serial.println("kesmeye girdik"); } void LEDisondur() { /* Dugmeden el çekildiğinde çalışacak fonksiyon */ digitalWrite(kesme_led, LOW); attachInterrupt(0, LEDiyak, RISING); Serial.println("kesmeden cikdik"); }Videoyu İzlemek İçin Tıklayınız