- Apa itu Multitasking?
- Mengapa melewatkan penundaan () dalam bahasa Arduino?
- Mengapa menggunakan milis ()?
- Komponen Diperlukan
- Diagram Sirkuit
- Pemrograman Arduino UNO untuk Multitasking
The multitasking telah menyebabkan komputer untuk revolusi di mana satu atau lebih program dapat dijalankan secara bersamaan yang meningkatkan efisiensi, fleksibilitas, kemampuan adaptasi dan produktivitas. Dalam sistem tertanam, mikrokontroler juga dapat menangani Multitasking dan melakukan dua atau lebih tugas secara bersamaan tanpa menghentikan instruksi saat ini.
Di sini, di tutorial ini kita akan mempelajari Bagaimana Arduino melakukan Multitasking dengan fungsi Arduino millis. Umumnya fungsi delay () digunakan di Arduino untuk tugas periodik seperti LED Berkedip tetapi fungsi delay () ini menghentikan program untuk beberapa waktu tertentu dan tidak mengizinkan operasi lain untuk dilakukan. Jadi artikel ini menjelaskan bagaimana kita dapat menghindari penggunaan fungsi delay () dan menggantinya dengan millis () untuk melakukan lebih dari satu tugas secara bersamaan dan menjadikan Arduino sebagai pengontrol Multitasking. Sebelum membahas detailnya, mari kita mulai dengan meremehkan Multitasking.
Apa itu Multitasking?
Multitasking berarti menjalankan lebih dari satu tugas atau program secara bersamaan pada saat yang bersamaan. Hampir semua sistem operasi memiliki fitur multitasking. Sistem operasi semacam ini dikenal sebagai MOS (sistem operasi multitasking). MOS dapat berupa Sistem Operasi PC seluler atau desktop. Contoh yang baik dari multitasking di komputer adalah ketika pengguna menjalankan aplikasi email, browser internet, pemutar media, game, pada saat yang bersamaan dan jika pengguna tidak ingin menggunakan aplikasi itu berjalan di latar belakang jika tidak ditutup. Pengguna akhir menggunakan semua aplikasi ini pada saat yang sama tetapi OS mengambil konsep ini sedikit berbeda. Mari kita bahas bagaimana OS mengelola multitasking.
Seperti terlihat pada gambar, CPU membagi waktu menjadi tiga bagian yang sama dan menetapkan setiap bagian untuk setiap tugas / aplikasi. Beginilah cara multitasking dilakukan di sebagian besar sistem. Konsepnya akan hampir sama untuk Arduino Multitasking, hanya saja pembagian waktunya akan sedikit berbeda. Karena Arduino berjalan dalam frekuensi rendah dan RAM dibandingkan dengan Laptop / Mobile / PC maka waktu yang diberikan untuk setiap tugas juga akan berbeda. Arduino juga memiliki fungsi delay () yang digunakan secara luas. Tetapi sebelum memulai, mari kita bahas mengapa kita tidak menggunakan fungsi delay () dalam proyek apa pun.
Mengapa melewatkan penundaan () dalam bahasa Arduino?
Jika dokumentasi referensi Arduino diperhatikan maka ada dua jenis fungsi delay, yang pertama adalah delay () dan yang kedua adalah delayMicroseconds (). Kedua fungsi tersebut identik dalam hal menghasilkan penundaan. Satu-satunya perbedaan adalah bahwa, dalam fungsi delay (), integer parameter yang dilewatkan dalam milidetik yaitu jika kita menulis delay (1000) maka delay akan menjadi 1000 milidetik yaitu 1 detik. Demikian pula pada fungsi delayMicroseconds (), parameter yang dilewatkan dalam microseconds yaitu jika kita menulis delayMicroseconds (1000), maka delay akan menjadi 1000 mikrodetik yaitu 1 milidetik.
Inilah intinya, kedua fungsi menghentikan program untuk jumlah waktu yang dilalui dalam fungsi penundaan. Jadi jika kita memberikan jeda 1 detik maka prosesor tidak dapat melanjutkan ke instruksi berikutnya sampai 1 detik berlalu. Demikian pula jika penundaan adalah 10 detik maka program akan berhenti selama 10 detik dan prosesor tidak akan mengizinkan untuk melanjutkan instruksi berikutnya sampai 10 detik berlalu. Ini menghambat kinerja mikrokontroler dalam hal kecepatan dan menjalankan instruksi.
Contoh terbaik untuk menjelaskan kelemahan fungsi penundaan adalah menggunakan dua tombol tekan. Pertimbangkan kami ingin mengaktifkan dua LED menggunakan dua tombol tekan. Jadi jika satu tombol ditekan maka LED yang sesuai akan menyala selama 2 detik, demikian pula jika kedua ditekan maka LED akan menyala selama 4 detik. Namun pada saat kita menggunakan delay (), jika user menekan tombol pertama maka program akan berhenti selama 2 detik dan jika user menekan tombol kedua sebelum delay 2 detik, maka mikrokontroler tidak akan menerima masukan sebagai programnya. dalam tahap berhenti.
Dokumentasi resmi Arduino dengan jelas menyebutkan ini dalam deskripsi fungsi Catatan dan Peringatan penundaan (). Anda dapat membuka dan memeriksa ini untuk membuatnya lebih jelas.
Mengapa menggunakan milis ()?
Untuk mengatasi masalah yang disebabkan oleh penggunaan penundaan, pengembang harus menggunakan fungsi millis () yang mudah digunakan setelah Anda menjadi terbiasa dan akan menggunakan kinerja CPU 100% tanpa menimbulkan penundaan dalam menjalankan instruksi. milis () adalah fungsi yang mengembalikan jumlah milidetik yang telah berlalu sejak papan Arduino mulai menjalankan program saat ini tanpa membekukan program. Jumlah waktu ini akan melimpah (yaitu kembali ke nol), setelah kira-kira 50 hari.
Sama seperti Arduino yang memiliki delayMicroseconds (), Arduino juga memiliki versi mikro milis () sebagai micros (). Perbedaan antara mikro dan milis adalah, mikro () akan meluap setelah kira-kira 70 menit, dibandingkan dengan milis () yang berarti 50 hari. Jadi tergantung pada aplikasinya, Anda dapat menggunakan milis () atau micros ().
Menggunakan millis () sebagai ganti delay ():
Untuk menggunakan milis () untuk pengaturan waktu dan penundaan, Anda perlu mencatat dan menyimpan waktu di mana tindakan terjadi untuk memulai waktu dan kemudian memeriksa pada interval apakah waktu yang ditentukan telah berlalu. Jadi seperti yang dinyatakan, simpan waktu saat ini dalam variabel.
currentMillis panjang unsigned = millis ();
Kami membutuhkan dua variabel lagi untuk mengetahui apakah waktu yang dibutuhkan telah berlalu. Kami telah menyimpan waktu saat ini di variabel currentMillis tetapi kami juga perlu tahu bahwa kapan periode waktu dimulai dan berapa lama periode tersebut. Jadi Interval dan previousMillis dinyatakan. Interval akan memberi tahu kami waktu tunda dan previosMillis akan menyimpan terakhir kali acara tersebut terjadi.
PreviousMillis panjang yang tidak ditandatangani; periode panjang unsigned = 1000;
Untuk memahami ini, mari kita ambil contoh LED berkedip sederhana. Periode = 1000 akan memberitahu kita bahwa LED akan berkedip selama 1 detik atau 1000ms.
const int ledPin = 4; // nomor pin LED terhubung int ledState = LOW; // digunakan untuk menyetel status LED unsigned long beforeMillis = 0; // akan menyimpan terakhir kali LED berkedip konstan periode panjang = 1000; // periode untuk berkedip dalam ms void setup () { pinMode (ledPin, OUTPUT); // setel pin sebagai keluaran } void loop () { unsigned long currentMillis = millis (); // simpan waktu saat ini jika (currentMillis - beforeMillis> = periode) {// periksa apakah 1000ms melewati beforeMillis = currentMillis; // simpan terakhir kali Anda mengedipkan LED jika (ledState == LOW) {// jika LED mati hidupkan dan sebaliknya ledState = HIGH; } lain { ledState = LOW; } digitalWrite (ledPin, ledState); // setel LED dengan ledState agar berkedip lagi } }
Ini, pernyataannya
Interupsi di Arduino berfungsi sama seperti di mikrokontroler lainnya. Papan Arduino UNO memiliki dua pin terpisah untuk memasang interupsi pada GPIO pin 2 dan 3. Kami telah membahasnya secara mendetail dalam Tutorial Interupsi Arduino, di mana Anda dapat mempelajari lebih lanjut tentang Interupsi dan cara menggunakannya.
Di sini kami akan menunjukkan Arduino Multitasking dengan menangani dua tugas secara bersamaan. Tugasnya akan mencakup kedipan dua LED dalam waktu tunda yang berbeda bersama dengan tombol tekan yang akan digunakan untuk mengontrol status ON / OFF LED. Jadi tiga tugas akan dilakukan secara bersamaan.
Komponen Diperlukan
- Arduino UNO
- Tiga LED (Warna Apa Pun)
- Resistensi (470, 10k)
- Pelompat
- Papan tempat memotong roti
Diagram Sirkuit
Diagram rangkaian untuk mendemonstrasikan penggunaan fungsi Arduino Millis () sangat mudah dan tidak memiliki banyak komponen untuk dipasang seperti gambar di bawah ini.
Pemrograman Arduino UNO untuk Multitasking
Pemrograman Arduino UNO untuk multitasking hanya akan membutuhkan logika di balik cara kerja millis () yang dijelaskan di atas. Dianjurkan untuk berlatih LED berkedip menggunakan milidetik lagi dan lagi untuk membuat logikanya jelas dan membuat Anda nyaman dengan milis () sebelum mulai memprogram Arduino UNO untuk multitasking. Dalam tutorial ini interupsi juga digunakan dengan milis () secara bersamaan untuk multitasking. Tombol tersebut akan menjadi interupsi. Jadi setiap kali interupsi dihasilkan yaitu tombol tekan ditekan, LED akan beralih ke status ON atau OFF.Pemrograman dimulai dengan mendeklarasikan nomor pin dimana LED dan Push Button dihubungkan.
int led1 = 6; int led2 = 7; int toggleLed = 5; int pushButton = 2;
Selanjutnya kami menulis variabel untuk menyimpan status LED untuk digunakan di masa mendatang.
int ledState1 = RENDAH; int ledState2 = RENDAH;
Seperti yang dijelaskan di atas dalam contoh kedip, variabel untuk periode dan mili sebelumnya dinyatakan untuk membandingkan dan menghasilkan penundaan untuk LED. LED pertama berkedip setiap 1 detik dan LED lain berkedip setelah 200ms.
unsigned long beforeMillis1 = 0; const panjang period1 = 1000; unsigned long beforeMillis2 = 0; const panjang period2 = 200;
Fungsi milis lainnya akan digunakan untuk menghasilkan penundaan debounce untuk menghindari beberapa penekanan tombol tekan. Akan ada pendekatan serupa seperti di atas.
int debouncePeriod = 20; int debounceMillis = 0;
The tiga variabel akan digunakan untuk menyimpan status tombol push sebagai interupsi, beralih LED dan negara menekan tombol.
bool buttonPushed = false; int ledChange = LOW; int lastState = HIGH;
Tentukan aksi pin yang mana pin akan berfungsi sebagai INPUT atau OUTPUT.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT); pinMode (toggleLed, OUTPUT); pinMode (pushButton, INPUT);
Sekarang tentukan pin interupsi dengan memasang interupsi dengan definisi ISR dan Mode interupsi. Perhatikan bahwa disarankan untuk menggunakan digitalPinToInterrupt (pin_number) saat mendeklarasikan fungsi attachInterrupt () untuk menerjemahkan pin digital aktual ke nomor interupsi tertentu.
attachInterrupt (digitalPinToInterrupt (pushButton), pushButton_ISR, CHANGE);
Subrutin interupsi ditulis dan hanya akan mengubah flag buttonPushed. Perhatikan bahwa, subrutin interupsi harus dibuat sesingkat mungkin, jadi cobalah untuk menulisnya dan meminimalkan instruksi tambahan.
batal pushButton_ISR () { buttonPushed = true; }
Loop dimulai dengan menyimpan nilai millis dalam variabel currentMillis yang akan menyimpan nilai waktu yang telah berlalu setiap kali loop berulang.
currentMillis panjang unsigned = millis ();
Ada total tiga fungsi dalam multitasking, kedip satu LED dalam 1 detik, Kedipkan LED kedua pada 200ms dan Jika tombol ditekan maka matikan / ON LED. Jadi kami akan menulis tiga bagian untuk melakukan tugas ini.
Yang pertama adalah mengubah status LED setelah setiap 1 detik dengan membandingkan milis yang telah berlalu.
jika (currentMillis - beforeMillis1> = period1) { priorMillis1 = currentMillis; jika (ledState1 == LOW) { ledState1 = HIGH; } lain { ledState1 = LOW; } digitalWrite (led1, ledState1); }
Demikian pula yang kedua itu mematikan LED setelah setiap 200ms dengan membandingkan milis yang telah berlalu. Penjelasannya sudah dijelaskan sebelumnya di artikel ini.
jika (currentMillis - beforeMillis2> = period2) { priorMillis2 = currentMillis; jika (ledState2 == LOW) { ledState2 = HIGH; } lain { ledState2 = LOW; } digitalWrite (led2, ledState2); }
Terakhir, bendera buttonPushed dipantau dan setelah menghasilkan penundaan debounce 20ms itu hanya mengubah keadaan LED sesuai dengan tombol tekan terpasang sebagai interupsi.
if (buttonPushed = true) // periksa apakah ISR dipanggil { if ((currentMillis - debounceMillis)> debouncePeriod && buttonPushed) // buat penundaan debounce 20 md untuk menghindari beberapa penekanan { debounceMillis = currentMillis; // simpan waktu tunda debounce terakhir jika (digitalRead (pushButton) == LOW && lastState == HIGH) // ubah led setelah tombol tekan ditekan { ledChange =! ledChange; digitalWrite (toggleLed, ledChange); lastState = LOW; } else if (digitalRead (pushButton) == HIGH && lastState == LOW) { lastState = HIGH; } buttonPushed = false; } }
Ini menyelesaikan Tutorial Arduino millis (). Perhatikan bahwa untuk membiasakan diri dengan millis (), cukup praktikkan untuk mengimplementasikan logika ini di beberapa aplikasi lain. Anda juga dapat mengembangkannya untuk menggunakan motor, motor servo, sensor, dan periferal lainnya. Jika ada keraguan, silakan tulis ke forum kami atau komentar di bawah.
Kode lengkap dan Video untuk mendemonstrasikan penggunaan fungsi millis di Arduino disediakan di bawah ini.