Pernahkah kita berfikir tentang mekanisme keluarnya air bag di mobil jika mobil bertabrakan? Saat mobil menabrak atau berbenturan dengan suatu objek, sensor akselerometer mendeteksi adanya perlambatan secara tiba-tiba (diakibatkan oleh berbenturannya mobil dengan objek lain), sensor ini mentrigger interrupt eksternal ke mikrokontroler yang ada di mobil. Kemudian mikrokontroler menghasilkan sinyal listrik untuk langsung membuka air bag. Jadi apakah yang menyebabkan air bag membuka vegitu cepatnya? Jawabannya adalah sinyal interrupt yang membuat mikrokontroler memprioritaskan sinyal ini di antara task mikrokontroler yang lain. Atau misalkan kita membuat alat pengukur suhu berbasis Arduino, pengukuran suhu dilakukan secara terus menerus tiap detiknya oleh mikrokontroler yang ada di dalam Arduino. kita bisa menggunakan interrupt eksternal sehingga jika dipencet push button yang dihubungkan dengan pin interrupt di Arduino maka yang dilakukan adalah memprioritaskan sinyal ini daripada pengukuran suhu, tapi setelah selesai Arduino akan langsung melanjutkan pengukuran suhunya. Perlu diketahui bahwa pada interrupt fungsi delay tidak berfungsi. Jadi interrupt merupakan mekanisme dimana sebuah instruksi menyebabkan diberhentikannya eksekusi normal di dalam prosesor dan menyebabkan dirinya (sinyal dari interrupt) diprioritaskan paling utama. Terdapat dua jenis interrupt: interrupt hardware dan interrupt software.
Interrupt hardware: terjadi ketika ada aksi eksternal seperti pin interrupt eksternal merubah statenya dari LOW ke HIGH atau dari HIGH ke LOW.
Interrupt software: mengacu kepada instruksi dari software. Sebagai contoh interrupt timer merupakan interrupt software.
Interrupt pada Arduino
Pada board Arduino terdapat dua jenis interrupt: interrupt eksternal dan interrupt perubahan pin.
Interrupt eksternal
Interrupt jenis ini menggunakan interrupt hardware dan terjadi sangat cepat. Interrupt ini dapat diset mentrigger untuk level RISING atau FALLING atau LOW. Board Arduino memiliki pin interrupt eksternal yang terbatas, seperti yang ditunjukkan pada table di bawah ini:
Tabel 1. Pin interrupt eksternal pada Board Arduino
Interrupt perubahan pin
Pin-pin interrupt pada Arduino bisa lebih banyak lagi, hal ini bisa dilakukan dengan menggunakan interrupt perubahan pin. Pada ATmega168/328 yang ada di board Arduino semua pinnya yang berjumlah 20 dapat dijadikan pin interrupt.
Menggunakan interrupt di Arduino
Sebelum menggunakan interrupt di Arduino, perlu dipahami beberapa konsep berikut:
Interrupt Service Routine (ISR)
ISR disebut juga sebagai penghandle interrupt dan memiliki instruksi khusus. Ketika ada kejadian ekternal, prosesor pertama kali mengeksekusi kode di bawah ini yang ada di dalam ISR dan kemudian kembali lagi ke mode normal. Sintaks ISR adalah sebagai berikut:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
penjelasan masing-masing adalah sebagai berikut:
digitalPinToInterrupt(pin): di dalam Arduino UNO dan NANO, pin yang dijadikan interrupt adalah pin 2 dan 3.
ISR: merupakan fungsi yang dipanggil ketika interrupt eksternal selesai
mode: mode transisi untuk mentrigger ke FALLING, RISING ataupun ke LOW. Penjelasan masing-masing untuk tiap keadaan adalah sebagai berikut:
RISING : untuk mentrigger interrupt saat pin berubah keadaan dari LOW ke HIGH
LOW : untuk mentrigger interrupt kapanpun pinnya berubah menjadi LOW
FALLING : untuk mentrigger interrupt saat pin berubah dari keadaan HIGH ke LOW
CHANGE : untuk mentrigger interrupt saat pin berubah dari keadaan LOW ke HIGH atau dari HIGH ke LOW. Artinya setiap perubahan keadaan pin, interrupt akan terpicu tidak perduli keadaan dari LOW ke HIGH atau dari HIGH ke LOW.
Jika Arduino bekerja pada mode normalnya, kode programnya dieksekusi baris per baris. Misalkan interrupt dieksekusi pada baris2 maka fungsi melompat ke ISR dan mulai eksekusi baris yang ada di dalam ISR kemudian melompat lagi ke baris3 dan menyelesaikan eksekusi/tasknya. Jika program ini berada di dalam loop maka eksekusi kembali lagi ke baris1, ilustrasinya dapat dilihat pada gambar di bawah ini:
Gambar 1. Alur eksekusi interrupt pada Arduino
Perlu dipahami bahwa fungsi delay() di dalam interrupt tidak berlaku dan untuk melewatkan data antara ISR dengan program utamanya, variabel dideklarasikan sebagai volatile. Supaya lebih jelas, perhatikan contoh berikut:
Penggunaan pin interrupt eksternal D2
Kita akan membuat program mengaktifkan LED (menyalakan LED) jika terdapat sinyal eksternal ke pin interrupt 0 (pin 2) di Arduino Uno. Sesaat setelah mendapatkan sinyal tersebut (rentang waktu 1-2 ms) maka LED dinyalakan melalui ISR, di ISR kita buat fungsi untuk LED nyala. LED nyala ini bisa terjadi jika sinyal interruptnya berubah dari LOW ke HIGH (digunakan mode RISING). Kode programnya adalah sebagai berikut:
#define LED 13 //pin 13 bernama LED #define tombol 2 //pin 2 (pin interrupt) bernama tombol volatile boolean led_nyala = false; //kondisi mula-mula LED mati void setup() { pinMode(LED,OUTPUT); pinMode(tombol,INPUT); attachInterrupt(digitalPinToInterrupt(2),tombol_ditekan,RISING); //pin 2 (interrupt 0) digunakan sebagai interrupt eksternal } void loop() { } //membuat fungsi bernama tombol_ditekan, fungsi ini (ISR) dieksekusi secara otomatis setelah arduino memperoleh sinyal interrupt di pin 2 void tombol_ditekan() { if(led_nyala){ led_nyala = false; digitalWrite(LED,LOW); }else{ led_nyala = true; digitalWrite(LED,HIGH); } }
Simulasi dari kode program di atas dapat dilihat pada gambar di bawah ini:
Gambar 2. Menggunakan interrupt 0 (pada pin 2) di Arduino Uno
Menggunakan pin 2 dan 3 sebagai penerima sinyal eksternal
Selanjutnya kita akan membuat program untuk mengaktifkan LED jika alat mendeteksi adanya gerakan, jadi alat ini dapat diaplikasikan sebagai alarm jika ada pencuri atau orang tak dikenal datang ke rumah. Sebenarnya kita bisa gunakan sensor PIR untuk mendeteksi gerak, tapi karena kita gunakan simulasi, sensor PIR diganti dengan push button. push button1 diberi nama interrupt_0 dan push button2 diberi nama interrupt_1. Interrupt_0 akan aktif jika memperoleh sinyal RISING (artinya dari LOW/tidak ada gerakan ke HIGH/ada gerakan), maka LED dinyalakan. Jika tidak ditemukan lagi gerakan maka sensor yang tadinya kondisi HIGH menjadi LOW, kondisi inilah yang dimanfaatkan oleh interrupt_1 untuk beroperasi. Interrupt_1 berfungsi untuk mematikan LED, mode operasinya adalah FAILING artinya akan aktif jika sinyal dari HIGH ke LOW. Supaya lebih jelas, kita buat kode program di bawah ini:
#define LED 13 //pin 13 sebagai/bernama LED #define interrupt_0 2 //pin 2 bernama interrupt_0 #define interrupt_1 3 //pin 3 bernama interrupt_1 void setup() { pinMode(LED,OUTPUT); pinMode(interrupt_0,INPUT); pinMode(interrupt_1,INPUT); //pin 2 sebagai interrupt eksternal, jika ada sinyal interrupt dijalankan ISR dalam hal ini fungsi led_nyala dieksekusi JIKA HANYA sinyal interruptnya dari LOW ke HIGH attachInterrupt(digitalPinToInterrupt(2),led_nyala,RISING); //pin 3 sebagai interrupt eksternal, jika ada sinyal interrupt dijalankan ISR dalam hal ini fungsi led_mati dieksekusi JIKA HANYA sinyal interruptnya dari HIGH ke LOW attachInterrupt(digitalPinToInterrupt(3),led_mati,FALLING); } void loop() { } void led_nyala() { digitalWrite(LED,HIGH); } void led_mati() { digitalWrite(LED,LOW); }
Berikut hasil simulasi dari program di atas:
Gambar 3. Simulasi alat pendeteksi gerak menggunakan pin interrupt di Arduino
PREVIOUS: String (S huruf kapital)
NEXT: Pointer