Arduino mengganggu tutorial

Arduino Interrupts Tutorial

Interupsi adalah fitur yang kuat dari mikrokontroler yang memungkinkan Anda menangani acara secara tidak sinkron. Tidak seperti pemungutan suara, yang terus -menerus memeriksa acara, interupsi segera merespons ketika peristiwa tertentu terjadi, seperti tekan tombol atau luapan timer. Tutorial ini akan memandu Anda melalui pemahaman dan menggunakan interupsi dengan Arduino.


Apa yang Anda Butuhkan

  1. Arduino uno (atau papan yang kompatibel)
  2. Tombol tekan
  3. Resistor 10k-ohm (untuk konfigurasi pull-down)
  4. LED dan resistor 220-OHM (opsional)
  5. Papan tempat memotong papan dan kabel jumper
  6. IDE Arduino diinstal di komputer Anda

Langkah 1: Apa itu interupsi?

Interupsi sementara menghentikan eksekusi program utama untuk menangani acara tertentu. Setelah acara diproses, program dilanjutkan di mana ia tinggalkan. Interupsi dikelola menggunakan fungsi khusus yang disebut Rutinitas Layanan Interupsi (ISRS).

Jenis interupsi di Arduino

  1. Interupsi Eksternal: Dipicu oleh peristiwa pada pin tertentu (mis., Pin 2 atau 3 di Arduino UNO).
  2. Pin mengubah interupsi: Dipicu oleh perubahan pada pin digital apa pun.
  3. Timer mengganggu: Dipicu oleh timer meluap atau membandingkan kecocokan.

Langkah 2: Menggunakan interupsi eksternal

Arduino UNO mendukung interupsi eksternal pada pin 2 dan 3. Anda dapat mengonfigurasi interupsi ini untuk memicu:

  • KENAIKAN: Sinyal berubah dari rendah ke tinggi.
  • Jatuh: Sinyal berubah dari tinggi ke rendah.
  • MENGUBAH: Status Perubahan Sinyal (rendah ke tinggi atau tinggi ke rendah).
  • RENDAH: Sinyal tetap rendah.

Contoh Kode: Mendeteksi tombol Tekan

Contoh ini mengubah LED ketika tombol yang terhubung ke pin 2 ditekan.

#define buttonPin 2 // Interrupt pin
#define ledPin 13   // Built-in LED

volatile bool ledState = false; // Shared variable between ISR and main code

void handleInterrupt() {
  ledState = !ledState; // Toggle LED state
  digitalWrite(ledPin, ledState);
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // Enable internal pull-up resistor
  pinMode(ledPin, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(buttonPin), handleInterrupt, FALLING); // Trigger on button press
}

void loop() {
  // Main loop does nothing; interrupt handles the LED
}

Penjelasan

  • attachInterrupt(digitalPinToInterrupt(pin), ISR, mode): Mengkonfigurasi interupsi.
    • pin: Pin interupsi (mis., Pin 2 atau 3 di Arduino Uno).
    • ISR: Rutinitas layanan interupsi untuk dieksekusi.
    • mode: Kondisi pemicu (RISING, FALLING, CHANGE, atau LOW).
  • digitalPinToInterrupt(pin): Mengubah nomor pin ke nomor interupsi.

Langkah 3: Menggunakan Pin Change Interrupts

PIN Change Interrupts memungkinkan Anda untuk mendeteksi perubahan pada pin digital apa pun. Ini membutuhkan perpustakaan tambahan, seperti Memungkinkan interuprup.

Contoh Kode: Pin Change Interrupt

#include <EnableInterrupt.h>
#define pin 4 // Pin to monitor

void handlePinChange() {
  Serial.println("Pin state changed!");
}

void setup() {
  Serial.begin(9600);
  enableInterrupt(pin, handlePinChange, CHANGE); // Trigger on any state change
}

void loop() {
  // Main loop does nothing; interrupt handles the event
}

Instalasi Perpustakaan

Untuk menggunakan interupsi ganti pin, instal Memungkinkan interuprup Perpustakaan melalui Manajer Perpustakaan Arduino.


Langkah 4: Timer mengganggu

Garis waktu interupsi berguna untuk tugas penjadwalan pada interval yang tepat. Mengacu kepada Tutorial Arduino Timer Untuk detail tentang mengonfigurasi interupsi timer.

Contoh: Mengedipkan LED dengan Timer1 Interrupt

#define ledPin 13

void setup() {
  pinMode(ledPin, OUTPUT);

  // Configure Timer1
  noInterrupts(); // Disable interrupts during setup
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  OCR1A = 15624; // Compare match value for 1Hz (1-second interval)
  TCCR1B |= (1 << WGM12); // CTC mode
  TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
  TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt

  interrupts(); // Enable interrupts
}

ISR(TIMER1_COMPA_vect) {
  digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}

void loop() {
  // Main loop does nothing; Timer1 handles the LED
}

Langkah 5: Praktik terbaik untuk menggunakan interupsi

  1. Segar ISRS: Hindari penundaan atau perhitungan kompleks di ISR ​​untuk memastikan respons cepat.
  2. Hindari komunikasi serial di ISRS: Fungsi serial mungkin tidak bekerja dengan andal di dalam ISR.
  3. Menggunakan volatile untuk variabel bersama: Variabel tanda yang dibagikan antara ISRS dan program utama sebagai volatile untuk mencegah masalah optimasi kompiler.
  4. Input Debounce: Tangani logika debounce dalam perangkat lunak atau perangkat keras untuk sinyal bising seperti penekan tombol.
  5. Nonaktifkan interupsi selama bagian kritis: Menggunakan noInterrupts() Dan interrupts() untuk melindungi bagian kode kritis.

Aplikasi interupsi

  1. Tombol penanganan penekan tanpa pemungutan suara
  2. Membaca Rotary Encoders
  3. Pengaturan waktu kejadian kritis (mis., Kontrol motor yang tepat)
  4. Penjadwalan tugas berkala
  5. Bereaksi terhadap sinyal eksternal (mis., Sensor, peristiwa komunikasi)

Pemecahan masalah

  • Interupsi tidak memicu: Pastikan pin dan mode yang benar dikonfigurasi.
  • Perilaku tidak stabil: Debounce sinyal berisik dan hindari ISR ​​yang panjang.
  • Konflik dengan perpustakaan: Beberapa perpustakaan menggunakan interupsi secara internal (mis., Servo, PWM). Pastikan tidak ada konflik dengan kode Anda.

Kesimpulan

Interupsi memungkinkan penanganan peristiwa yang responsif dan efisien dalam proyek -proyek Arduino. Dengan belajar menggunakan interupsi eksternal, perubahan pin, dan timer, Anda dapat membuat aplikasi yang kuat dan tepat. Eksperimen dengan berbagai jenis interupsi untuk meningkatkan proyek Anda dan mengoptimalkan kinerja!

Tinggalkan komentar

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.