Izvērstākiem projektiem ir jāmaina vērtības un jālasa dati reāllaikā, kas nav iespējams, izmantojot standarta aizkaves funkciju Arduino. Tāpēc ir nepieciešams cits risinājums. Par laimi, HeliOS var palīdzēt.
Arduino ierobežojumi
Kā minēts ievadā, Arduino standarta valodu var izmantot dažādos veidos. Tomēr pastāv problēma: Arduino nevar veikt daudzuzdevumus. Piemēram, jūs nevarat iestatīt trīs dažādus gaismas diodes, kas mirgo neatkarīgi. Šo uzdevumu nevar veikt, jo, ja izmantojat kavēšanos, gaismas diode ar visilgāko kavēšanos bloķēs citu LED mirgošanu, gaidot stāvokļa pārslēgšanu.
Arī standarta aptauja ir apgrūtinoša, jo, pārbaudot pogas stāvokli, ir jāveic darbība. Standarta Arduino jums ir jāiestata funkcija, lai aptaujātu slēdža stāvokli vai jebkuru citu stāvokli.
Lai gan šo problēmu risināšanai ir risinājumi (piemēram,.g., aparatūras darbība tiek pārtraukta, funkcija milis, FreeRTOS ieviešana), taču šiem risinājumiem ir arī ierobežojumi. Lai pārvarētu šo risinājumu problēmas, Menijs Pētersons izgudroja HeliOS. HeliOS ir mazs un efektīvs, un to var darbināt pat ar 8 bitu kontrolleriem.
Apsveriet zemāk redzamo kodu, kas labākajā gadījumā ir neuzticams, jo aizkaves paziņojums neļaus pārbaudīt pogu.
int pogaPin = 2; // spiedpogas tapas numursint ledPin = 4; // LED tapas numurs
// mainīgie mainīsies:
int buttonState = 0; // mainīgais spiedpogas statusa nolasīšanai
anulēt iestatīšanu ()
// inicializēt LED tapu kā izvadi:
pinMode (ledPin, OUTPUT);
pinMode (LED_BUILTIN, OUTPUT);
// inicializēt spiedpogas tapu kā ievadi:
pinMode (buttonPin, INPUT);
void loop ()
// nolasiet spiedpogas vērtības stāvokli:
buttonState = digitalRead (buttonPin);
// pārbaudiet, vai spiedpoga ir nospiesta. Ja tā ir, buttonState ir HIGH:
ja (buttonState == AUGSTS)
digitalWrite (ledPin, HIGH); // ieslēdziet LED
cits
digitalWrite (ledPin, LOW); // izslēgt LED
digitalWrite (LED_BUILTIN, HIGH); // ieslēdziet LED (HIGH ir sprieguma līmenis)
kavēšanās (1000); // pagaidiet sekundi
digitalWrite (LED_BUILTIN, LOW); // izslēdziet LED, padarot spriegumu LOW
kavēšanās (1000); // pagaidiet sekundi
Palaidot šo kodu, redzēsiet, ka “ledPin” mirgos normāli. Tomēr, nospiežot pogu, tā neiedegas vai, ja iedegas, tas aizkavēs mirgošanas secību. Lai šī programma darbotos, varat pārslēgties uz citām kavēšanās metodēm; tomēr HeliOS nodrošina alternatīvu.
Linux iebūvēts Arduino (HeliOS)
Neskatoties uz tā nosaukuma “OS”, HeliOS nav operētājsistēma: tā ir daudzuzdevumu funkciju bibliotēka. Tomēr tas īsteno 21 funkciju izsaukumu, kas var vienkāršot sarežģītus vadības uzdevumus. Veicot reāllaika uzdevumus, sistēmai jārīkojas pēc ārējās informācijas saņemšanas brīdī. Lai to izdarītu, sistēmai jāspēj veikt daudzuzdevumus.
Reāllaika uzdevumu apstrādei var izmantot vairākas stratēģijas: uz notikumiem balstītas stratēģijas, izpildes laikā līdzsvarotas stratēģijas un uzdevumu paziņošanas stratēģijas. Izmantojot HeliOS, jūs varat izmantot jebkuru no šīm stratēģijām ar funkciju izsaukumiem.
Tāpat kā FreeRTOS, arī HeliOS uzlabo kontrolieru daudzuzdevumu iespējas. Tomēr izstrādātājiem, kuri plāno sarežģītu, ļoti svarīgu projektu, ir jāizmanto FreeRTOS vai kaut kas līdzīgs, jo HeliOS ir paredzēts entuziastiem un hobijiem, kuri vēlas izpētīt daudzuzdevumu iespējas.
HeliOS instalēšana
Izmantojot Arduino bibliotēkas, ar IDE var instalēt jaunas bibliotēkas. 1. versijai.3.5 un augstāk, jūs izvēlaties izmantot bibliotēkas pārvaldnieku.
Alternatīvi, jūs varat lejupielādēt zip failu no tīmekļa vietnes un izmantot šo failu, lai instalētu HeliOS.
Lūdzu, ņemiet vērā, ka HeliOS jāiekļauj kodā, pirms varat sākt to lietot.
Piemērs
Zemāk esošo kodu var izmantot, lai LED mirgotu vienu reizi sekundē. Lai gan mēs esam pievienojuši HeliOS kodu, galīgais efekts ir tāds pats kā ievadmācības.
Galvenā atšķirība šeit ir tā, ka jums ir jāizveido uzdevums. Šis uzdevums tiek ievietots gaidīšanas stāvoklī, un taimeris ir iestatīts, lai uzdevumam norādītu, kad tas ir jāizpilda. Turklāt cilpa satur tikai vienu paziņojumu: xHeliOSLoop (). Šī cilpa palaiž visu kodu, kas definēts koda iestatījumā (). Plānojot kodu, augšējā iestatījumā ir jāiestata visas tapas, konstantes un funkcijas.
# iekļaut// Izmanto, lai saglabātu gaismas diodes stāvokli
gaistošā int ledState = 0;
volatile int buttonState = 0;
const int pogaPin = 2;
const int ledPin = 4;
// Definējiet mirgojošu uzdevumu
void taskBlink (xTaskId id_)
ja (ledState)
digitalWrite (LED_BUILTIN, LOW);
ledState = 0;
cits
digitalWrite (LED_BUILTIN, HIGH);
ledState = 1;
// Definējiet pogas lasīšanas uzdevumu
void buttonRead (xTaskId id_)
buttonState = digitalRead (buttonPin);
// pārbaudiet, vai spiedpoga ir nospiesta. Ja tā ir, buttonState ir HIGH:
ja (buttonState == AUGSTS)
// ieslēdziet LED:
digitalWrite (ledPin, HIGH);
cits
// izslēgt LED:
digitalWrite (ledPin, LOW);
anulēt iestatīšanu ()
// id seko uzdevumiem
xTaskId id = 0;
// Tas inicializē Helios datu struktūras
xHeliOSSetup ();
pinMode (LED_BUILTIN, OUTPUT);
pinMode (ledPin, OUTPUT);
// inicializēt spiedpogas tapu kā ievadi:
pinMode (buttonPin, INPUT);
// Pievienojiet un pēc tam palaidiet taskBlink
id = xTaskAdd ("TASKBLINK", & taskBlink);
xTaskWait (id);
// taimera intervāls “id”
xTaskSetTimer (id, 1000000);
id = xTaskAdd ("BUTTON", & buttonRead);
xTaskStart (id);
void loop ()
// Tas un tikai tas vienmēr ir ciklā, lietojot Helios
xHeliosLoop ();
Izmantojot šo kodu, jūs varat ieprogrammēt LED mirgot jebkurā laikā, neuztraucoties par Arduino aizkavēšanos.
Secinājums
Šis projekts ir lieliski piemērots cilvēkiem, kuri ir jauni Arduino, jo tas ļauj izmantot parasto Arduino kodu reāllaika uzdevumu apstrādei. Tomēr šajā rakstā aprakstītā metode ir paredzēta tikai hobijiem un pētniekiem. Nopietnākiem projektiem ir nepieciešamas citas metodes.