- Apa itu Multitasking?
- Mengapa melangkau kelewatan () di Arduino?
- Mengapa menggunakan millis ()?
- Komponen Diperlukan
- Rajah Litar
- Pengaturcaraan Arduino UNO untuk Multitasking
The multitasking telah membawa komputer kepada revolusi di mana satu atau lebih banyak program boleh dijalankan pada masa yang sama yang meningkatkan kecekapan, fleksibiliti, keupayaan menyesuaikan diri dan produktiviti. Dalam sistem terbenam, pengawal mikro juga dapat menangani Multitasking dan melakukan dua atau lebih tugas secara serentak tanpa menghentikan arahan semasa.
Di sini dalam tutorial ini kita akan belajar Bagaimana Arduino melakukan Multitasking dengan fungsi Arduino millis. Umumnya fungsi delay () digunakan di Arduino untuk tugas berkala seperti LED Blinking tetapi fungsi delay () ini menghentikan program untuk beberapa waktu yang pasti dan tidak membenarkan operasi lain dilakukan. Oleh itu, artikel ini menerangkan bagaimana kita dapat mengelakkan penggunaan fungsi delay () dan menggantinya dengan millis () untuk melakukan lebih dari satu tugas secara serentak dan menjadikan Arduino sebagai pengawal Multitasking. Sebelum menerangkan secara terperinci mari kita mulakan dengan menekankan Multitasking
Apa itu Multitasking?
Multitasking bermaksud melaksanakan lebih daripada satu tugas atau program secara serentak pada masa yang sama. Hampir semua sistem operasi mempunyai pelbagai tugas. Sistem operasi seperti ini dikenali sebagai MOS (sistem operasi multitasking). MOS boleh menjadi Sistem Operasi PC mudah alih atau desktop. Contoh baik multitasking di komputer adalah ketika pengguna menjalankan aplikasi e-mel, penyemak imbas internet, pemain media, permainan, pada masa yang sama dan jika pengguna tidak mahu menggunakan aplikasi itu berjalan di latar belakang jika tidak ditutup. Pengguna akhir menggunakan semua aplikasi ini pada masa yang sama tetapi OS mengambil konsep ini sedikit berbeza. Mari kita bincangkan bagaimana OS mengurus pelbagai tugas.
Seperti yang terlihat dalam gambar, CPU membagi waktu dalam tiga bagian yang sama dan menetapkan setiap bagian untuk setiap tugas / aplikasi. Ini adalah bagaimana multitasking dilakukan di kebanyakan sistem. Konsepnya akan hampir sama untuk Arduino Multitasking, kecuali pengedaran masa akan sedikit berbeza. Oleh kerana Arduino berjalan dalam frekuensi rendah dan RAM dibandingkan dengan Laptop / Mobile / PC maka masa yang diberikan untuk setiap tugas juga akan berbeza. Arduino juga mempunyai fungsi delay () yang digunakan secara meluas. Tetapi sebelum memulakan mari kita bincangkan mengapa kita tidak boleh menggunakan fungsi delay () dalam projek apa pun.
Mengapa melangkau kelewatan () di Arduino?
Sekiranya dokumentasi rujukan Arduino dipertimbangkan maka terdapat dua jenis fungsi kelewatan, yang pertama adalah kelewatan () dan yang kedua adalah kelewatanMikrodetik (). Kedua-dua fungsi itu sama dari segi menghasilkan kelewatan. Satu-satunya perbezaan ialah, dalam fungsi delay (), bilangan bulat parameter yang dilalui adalah dalam milisaat iaitu jika kita menulis kelewatan (1000) maka kelewatannya adalah 1000 milisaat iaitu 1 saat. Begitu juga dalam fungsi delayMicroseconds (), parameter yang dilalui adalah dalam mikrodetik iaitu jika kita menulis delayMikrodetik (1000), maka kelewatannya adalah 1000 mikrodetik iaitu 1 milisaat.
Inilah intinya, kedua-dua fungsi menjeda program untuk jangka masa yang berlalu dalam fungsi kelewatan. Oleh itu, jika kita memberikan kelewatan 1 saat, maka pemproses tidak boleh pergi ke arahan seterusnya sehingga 1 saat berlalu. Begitu juga jika kelewatan adalah 10 saat maka program akan berhenti selama 10 saat dan pemproses tidak akan membenarkan arahan seterusnya sehingga 10 saat berlalu. Ini menghalang prestasi mikrokontroler dari segi kepantasan dan melaksanakan arahan.
Contoh terbaik untuk menjelaskan kelemahan fungsi kelewatan adalah menggunakan dua butang tekan. Anggaplah kita mahu menukar dua LED menggunakan dua butang tekan. Jadi jika satu butang tekan ditekan maka LED yang sesuai harus bersinar selama 2 saat, sama jika kedua ditekan maka LED harus menyala selama 4 saat. Tetapi ketika kita menggunakan kelewatan (), jika pengguna menekan butang pertama maka program akan berhenti selama 2 saat dan jika pengguna menekan butang kedua sebelum penundaan 2 saat, maka mikrokontroler tidak akan menerima input seperti program ini dalam peringkat berhenti.
Dokumentasi rasmi Arduino menyebutnya dengan jelas dalam Nota dan Peringatan keterlambatan fungsi (). Anda boleh melalui dan menyemaknya agar lebih jelas.
Mengapa menggunakan millis ()?
Untuk mengatasi masalah yang disebabkan oleh penggunaan kelewatan, pengembang harus menggunakan fungsi milis () yang mudah digunakan setelah Anda menjadi kebiasaan dan ia akan menggunakan prestasi CPU 100% tanpa menimbulkan kelewatan dalam melaksanakan arahan. millis () adalah fungsi yang hanya mengembalikan jumlah milisaat yang telah berlalu sejak papan Arduino mula menjalankan program semasa tanpa membekukan program. Nombor waktu ini akan melimpah (iaitu kembali ke sifar), setelah kira-kira 50 hari.
Sama seperti Arduino mempunyai delayMikrodetik (), ia juga mempunyai versi mikro milis () sebagai mikro (). Perbezaan antara mikro dan milis adalah, mikro () akan meluap setelah kira-kira 70 minit, berbanding dengan milis () iaitu 50 hari. Jadi bergantung pada aplikasi anda boleh menggunakan milis () atau mikro ().
Menggunakan milis () dan bukannya kelewatan ():
Untuk menggunakan milis () untuk masa dan kelewatan, anda perlu mencatat dan menyimpan waktu di mana tindakan itu dilakukan untuk memulakan waktu dan kemudian memeriksa pada selang waktu sama ada masa yang ditentukan telah berlalu. Jadi seperti yang dinyatakan, simpan masa semasa dalam pemboleh ubah.
arus panjang yang tidak ditandatanganiMillis = millis ();
Kami memerlukan dua lagi pemboleh ubah untuk mengetahui apakah masa yang diperlukan telah berlalu. Kami telah menyimpan masa semasa dalam pemboleh ubah currentMillis tetapi kami juga perlu tahu bahawa bilakah tempoh masa bermula dan berapa lama tempohnya. Maka Selang dan Millis sebelumnya dinyatakan. Selang itu akan memberitahu kami kelewatan masa dan previosMillis akan menyimpan kali terakhir peristiwa itu berlaku.
lama yang belum ditandatanganiMillis; jangka masa tidak bertanda = 1000;
Untuk memahami perkara ini, mari kita ambil contoh LED berkelip sederhana. Tempoh = 1000 akan memberitahu kita bahawa LED akan berkelip selama 1 saat atau 1000ms.
const int ledPin = 4; // nombor pin LED disambungkan int ledState = RENDAH; // digunakan untuk menetapkan keadaan LED lama yang tidak ditandatangani sebelumnyaMillis = 0; // akan menyimpan kali terakhir LED dikedipkan dalam jangka masa panjang = 1000; // tempoh untuk berkelip dalam persediaan ms void () { pinMode (ledPin, OUTPUT); // tetapkan ledpin sebagai output } gelung kosong () { arus tidak ditandatanganiMillis = millis (); // simpan masa semasa jika (currentMillis - sebelumnyaMillis> = tempoh) {// periksa sama ada 1000ms lulus sebelumnyaMillis = currentMillis; // simpan kali terakhir anda mengedipkan LED jika (ledState == RENDAH) {// jika LED dimatikan hidupkan dan sebaliknya ledState = TINGGI; } lain { ledState = RENDAH; } digitalWrite (ledPin, ledState); // tetapkan LED dengan ledState untuk berkelip lagi } }
Di sini, penyataannya
Gangguan di Arduino berfungsi sama seperti pengawal mikro lain. Papan Arduino UNO mempunyai dua pin berasingan untuk memasang gangguan pada GPIO pin 2 dan 3. Kami telah membahasnya secara terperinci dalam Arduino Interrupts Tutorial, di mana anda boleh mengetahui lebih lanjut mengenai Interrupts dan cara menggunakannya.
Di sini kita akan menunjukkan Arduino Multitasking dengan menangani dua tugas pada masa yang sama. Tugas-tugas tersebut akan merangkumi kedipan dua LED dalam kelewatan waktu yang berbeza bersama dengan butang tekan yang akan digunakan untuk mengawal keadaan ON / OFF LED. Jadi tiga tugas akan dilakukan secara serentak.
Komponen Diperlukan
- Arduino UNO
- Tiga LED (Mana-mana Warna)
- Ketahanan (470, 10k)
- Pelompat
- Papan roti
Rajah Litar
Gambarajah litar untuk menunjukkan penggunaan fuction Arduino Millis () sangat mudah dan tidak mempunyai banyak komponen untuk dilampirkan seperti gambar di bawah.
Pengaturcaraan Arduino UNO untuk Multitasking
Pengaturcaraan Arduino UNO untuk multitasking hanya memerlukan logik di sebalik cara kerja millis () yang dijelaskan di atas. Dianjurkan untuk mempraktikkan LED berkedip menggunakan millis berulang kali untuk membuat logiknya jelas dan membuat diri anda selesa dengan millis () sebelum memulakan program Arduino UNO untuk multitasking. Dalam tutorial ini interrupt juga digunakan dengan millis () secara serentak untuk multitasking. Butang akan menjadi gangguan. Oleh itu, setiap kali gangguan dihasilkan iaitu butang tekan ditekan, LED akan beralih ke keadaan ON atau OFF.Pengaturcaraan dimulakan dengan menyatakan nombor pin di mana LED dan Tombol Tekan dihubungkan.
int led1 = 6; int led2 = 7; int toggleLed = 5; int pushButton = 2;
Seterusnya kami menulis pemboleh ubah untuk menyimpan status LED untuk kegunaan masa depan.
int ledState1 = RENDAH; int ledState2 = RENDAH;
Sama seperti yang dijelaskan di atas dalam sekelip mata, pemboleh ubah untuk tempoh dan milis sebelumnya dinyatakan membandingkan dan menghasilkan kelewatan untuk LED. LED pertama berkelip selepas setiap 1 saat dan LED lain berkelip selepas 200ms.
lama tidak ditandatangani sebelumnyaMillis1 = 0; const long period1 = 1000; lama tidak ditandatangani sebelumnyaMillis2 = 0; jangka panjang const2 = 200;
Fungsi milis yang lain akan digunakan untuk menghasilkan kelewatan penyingkiran untuk mengelakkan banyak menekan butang tekan. Akan ada pendekatan yang serupa seperti di atas.
int debouncePeriod = 20; int debounceMillis = 0;
Ketiga - tiga pemboleh ubah tersebut akan digunakan untuk menyimpan status butang tekan sebagai gangguan, LED togol dan keadaan butang tekan.
butang boolPushed = false; int ledChange = RENDAH; int lastState = TINGGI;
Tentukan tindakan pin bahawa pin mana yang akan berfungsi sebagai INPUT atau OUTPUT.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT); pinMode (toggleLed, OUTPUT); pinMode (pushButton, INPUT);
Sekarang tentukan pin interrupt dengan melampirkan interrupt dengan definisi ISR dan Mode interrupt. Perhatikan bahawa disyorkan untuk menggunakan digitalPinToInterrupt (pin_number) ketika menyatakan fungsi attachInterrupt () untuk menterjemahkan pin digital sebenar ke nombor gangguan tertentu.
attachInterrupt (digitalPinToInterrupt (pushButton), pushButton_ISR, TUKAR);
Subrutin interrupt ditulis dan hanya akan menukar bendera tombolPekan. Perhatikan bahawa, gangguan subrutin harus sesingkat mungkin, jadi cubalah menulisnya dan meminimumkan petunjuk tambahan.
batal pushButton_ISR () { buttonPushed = true; }
Gelung bermula dengan menyimpan nilai milis dalam pemboleh ubah currentMillis yang akan menyimpan nilai masa yang berlalu setiap kali gelung berulang.
arus panjang yang tidak ditandatanganiMillis = millis ();
Terdapat total tiga fungsi dalam multitasking, berkedip satu LED pada 1 saat, Blink kedua LED pada 200ms dan Jika butang tekan ditekan maka matikan LED OFF / ON. Oleh itu, kami akan menulis tiga bahagian untuk melakukan tugas ini.
Yang pertama ialah menukar keadaan LED selepas setiap 1 saat dengan membandingkan milis yang berlalu.
if (currentMillis - sebelumnyaMillis1> = period1) { sebelumnyaMillis1 = currentMillis; jika (ledState1 == RENDAH) { ledState1 = TINGGI; } lain { ledState1 = RENDAH; } digitalWrite (led1, ledState1); }
Begitu juga kedua ia menukar LED selepas setiap 200ms dengan membandingkan milis yang berlalu. Penjelasannya sudah dijelaskan lebih awal dalam artikel ini.
if (currentMillis - sebelumnyaMillis2> = period2) { sebelumnyaMillis2 = currentMillis; jika (ledState2 == RENDAH) { ledState2 = TINGGI; } lain { ledState2 = RENDAH; } digitalWrite (led2, ledState2); }
Terakhir, bendera buttonPused dipantau dan setelah menghasilkan kelewatan penurunan 20ms, ia hanya menukar keadaan LED sesuai dengan butang tekan yang dilampirkan sebagai gangguan.
if (buttonPushed = true) // periksa sama ada ISR disebut { if ((currentMillis - debounceMillis)> debouncePeriod && buttonPushed) // jana kelewatan debouns 20ms untuk mengelakkan banyak penekanan { debounceMillis = currentMillis; // simpan masa kelewatan debounce terakhir jika (digitalRead (pushButton) == LOW && lastState == TINGGI) // ubah led selepas butang tekan ditekan { ledChange =! ledChange; digitalWrite (toggleLed, ledChange); lastState = RENDAH; } lain jika (digitalRead (pushButton) == HIGH && lastState == LOW) { lastState = TINGGI; } butang ditolak = salah; } }
Ini menyelesaikan Tutorial Arduino millis (). Perhatikan bahawa untuk membiasakan diri dengan milis (), praktikkan untuk menerapkan logik ini dalam beberapa aplikasi lain. Anda juga boleh mengembangkannya menggunakan motor, motor servo, sensor dan periferal lain. Sekiranya terdapat keraguan, sila tulis ke forum kami atau komen di bawah.
Kod dan Video yang lengkap untuk menunjukkan penggunaan fungsi milis di Arduino disediakan di bawah.