Cara Melakukan Tugas Paralel (Utas) Dalam Program Arduino

Daftar Isi:

Cara Melakukan Tugas Paralel (Utas) Dalam Program Arduino
Cara Melakukan Tugas Paralel (Utas) Dalam Program Arduino

Video: Cara Melakukan Tugas Paralel (Utas) Dalam Program Arduino

Video: Cara Melakukan Tugas Paralel (Utas) Dalam Program Arduino
Video: Как запрограммировать Arduino Uno с помощью мобильного телефона. | Как запрограммировать Arduino с помощью смартфона Android. 2024, November
Anonim

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.

Aliran paralel dalam program Arduino
Aliran paralel dalam program Arduino

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.

Diagram pengkabelan untuk buzzer dan LED ke Arduino
Diagram pengkabelan untuk buzzer dan LED ke Arduino

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.

Kontrol pager dan LED secara seri
Kontrol pager dan LED secara seri

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.

LED berkedip tanpa penundaan () operator
LED berkedip tanpa penundaan () operator

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".

Memasang perpustakaan ArduinoThread
Memasang perpustakaan 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!

Direkomendasikan: