Arduino

HeliOS pentru Arduino

HeliOS pentru Arduino
Microcontrolerele unui Arduino utilizează un singur program pentru a controla toate comutatoarele, LED-urile și alte părți ale sistemului. Primul program învățat de un utilizator Arduino este de obicei programul „Blink”, care folosește funcția de întârziere pentru a porni și opri un LED într-un model uniform. Acest program simplu poate fi extins pentru a face multe lucruri, dar nu poate include multitasking.

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 butonului
int 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.

How to change Mouse pointer and cursor size, color & scheme on Windows 10
The mouse pointer and cursor in Windows 10 are very important aspects of the operating system. This can be said for other operating systems as well, s...
Motoare de jocuri gratuite și open source pentru dezvoltarea jocurilor Linux
Acest articol va acoperi o listă de motoare de jocuri gratuite și open source care pot fi utilizate pentru dezvoltarea jocurilor 2D și 3D pe Linux. Ex...
Tutorial Shadow of the Tomb Raider pentru Linux
Shadow of the Tomb Raider este a douăsprezecea completare a seriei Tomb Raider - o franciză de jocuri de acțiune-aventură creată de Eidos Montreal. Jo...