Dalam teknologi mikroprosesor, tugas yang berjalan secara paralel disebut Threads. Ini sangat nyaman, karena sering kali diperlukan untuk melakukan beberapa operasi secara bersamaan. Apakah mungkin untuk membuat mikrokontroler Arduino melakukan beberapa tugas sekaligus, seperti prosesor nyata? Ayo lihat.
Itu perlu
- -Arduino;
- - 1 LED;
- - 1 buah bel piezo.
instruksi
Langkah 1
Secara umum, Arduino tidak mendukung paralelisasi sejati, atau multithreading.
Tetapi Anda dapat memberi tahu mikrokontroler untuk memeriksa apakah waktunya telah tiba untuk menjalankan beberapa tugas latar belakang tambahan pada setiap pengulangan siklus "loop ()". Dalam hal ini, tampaknya bagi pengguna bahwa beberapa tugas sedang dilakukan secara bersamaan.
Misalnya, mari kita mengedipkan LED pada frekuensi tertentu dan, secara paralel, memancarkan suara yang naik dan turun seperti sirene dari emitor piezoelektrik.
Kami telah menghubungkan LED dan emitor piezo ke Arduino lebih dari sekali. Mari kita merakit sirkuit seperti yang ditunjukkan pada gambar. Jika Anda menghubungkan LED ke pin digital selain "13", ingatlah untuk memiliki resistor pembatas arus sekitar 220 ohm.
Langkah 2
Mari kita menulis sketsa seperti ini dan mengunggahnya ke Arduino.
Setelah memuat papan, Anda dapat melihat bahwa sketsa tidak dieksekusi persis seperti yang kami butuhkan: sampai sirene beroperasi penuh, LED tidak akan berkedip, dan kami ingin LED berkedip SELAMA sirene berbunyi. Apa masalah yang terjadi di sini?
Faktanya adalah bahwa masalah ini tidak dapat diselesaikan dengan cara biasa. Tugas dilakukan oleh mikrokontroler secara berurutan. Operator "delay ()" menunda eksekusi program untuk jangka waktu tertentu, dan hingga waktu tersebut habis, perintah program berikut tidak akan dijalankan. Karena itu, kami tidak dapat menetapkan durasi eksekusi yang berbeda untuk setiap tugas di "loop ()" program.
Oleh karena itu, Anda perlu mensimulasikan multitasking.
Langkah 3
Opsi di mana Arduino akan melakukan tugas dalam pseudo-paralel disarankan oleh pengembang Arduino dalam artikel
Inti dari metode ini adalah bahwa dengan setiap pengulangan loop "loop ()", kami memeriksa apakah sudah waktunya untuk mengedipkan LED (untuk melakukan tugas latar belakang) atau tidak. Dan jika ya, maka kita membalikkan status LED. Ini adalah semacam melewati operator "delay ()".
Kerugian yang signifikan dari metode ini adalah bahwa bagian kode di depan unit kontrol LED harus dieksekusi lebih cepat daripada interval waktu berkedip dari LED "ledInterval". Jika tidak, kedipan akan terjadi lebih jarang dari yang diperlukan, dan kita tidak akan mendapatkan efek dari pelaksanaan tugas secara paralel. Secara khusus, dalam sketsa kami, durasi perubahan suara sirene adalah 200 + 200 + 200 + 200 = 800 mdtk, dan kami mengatur interval kedipan LED menjadi 200 mdtk. Tetapi LED akan berkedip dengan periode 800 msec, yang berbeda 4 kali dari yang kami setel. Secara umum, jika operator "penundaan ()" digunakan dalam kode, maka sulit untuk mensimulasikan paralelisme semu, jadi disarankan untuk menghindarinya.
Dalam hal ini, unit kontrol suara sirene perlu juga memeriksa apakah waktunya telah tiba atau belum, dan tidak menggunakan "penundaan ()". Tapi ini akan menambah jumlah kode dan memperburuk keterbacaan program.
Langkah 4
Untuk mengatasi masalah ini, kami akan menggunakan perpustakaan ArduinoThread yang luar biasa, yang memungkinkan Anda membuat proses pseudo-paralel dengan mudah. Ini bekerja dengan cara yang sama, tetapi memungkinkan Anda untuk tidak menulis kode untuk memeriksa waktu - apakah Anda perlu menjalankan tugas dalam loop ini atau tidak. Ini mengurangi jumlah kode dan meningkatkan keterbacaan sketsa. Mari kita periksa perpustakaan beraksi.
Pertama-tama, unduh arsip perpustakaan dari situs resmi https://github.com/ivanseidel/ArduinoThread/archive/master.zip dan unzip ke direktori "libraries" dari Arduino IDE. Kemudian ganti nama folder "ArduinoThread-master" menjadi "ArduinoThread".
Langkah 5
Diagram koneksi akan tetap sama. Hanya kode program yang akan berubah. Sekarang akan sama seperti di sidebar.
Dalam program ini, kami membuat dua aliran, masing-masing melakukan operasinya sendiri: satu berkedip dengan LED, yang kedua mengontrol suara sirene. Dalam setiap iterasi loop, untuk setiap utas, kami memeriksa apakah waktunya telah tiba untuk eksekusi atau belum. Jika tiba, itu diluncurkan untuk dieksekusi menggunakan metode "jalankan ()". Hal utama adalah tidak menggunakan operator "delay ()".
Penjelasan lebih rinci diberikan dalam kode.
Mari kita memuat kode ke dalam memori Arduino, jalankan. Sekarang semuanya bekerja persis seperti seharusnya!