Pentru proiecte mai avansate, trebuie să modificați valorile și să citiți datele în timp real, ceea ce nu este posibil cu funcția de întârziere standard în Arduino. Prin urmare, este nevoie de o altă soluție. Din fericire, HeliOS vă poate ajuta.
Limitările lui Arduino
După cum sa menționat în introducere, limba standard a unui Arduino poate fi aplicată în multe moduri. Cu toate acestea, există o problemă: Arduino nu poate face mai multe sarcini. De exemplu, nu puteți seta trei LED-uri diferite să clipească la intervale independente. Această sarcină nu poate fi realizată deoarece, dacă utilizați întârziere, LED-ul cu cea mai lungă întârziere va bloca intermitentul celorlalte LED-uri în timp ce așteptați să comutați stările.
Interogarea standard este, de asemenea, dificilă, deoarece verificarea stării unui buton necesită o acțiune. Într-un Arduino standard, trebuie să configurați o funcție pentru a interoga starea unui comutator sau orice altă stare.
Deși există soluții pentru soluționarea acestor probleme (e.g., întreruperi hardware, funcția millis, implementarea FreeRTOS), dar aceste soluții au și limitări. Pentru a depăși problemele acestor soluții, Mannie Peterson a inventat HeliOS. HeliOS este mic și eficient și poate rula chiar și pe controlere pe 8 biți.
Luați în considerare codul de mai jos, care este cel mai puțin fiabil, deoarece instrucțiunea de întârziere va împiedica verificarea butonului.
int buttonPin = 2; // numărul pinului butonuluiint ledPin = 4; // numărul pinului LED
// variabilele se vor schimba:
int buttonState = 0; // variabilă pentru citirea stării butonului
configurare nulă ()
// inițializați pinul LED ca ieșire:
pinMode (ledPin, OUTPUT);
pinMode (LED_BUILTIN, OUTPUT);
// inițializați pinul butonului ca intrare:
pinMode (buttonPin, INPUT);
bucla nulă ()
// citiți starea valorii butonului:
buttonState = digitalRead (buttonPin);
// verificați dacă este apăsat butonul. Dacă este, butonul State este HIGH:
if (buttonState == HIGH)
digitalWrite (ledPin, HIGH); // aprinde LED-ul
altceva
digitalWrite (ledPin, LOW); // stinge LED-ul
digitalWrite (LED_BUILTIN, HIGH); // porniți LED-ul (HIGH este nivelul de tensiune)
întârziere (1000); // așteptați o secundă
digitalWrite (LED_BUILTIN, LOW); // opriți LED-ul făcând tensiunea scăzută
întârziere (1000); // așteptați o secundă
Când rulați acest cod, veți vedea că „ledPin” va clipi normal. Cu toate acestea, atunci când apăsați butonul, acesta nu se va aprinde sau, dacă este, va întârzia secvența de clipire. Pentru ca acest program să funcționeze, puteți trece la alte metode de întârziere; cu toate acestea, HeliOS oferă o alternativă.
Linux încorporat pe Arduino (HeliOS)
În ciuda „OS-ului” din numele său, HeliOS nu este un sistem de operare: este o bibliotecă de funcții multitasking. Cu toate acestea, implementează 21 de apeluri funcționale care pot simplifica sarcinile de control complexe. Pentru sarcini în timp real, sistemul trebuie să gestioneze informații externe pe măsură ce sunt primite. Pentru a face acest lucru, sistemul trebuie să poată face mai multe sarcini.
Mai multe strategii pot fi utilizate pentru a face față sarcinilor în timp real: strategii bazate pe evenimente, strategii echilibrate în timp de execuție și strategii de notificare a sarcinilor. Cu HeliOS, puteți utiliza oricare dintre aceste strategii cu apeluri funcționale.
La fel ca FreeRTOS, HeliOS îmbunătățește capacitățile multitasking ale controlerelor. Cu toate acestea, dezvoltatorii care planifică un proiect complex de importanță critică trebuie să utilizeze FreeRTOS sau ceva similar, deoarece HeliOS este destinat utilizării de entuziaști și pasionați care doresc să exploreze puterea multitaskingului.
Instalarea HeliOS
Când utilizați bibliotecile Arduino, pot fi instalate noi biblioteci cu IDE. Pentru versiunile 1.3.5 și mai sus, alegeți să utilizați Managerul de biblioteci.
Alternativ, puteți descărca un fișier zip de pe pagina web și puteți utiliza acel fișier pentru a instala HeliOS.
Vă rugăm să rețineți că trebuie să includeți HeliOS în cod înainte de a putea începe să îl utilizați.
Exemplu
Codul de mai jos poate fi folosit pentru a face un LED să clipească o dată pe secundă. Deși am adăugat codul HeliOS, efectul final este același cu cel al tutorialului introductiv.
Principala diferență aici este că trebuie să creați o sarcină. Această sarcină este pusă într-o stare de așteptare, iar un temporizator este setat pentru a indica sarcinii când să ruleze. În plus, bucla conține o singură declarație: xHeliOSLoop (). Această buclă rulează tot codul definit în setarea () codului. Când vă planificați codul, trebuie să setați toți pinii, constantele și funcțiile în setarea de sus.
#include// Folosit pentru a stoca starea LED-ului
volatile int ledState = 0;
volatile int buttonState = 0;
const int buttonPin = 2;
const int ledPin = 4;
// Definiți o sarcină de clipire
void taskBlink (xTaskId id_)
if (ledState)
digitalWrite (LED_BUILTIN, LOW);
ledState = 0;
altceva
digitalWrite (LED_BUILTIN, HIGH);
ledState = 1;
// Definiți o sarcină de citire a butonului
void buttonRead (xTaskId id_)
buttonState = digitalRead (buttonPin);
// verificați dacă este apăsat butonul. Dacă este, butonul State este HIGH:
if (buttonState == HIGH)
// aprinde LED-ul:
digitalWrite (ledPin, HIGH);
altceva
// opriți LED-ul:
digitalWrite (ledPin, LOW);
configurare nulă ()
// id ține evidența sarcinilor
xTaskId id = 0;
// Aceasta inițializează structurile de date Helios
xHeliOSSetup ();
pinMode (LED_BUILTIN, OUTPUT);
pinMode (ledPin, OUTPUT);
// inițializați pinul butonului ca intrare:
pinMode (buttonPin, INPUT);
// Adăugați și apoi faceți taskBlink să aștepte
id = xTaskAdd ("TASKBLINK", & taskBlink);
xTaskWait (id);
// Interval temporizator pentru „id”
xTaskSetTimer (id, 1000000);
id = xTaskAdd ("BUTON", & buttonRead);
xTaskStart (id);
bucla nulă ()
// Aceasta, și numai aceasta, este întotdeauna în buclă atunci când se utilizează Helios
xHeliosLoop ();
Cu acest cod, puteți programa LED-ul să clipească în orice moment, fără să vă faceți griji cu privire la întârzierea Arduino.
Concluzie
Acest proiect este minunat pentru persoanele care sunt noi în Arduino, deoarece vă permite să utilizați codul Arduino obișnuit pentru a gestiona sarcini în timp real. Cu toate acestea, metoda descrisă în acest articol este destinată numai pasionaților și cercetătorilor. Pentru proiecte mai serioase, sunt necesare alte metode.