For mer avanserte prosjekter, må du endre verdier og lese data i sanntid, noe som ikke er mulig med standard forsinkelsesfunksjon i Arduino. Derfor er det behov for en annen løsning. Heldigvis kan HeliOS hjelpe.
Begrensningene til Arduino
Som nevnt i innledningen kan standardspråket til en Arduino brukes på mange måter. Imidlertid er det et problem: Arduino kan ikke multitaske. For eksempel kan du ikke stille tre forskjellige lysdioder til å blinke med uavhengige intervaller. Denne oppgaven kan ikke utføres fordi hvis du bruker forsinkelse, vil lysdioden med lengst forsinkelse blokkere blinkingen av de andre lysdiodene mens du venter på å bytte tilstand.
Standard avstemning er også plagsom, da det å sjekke tilstanden til en knapp krever at det blir gjort noe. I en standard Arduino, må du sette opp en funksjon for å avstemme tilstanden til en bryter eller en hvilken som helst annen tilstand.
Mens det er løsninger for å løse disse problemene (f.eks.g., maskinvareforstyrrelser, millis-funksjonen, FreeRTOS-implementeringen), men disse løsningene har også begrensninger. For å overvinne problemene med disse løsningene, oppfant Mannie Peterson HeliOS. HeliOS er liten og effektiv, og den kan til og med kjøre på 8-biters kontrollere.
Tenk på koden nedenfor, som i beste fall er upålitelig fordi forsinkelsen vil forhindre at knappen blir sjekket.
int buttonPin = 2; // nummeret på trykknappenint ledPin = 4; // nummeret på LED-pinnen
// variabler endres:
int buttonState = 0; // variabel for å lese trykknappens status
ugyldig oppsett ()
// initialiser LED-pinnen som en utgang:
pinMode (ledPin, OUTPUT);
pinMode (LED_BUILTIN, OUTPUT);
// initialiser trykknappstiften som en inngang:
pinMode (buttonPin, INPUT);
ugyldig sløyfe ()
// les tilstanden til trykknappverdien:
buttonState = digitalRead (buttonPin);
// sjekk om trykknappen er trykket. Hvis den er, er buttonState HIGH:
hvis (buttonState == HIGH)
digitalWrite (ledPin, HIGH); // slå på LED
annet
digitalWrite (ledPin, LOW); // slå LED av
digitalWrite (LED_BUILTIN, HIGH); // slå lysdioden på (HØY er spenningsnivået)
forsinkelse (1000); // vent litt
digitalWrite (LED_BUILTIN, LOW); // slå av LED-lampen ved å gjøre spenningen LAV
forsinkelse (1000); // vent litt
Når du kjører denne koden, vil du se at 'ledPin' vil blinke normalt. Når du trykker på knappen, vil den imidlertid ikke lyse, eller hvis den gjør det, vil den forsinke blinksekvensen. For å få dette programmet til å fungere, kan du bytte til andre forsinkelsesmetoder; imidlertid gir HeliOS et alternativ.
Linux innebygd på Arduino (HeliOS)
Til tross for "OS" i navnet, er HeliOS ikke et operativsystem: det er et bibliotek med multitasking-funksjoner. Imidlertid implementerer den 21 funksjonsanrop som kan forenkle komplekse kontrolloppgaver. For sanntidsoppgaver må systemet håndtere ekstern informasjon etter hvert som den mottas. For å gjøre det må systemet kunne multitaske.
Flere strategier kan brukes til å håndtere sanntidsoppgaver: hendelsesdrevne strategier, balanserte strategier og oppgavevarslingsstrategier. Med HeliOS kan du bruke noen av disse strategiene med funksjonsanrop.
I likhet med FreeRTOS forbedrer HeliOS multitasking-mulighetene til kontrollere. Imidlertid må utviklere som planlegger et komplekst prosjekt av kritisk betydning, bruke FreeRTOS eller noe lignende fordi HeliOS er ment for bruk av entusiaster og hobbyister som vil utforske kraften til multitasking.
Installere HeliOS
Når du bruker Arduino-bibliotekene, kan nye biblioteker installeres med IDE. For versjoner 1.3.5 og over velger du å bruke Library Manager.
Alternativt kan du laste ned en zip-fil fra nettsiden, og bruke den filen til å installere HeliOS.
Vær oppmerksom på at du må inkludere HeliOS i koden din før du kan begynne å bruke den.
Eksempel
Koden nedenfor kan brukes til å få en LED til å blinke en gang per sekund. Selv om vi har lagt til HeliOS-kode, er den endelige effekten den samme som den introduksjonsveiledningen.
Hovedforskjellen her er at du må opprette en oppgave. Denne oppgaven settes i ventetilstand, og en tidtaker er satt til å fortelle oppgaven når den skal kjøres. I tillegg inneholder sløyfen bare ett utsagn: xHeliOSLoop (). Denne sløyfen kjører all koden som er definert i oppsettet () av koden. Når du planlegger koden din, må du sette alle pinner, konstanter og funksjoner i toppinnstillingen.
#inkludere// Brukes til å lagre tilstanden til lysdioden
flyktig int ledet stat = 0;
flyktig int buttonState = 0;
const int buttonPin = 2;
const int ledPin = 4;
// Definer en blinkoppgave
ugyldig taskBlink (xTaskId id_)
hvis (ledState)
digitalWrite (LED_BUILTIN, LOW);
ledState = 0;
annet
digitalWrite (LED_BUILTIN, HIGH);
ledState = 1;
// Definer en knappeleseoppgave
ugyldig buttonRead (xTaskId id_)
buttonState = digitalRead (buttonPin);
// sjekk om trykknappen er trykket. Hvis den er, er buttonState HIGH:
hvis (buttonState == HIGH)
// slå på LED:
digitalWrite (ledPin, HIGH);
annet
// slå av LED:
digitalWrite (ledPin, LOW);
ugyldig oppsett ()
// id holder rede på oppgaver
xTaskId id = 0;
// Dette initialiserer Helios datastrukturer
xHeliOSSetup ();
pinMode (LED_BUILTIN, OUTPUT);
pinMode (ledPin, OUTPUT);
// initialiser trykknappstiften som en inngang:
pinMode (buttonPin, INPUT);
// Legg til og la deretter taskBlink vente
id = xTaskAdd ("TASKBLINK", & taskBlink);
xTaskWait (id);
// Tidsintervall for 'id'
xTaskSetTimer (id, 1000000);
id = xTaskAdd ("KNAPP", & buttonRead);
xTaskStart (id);
ugyldig sløyfe ()
// Dette, og bare dette, er alltid i løkken når du bruker Helios
xHeliosLoop ();
Med denne koden kan du programmere LED-en til å blinke når som helst uten å måtte bekymre deg for at Arduino blir forsinket.
Konklusjon
Dette prosjektet er flott for folk som er nye i Arduino, da det lar deg bruke den vanlige Arduino-koden til å håndtere sanntidsoppgaver. Metoden beskrevet i denne artikkelen er imidlertid kun for hobbyister og forskere. For mer seriøse prosjekter er andre metoder nødvendige.