Untuk proyek yang lebih maju, Anda perlu mengubah nilai dan membaca data secara real time, yang tidak mungkin dilakukan dengan fungsi penundaan standar di Arduino. Oleh karena itu, diperlukan solusi yang berbeda. Untungnya, HeliOS dapat membantu.
Keterbatasan Arduino
Seperti disebutkan dalam pendahuluan, bahasa standar Arduino dapat diterapkan dalam banyak cara. Namun, ada masalah: Arduino tidak dapat melakukan banyak tugas. Misalnya, Anda tidak dapat mengatur tiga LED berbeda untuk berkedip pada interval independen. Tugas ini tidak dapat dilakukan karena, jika Anda menggunakan penundaan, LED dengan penundaan terlama akan memblokir kedipan LED lainnya sambil menunggu untuk beralih status.
Polling standar juga merepotkan, karena memeriksa status tombol memerlukan tindakan yang harus diambil. Dalam Arduino standar, Anda harus mengatur fungsi untuk melakukan polling status sakelar atau status lainnya.
Meskipun ada solusi untuk mengatasi masalah ini (mis.g., interupsi perangkat keras, fungsi milis, implementasi FreeRTOS), tetapi solusi ini juga memiliki keterbatasan. Untuk mengatasi masalah solusi ini, Mannie Peterson menemukan HeliOS. HeliOS kecil dan efisien, dan bahkan dapat berjalan pada pengontrol 8-bit.
Pertimbangkan kode di bawah ini, yang paling tidak dapat diandalkan karena pernyataan penundaan akan mencegah tombol dicentang.
int tombolPin = 2; // jumlah pin tombol tekanint ledPin = 4; // jumlah pin LED
// variabel akan berubah:
int keadaan tombol = 0; // variabel untuk membaca status tombol tekan
batalkan pengaturan()
// inisialisasi pin LED sebagai output:
pinMode(ledPin, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
// inisialisasi pin tombol sebagai input:
pinMode(tombolPin, INPUT);
lingkaran kosong()
// membaca status nilai tombol tekan:
buttonState = digitalRead(buttonPin);
// periksa apakah tombol ditekan. Jika ya, status tombolnya TINGGI:
if (buttonState == TINGGI)
digitalWrite(ledPin, TINGGI); // nyalakan LED
lain
digitalWrite(ledPin, RENDAH); // matikan LED
digitalWrite(LED_BUILTIN, TINGGI); // nyalakan LED (TINGGI adalah level tegangan)
penundaan (1000); // tunggu sebentar
digitalWrite(LED_BUILTIN, RENDAH); // matikan LED dengan membuat tegangan LOW
penundaan (1000); // tunggu sebentar
Saat Anda menjalankan kode ini, Anda akan melihat bahwa 'ledPin' akan berkedip secara normal. Namun, ketika Anda menekan tombol, itu tidak akan menyala, atau jika menyala, itu akan menunda urutan kedipan. Untuk membuat program ini bekerja, Anda dapat beralih ke metode penundaan lainnya; namun, HeliOS menyediakan alternatif.
Linux Tertanam di Arduino (HeliOS)
Terlepas dari "OS" dalam namanya, HeliOS bukanlah sistem operasi: ini adalah perpustakaan fungsi multitasking. Namun, itu menerapkan 21 panggilan fungsi yang dapat menyederhanakan tugas kontrol yang kompleks complex. Untuk tugas waktu nyata, sistem harus menangani informasi eksternal saat diterima. Untuk melakukannya, sistem harus dapat melakukan banyak tugas.
Beberapa strategi dapat digunakan untuk menangani tugas waktu nyata: strategi berbasis peristiwa, strategi seimbang run-time, dan strategi pemberitahuan tugas. Dengan HeliOS, Anda dapat menggunakan salah satu dari strategi ini dengan panggilan fungsi.
Seperti FreeRTOS, HeliOS meningkatkan kemampuan multitasking pengontrol. Namun, pengembang yang merencanakan proyek kompleks yang sangat penting perlu menggunakan FreeRTOS atau yang serupa karena HeliOS ditujukan untuk digunakan oleh para penggemar dan penghobi yang ingin menjelajahi kekuatan multitasking.
Menginstal HeliOS
Saat menggunakan perpustakaan Arduino, perpustakaan baru dapat diinstal dengan IDE. Untuk versi 1.3.5 ke atas, Anda memilih menggunakan Manajer Perpustakaan.
Atau, Anda dapat mengunduh file zip dari halaman web, dan menggunakan file itu untuk menginstal HeliOS.
Harap dicatat bahwa Anda harus menyertakan HeliOS dalam kode Anda sebelum Anda dapat mulai menggunakannya.
Contoh
Kode di bawah ini dapat digunakan untuk membuat LED berkedip sekali per detik. Meskipun kami telah menambahkan kode HeliOS, efek akhirnya sama dengan tutorial pengantar.
Perbedaan utama di sini adalah Anda harus membuat tugas. Tugas ini dimasukkan ke dalam status menunggu, dan pengatur waktu diatur untuk memberi tahu tugas kapan harus dijalankan. Selain itu, loop hanya berisi satu pernyataan: xHeliOSLoop(). Loop ini menjalankan semua kode yang ditentukan dalam setup() dari kode. Saat Anda merencanakan kode Anda, Anda perlu mengatur semua pin, konstanta, dan fungsi di pengaturan atas.
#termasuk//Digunakan untuk menyimpan status LED
volatil int ledState = 0;
volatile int buttonState = 0;
const int buttonPin = 2;
const int ledPin = 4;
// Tentukan tugas berkedip
void taskBlink(xTaskId id_)
jika (negara bagian)
digitalWrite(LED_BUILTIN, RENDAH);
keadaan led = 0;
lain
digitalWrite(LED_BUILTIN, TINGGI);
ledState = 1;
// Tentukan tugas baca tombol
void buttonRead(xTaskId id_)
buttonState = digitalRead(buttonPin);
// periksa apakah tombol ditekan. Jika ya, status tombolnya TINGGI:
if (buttonState == TINGGI)
// nyalakan LED:
digitalWrite(ledPin, TINGGI);
lain
// matikan LED:
digitalWrite(ledPin, RENDAH);
batalkan pengaturan()
// id melacak tugas
xTaskId id = 0;
// Ini menginisialisasi struktur data Helios
xHeliOSSetup();
pinMode(LED_BUILTIN, OUTPUT);
pinMode(ledPin, OUTPUT);
// inisialisasi pin tombol sebagai input:
pinMode(tombolPin, INPUT);
// Tambahkan lalu buat taskBlink menunggu
id = xTaskAdd("TASKBLINK", &taskBlink);
xTugasTunggu(id);
// Interval penghitung waktu untuk 'id'
xTaskSetTimer(id, 1000000);
id = xTaskAdd("BUTTON", &buttonRead);
xTugasMulai(id);
lingkaran kosong()
//Ini, dan hanya ini, selalu dalam lingkaran saat menggunakan Helios
xHeliosLoop();
Dengan kode ini, Anda dapat memprogram LED untuk berkedip kapan saja tanpa harus khawatir Arduino tertunda.
Kesimpulan
Proyek ini sangat bagus untuk orang yang baru mengenal Arduino, karena memungkinkan Anda menggunakan kode Arduino biasa untuk menangani tugas waktu nyata. Namun, metode yang dijelaskan dalam artikel ini hanya untuk penggemar dan peneliti. Untuk proyek yang lebih serius, metode lain diperlukan.