Interrupts Arduino
Menganggu
Ini adalah panduan untuk melaksanakan gangguan untuk kod Arduino anda. Terdapat banyak maklumat yang baik tentang gangguan di luar sana, tetapi panduan ini adalah sebahagian daripada siri untuk menjalankan Arduino anda dengan penggunaan kuasa kecil. Dan kami bermaksud kecil. Kami bercakap tahun operasi bergantung pada permohonan itu .... Pada bateri sel syiling. Ini adalah perkara yang perlu anda ketahui untuk mencipta projek masa depan anda yang tertanam atau Internet. Secara terang-terangan, itu tidak masuk akal berapa banyak kuasa stok Arduino saham. Menggunakan pelbagai helah dalam siri panduan ini, anda akan dapat mengurangkan penggunaan kuasa dengan lebih daripada satu faktor 1000! Bunyi menarik? Kemudian inilah panduan untuk anda! Jika anda suka panduan ini, atau ingin melihat bagaimana kami melaksanakan gangguan dalam projek kami sendiri, semak laman web kami di:
//doteverything.co/
Kenapa saya perlukan gangguan?
Jawapannya mudah, betul. Anda perlu mengganggu kerana tanpa gangguan anda tidak boleh meletakkan Arduino anda tidur dan mengharapkan ia untuk bangun semula (secara amnya. Terdapat cara untuk bangun dari tidur tanpa gangguan dalam situasi terhad). Dan sekiranya anda tidak dapat tidur, anda akan memikat kuasa seperti maraton yang berjalan melalui Death Valley di tengah-tengah musim panas. Mod tidur menggunakan kuasa yang sangat sedikit, tetapi ia memerlukan usaha khas untuk ditubuhkan. Perkara pertama yang perlu anda ketahui ialah bagaimana menulis kod anda untuk mengambil kesempatan daripada gangguan, maka anda boleh menggunakan teknik yang lebih kuat.
APAKAH mengganggu?
Interrupt adalah beberapa perkara. Tetapi pada intinya, ia adalah sekeping kod yang akan dipanggil apabila tindakan khas berlaku. Apa tindakan khas? Pada asasnya, apabila pin tertentu mempunyai voltan yang berubah. Di Duemilanove / UNO, terdapat hanya 2 pin yang boleh melayakkan diri. Tetapi seperti yang anda lihat, ini adalah keperluan yang sangat luas. Anda boleh menggunakan apa sahaja untuk menukar voltan pada pin tersebut. Ia boleh menjadi input pengguna melalui butang, ia boleh menjadi peranti periferi seperti sensor, ia boleh menjadi microchip lain, ia juga boleh menjadi pemasa dalaman. Perkara pertama yang perlu anda lakukan untuk mula menggunakan gangguan adalah memikirkan bagaimana aplikasi anda boleh ditukarkan untuk mempunyai pemacu elektrik luaran. Selalulah peranti lain yang anda mahu paparkan kepada Arduino anda akan menggunakan gangguan untuk mendapatkan perhatian anda. Pembelajaran terdahulu kami, Cara Tambah Bluetooth ke Projek Arduino anda, merupakan contoh yang sempurna untuk mengganggu peranti luaran dengan cara sedemikian.
Panduan ini akan menunjukkan bagaimana untuk menghidupkan litar contoh untuk menangguhkan kebakaran. Kemudian, kami akan menyediakan beberapa kod contoh. Mudah-mudahan selepas melihat bagaimana ia selesai, anda akan masuk ke dalam bingkai minda yang betul untuk memikirkan cara untuk menggunakan interrupt kepada projek anda.
Katakan saya tidak peduli dengan Penggunaan Kuasa. Adakah saya masih memerlukan gangguan?
Ya! Walaupun anda tidak merancang untuk meletakkan pemproses tidur, anda mungkin memerlukan gangguan! Gangguan adalah penting jika anda mempunyai aplikasi bergantung masa. Ini bermakna anda memerlukan tindakan untuk berlaku setiap milisaat x, atau anda memerlukan tindakan yang akan berlaku sebaik sahaja kejadian luaran berlaku. Jika anda biasa dengan asas-asas pengaturcaraan Arduino, anda mungkin tertanya-tanya mengapa anda tidak boleh menggunakan loop sementara sahaja untuk memeriksa bila sudah tiba masanya untuk melakukan tindakan anda. Penyelesaian tipikal ialah untuk membuat "tinjauan pendapat" anda sementara keadaan pin secepat mungkin. Kaedah ini selalunya berfungsi, tetapi tidak boleh dipercayai. Apa yang berlaku jika anda mengundi untuk menekan butang, tetapi butang itu akan ditekan dan dibebaskan sebelum gelung sementara anda mendapat sekitar untuk memeriksa keadaan butang sekali lagi? Anda akan terlepas butang tekan. Apa yang berlaku jika anda mencari peristiwa yang sangat cepat, seperti isyarat dari sensor? Anda perlu mengundi cukup banyak dan program anda tidak boleh melakukan apa-apa lagi kerana takut kehilangan peristiwa kritikal. Tetapi dengan gangguan, anda dijamin 100% untuk menangkap acara tersebut. Menggunakan gangguan juga menjimatkan anda daripada perlu menyemak kuasa pengiraan penjimatan yang berteraskan keadaan dan membiarkan gelung semasa anda dapat tugas-tugas lain dengan lebih pantas.
Langkah 1: Gambaran Keseluruhan Litar

Berikut adalah litar yang anda perlu bina untuk membuat interupsi pertama anda:
... Atau setidaknya litar yang anda HARUS bina. Nasib baik kebanyakan papan Arduino sudah mempunyai LED dan perintang dibina, tepat pada konfigurasi ini. Mereka boleh dibolehkan dalam perisian. Malangnya, hanya menggunakan fungsi terbina dalam tidak menunjukkan kepada anda semua yang sedang berlaku! Oleh itu, ia adalah masa anda untuk mempelajari skema ini dan memahami apa yang dilakukannya. Hakikat bahawa litar sebenar ini dibina untuk Arduino sudah seharusnya memberi anda petunjuk utama tentang betapa pentingnyanya.
Bahagian paling penting dalam litar ini ialah perintang 20k yang disambungkan kepada + 5V. Ini dipanggil penghalang tarik-up. Jika perintang telah disambungkan ke GND bukan + 5V, ia akan dipanggil perintang pull-down (Arduino tidak mempunyai resistor pull-down terbina dalam, anda perlu menambahnya secara luaran). Perintang tarik memegang pin yang dikaitkan dengan + 5V secara normal. Jadi dibiarkan sahaja, pin akan sentiasa membaca TINGGI. Jika anda menyambungkan pin terus ke GND (katakan, dengan menutup butang itu), pin akan dibawa ke 0V dan akan membaca LOW. Jika kita tidak mempunyai tarikan, kita tidak boleh mendapatkan butang untuk melakukan sesuatu yang bermakna. Mana-mana pin Arduino boleh disambungkan ke + 5V secara dalaman dengan menyatakan pinMode (pin #, INPUT_PULLUP). Ambil perhatian bahawa pullup hanya bermakna apabila pin dikonfigurasi sebagai input. Untuk maklumat lebih lanjut mengenai pull-up, lihat halaman DigitalPins.
INTERRUPT_PIN harus pergi ke pin 2 atau 3 pada Arduino UNO anda (atau Arduino berdasarkan 328p lain). Untuk Arduinos yang lain, semak halaman ini untuk mencari pin berinteraksi. Untuk contoh kod kami, kami akan menyambungkannya ke pin 2. LED yang disambungkan ke ANY_PIN adalah litar mudah. Arduino sudah mempunyai LED yang disambungkan ke pin 13, jadi kami akan menggunakannya tetapi berasa bebas untuk mengubah suai litar dengan LED sendiri pada pin yang berbeza. Arduino LED mempunyai "L" di sebelahnya.
Butang seringkali mempunyai 4 pin - biasanya dua pin hanya disambungkan secara dalaman ke pin yang lain di sisi yang sama butang. Jika anda menekan butang dan tiada apa yang berlaku, periksa bahawa anda benar-benar menghidupkan litar anda merentasi pin yang menyambung apabila butang ditekan, tidak merentasi pin yang selalu bersambung.
Langkah 2: Penghidupan sebenar

Dengan semua yang diingat, jika anda ingin menggunakan pullup Arduino dalaman dan LED di atas, inilah litar super mudah yang sebenarnya anda perlu kawat.
Langkah 3: Kod

Ada beberapa perkara yang patut ditunjuk di sini. Yang paling menarik adalah garisan 10, di mana kita mengkonfigurasikan gangguan. attachInterrupt () mengambil 3 hujah. Yang pertama ialah nombor mengganggu, bukan nombor pin. Anda tidak perlu bimbang tentang perkara ini, pastikan anda sentiasa menggunakan digitalPinToInterrupt (Pin #) dan ia akan diterjemahkan secara automatik. Ingat, hanya pin tertentu yang boleh diubah menjadi pin gangguan. Hujah kedua adalah nama fungsi yang anda mahukan kod anda untuk melompat ke bila-bila masa gangguan dicetuskan. Anda dapat melihat bagaimana fungsi ini ditakrifkan pada baris 21.
Hujah ketiga untuk melampirkanInterrupt () adalah, dalam kes ini, kata kunci FALLING. Ini bermakna bahawa gangguan akan dicetuskan apabila voltan pada pin 2 bergerak dari TINGGI ke LOW. Anda juga boleh menentukan RISING, yang akan mencetuskan apabila voltan turun LOW ke TINGGI; atau anda boleh menggunakan PERUBAHAN, yang akan memicu apabila perubahan voltan dalam arah yang sama. Dalam litar kami, apabila butang ditekan, voltan akan turun dari tinggi ke rendah, dan apabila butang dibebaskan, ia akan pergi dari tinggi ke rendah. Kami tidak mahu mencetuskan kod dua kali setiap kali butang ditoggarkan, jadi kami memilih RISING atau FALLING. Aplikasi anda mungkin memerlukan sesuatu yang berbeza.
Mencubanya
Jika anda memuatkan kod tersebut, api Serial Monitor, dan klik butang yang akan anda perhatikan bahawa LED tidak bertindak seperti yang kami inginkan. Kami mahu kitaran LED dihidupkan dan dimatikan setiap kali butang ditekan. Tetapi untuk anda, ia mungkin akan berkedip dan mematikan beberapa kali setiap kali anda memukul butang. Ini berlaku kerana butang tidak sempurna. Jari anda mungkin menekan butang, tetapi jika anda melihat tahap mikroskopik, butang itu sebenarnya memantul kenalan beberapa kali sebelum ditutup sepenuhnya. Setiap melantun akan mencetuskan gangguan. Sistem kami sangat tepat dan sangat sensitif bahawa kami sebenarnya telah memperkenalkan satu masalah baru! Untuk membetulkan ini kita menggunakan rutin yang dikenali sebagai debouncing untuk membuat pengesanan gangguan kurang sensitif.
Langkah 4: Contoh

Inilah salah satu yang saya dicambuk. Ia tidak sempurna, ada cara yang lebih baik, tetapi ia cukup untuk membolehkan anda mula menggunakan butang.
Idea asas adalah untuk log kali terakhir butang ditekan menggunakan fungsi millis (). (Fungsi millis () memberitahu anda berapa banyak milisaat yang berlalu sejak lakaran mula berjalan). Sekiranya pencetus mengganggu sebelumnya berlaku kurang daripada 200 milisaat sebelum arus perdana, kemungkinan bahawa butang tersebut melantunkan, jadi tiada tindakan diambil. Jika tidak, semuanya berlaku secara normal. Mana-mana pembolehubah yang anda ingin ubah di dalam fungsi Interrupt hendaklah diisytiharkan sebagai tidak menentu supaya gelung interupsi dan utama tidak pernah bersetuju dengan nilai.
Langkah 5: Apa Seterusnya?
Itu sahaja! Setiap kali anda mengklik butang LED mesti menukar keadaan. Anda kini mempunyai gangguan kerja. Terserah kepada anda untuk membayangkan cara untuk menggabungkan gangguan ke dalam projek anda. Seperti yang anda dapat lihat, gangguan adalah penting apabila kuasa masa dan pengiraan adalah penting. Di dalam panduan seterusnya, kami akan membahas cara meletakkan ATMega328p ke dalam mod tidur kuasa ultra rendah, bergantung pada gangguan untuk membangunkan kami semula. Sehingga itu, langganlah kami di Instructables dan lihat halaman produk kami di www.doteverything.co. Kami sedang membina Dot, peranti Internet Perkara yang kami harap anda akan mendapati sejuk dan berguna, dan melalui panduan ini kami akan menunjukkan kepada anda dengan tepat bagaimana membina versi perkakasan anda sendiri!