Haladóbb projekteknél meg kell változtatnia az értékeket és valós időben kell adatokat olvasnia, ami nem lehetséges az Arduino standard késleltetési funkciójával. Ezért más megoldásra van szükség. Szerencsére a HeliOS segíthet.
Az Arduino korlátai
Amint a bevezetőben említettük, az Arduino szokásos nyelve sokféleképpen alkalmazható. Van azonban egy probléma: az Arduino nem tud multitaskolni. Például nem állíthat be három különböző LED-et független időközönként villogni. Ez a feladat nem hajtható végre, mert ha késleltetést használ, a leghosszabb késleltetésű LED blokkolja a többi LED villogását, miközben az állapotváltásra vár.
A szokásos közvélemény-kutatás is problémás, mivel egy gomb állapotának ellenőrzése műveletet igényel. Egy szokásos Arduino alkalmazásban be kell állítania egy funkciót egy kapcsoló vagy bármely más állapot lekérdezéséhez.
Bár vannak megoldások e kérdések kezelésére (pl.g., hardver megszakítja, a millis funkció, a FreeRTOS megvalósítás), de ezeknek a megoldásoknak is vannak korlátai. E megoldások problémáinak leküzdésére Mannie Peterson feltalálta a HeliOS-t. A HeliOS kicsi és hatékony, sőt 8 bites vezérlőkön is képes futtatni.
Vegye figyelembe az alábbi kódot, amely legjobb esetben sem megbízható, mert a késleltetési utasítás megakadályozza a gomb ellenőrzését.
int gombPin = 2; // a nyomógomb csapszámaint ledPin = 4; // a LED-csap száma
// változók megváltoznak:
int buttonState = 0; // változó a nyomógomb állapotának leolvasásához
void setup ()
// inicializálja a LED csapot kimenetként:
pinMode (ledPin, OUTPUT);
pinMode (LED_BUILTIN, OUTPUT);
// inicializálja a nyomógomb csapot bemenetként:
pinMode (buttonPin, INPUT);
void loop ()
// beolvassa a nyomógomb értékének állapotát:
buttonState = digitalRead (buttonPin);
// ellenőrizze, hogy megnyomta-e a nyomógombot. Ha igen, a buttonState HIGH:
if (buttonState == HIGH)
digitalWrite (ledPin, HIGH); // kapcsolja be a LED-et
más
digitalWrite (ledPin, LOW); // kapcsolja ki a LED-et
digitalWrite (LED_BUILTIN, HIGH); // kapcsolja be a LED-et (HIGH a feszültségszint)
késés (1000); // várj egy másodpercet
digitalWrite (LED_BUILTIN, LOW); // kapcsolja ki a LED-et úgy, hogy a feszültség LOW legyen
késés (1000); // várj egy másodpercet
Amikor futtatja ezt a kódot, látni fogja, hogy a 'ledPin' normálisan villog. Amikor azonban megnyomja a gombot, nem világít, vagy ha igen, akkor késlelteti a villogást. A program működése érdekében válthat más késleltetési módszerekre; a HeliOS azonban alternatívát nyújt.
Linux beágyazva az Arduino-ra (HeliOS)
A nevében szereplő „operációs rendszer” ellenére a HeliOS nem operációs rendszer: többfeladatos függvénykönyvtár. Ugyanakkor megvalósít 21 függvényhívást, amelyek egyszerűbbé tehetik az összetett vezérlési feladatokat. Valós idejű feladatok elvégzéséhez a rendszernek a beérkezéskor kezelnie kell a külső információkat. Ehhez a rendszernek képesnek kell lennie arra, hogy több feladatot végezzen.
A valós idejű feladatok kezelésére számos stratégia használható: eseményvezérelt stratégiák, futásidejű kiegyensúlyozott stratégiák és feladat-értesítési stratégiák. A HeliOS segítségével e stratégiák bármelyikét alkalmazhatja függvényhívásokkal.
A FreeRTOS-hoz hasonlóan a HeliOS is fokozza a vezérlők multitasking képességeit. Azonban azoknak a fejlesztőknek, akik kritikus fontosságú komplex projektet terveznek, a FreeRTOS-t vagy valami hasonlót kell használniuk, mivel a HeliOS-t olyan rajongók és hobbisták használják, akik szeretnék felfedezni a multitasking erejét.
A HeliOS telepítése
Az Arduino könyvtárak használatakor új könyvtárak telepíthetők az IDE segítségével. 1. verzió esetén.3.Az 5-ös vagy újabb verziónál válassza a Library Manager alkalmazást.
Alternatív megoldásként letölthet egy zip fájlt a weboldalról, és ezzel a fájllal telepítheti a HeliOS-t.
Felhívjuk figyelmét, hogy a HeliOS használatát a kódba be kell illesztenie, mielőtt elkezdené használni.
Példa
Az alábbi kód segítségével a LED másodpercenként egyszer villoghat. Bár hozzáadtuk a HeliOS kódot, a végső hatás megegyezik a bevezető bemutatóéval.
A fő különbség itt az, hogy létre kell hoznia egy feladatot. Ez a feladat várakozási állapotba kerül, és egy időzítő van beállítva, hogy megmondja a feladatnak, hogy mikor kell futtatni. Ezenkívül a ciklus csak egy utasítást tartalmaz: xHeliOSLoop (). Ez a hurok futtatja a kód beállításában () definiált összes kódot. Amikor megtervezi a kódot, meg kell adnia az összes csapot, állandót és funkciót a legfelső beállításban.
#include// A LED állapotának tárolására szolgál
volatile int ledState = 0;
volatile int buttonState = 0;
const int gombPin = 2;
const int ledPin = 4;
// Definiál egy villogó feladatot
void taskBlink (xTaskId id_)
if (ledState)
digitalWrite (LED_BUILTIN, LOW);
ledState = 0;
más
digitalWrite (LED_BUILTIN, HIGH);
ledState = 1;
// Definiáljon egy gombolvasási feladatot
void buttonRead (xTaskId id_)
buttonState = digitalRead (buttonPin);
// ellenőrizze, hogy megnyomta-e a nyomógombot. Ha igen, a buttonState HIGH:
if (buttonState == HIGH)
// bekapcsolja a LED-et:
digitalWrite (ledPin, HIGH);
más
// a LED kikapcsolása:
digitalWrite (ledPin, LOW);
void setup ()
// id nyomon követi a feladatokat
xTaskId id = 0;
// Ez inicializálja a Helios adatstruktúrákat
xHeliOSSetup ();
pinMode (LED_BUILTIN, OUTPUT);
pinMode (ledPin, OUTPUT);
// inicializálja a nyomógomb csapot bemenetként:
pinMode (buttonPin, INPUT);
// Add hozzá, majd várj a taskBlink-re
id = xTaskAdd ("TASKBLINK", & taskBlink);
xTaskWait (id);
// Időzítő intervalluma az „id” számára
xTaskSetTimer (id, 1000000);
id = xTaskAdd ("GOMB", & buttonRead);
xTaskStart (id);
void loop ()
// Ez, és csak ez, mindig a hurokban van a Helios használatakor
xHeliosLoop ();
Ezzel a kóddal bármikor beprogramozhatja a LED villogását anélkül, hogy aggódnia kellene az Arduino késése miatt.
Következtetés
Ez a projekt nagyszerű azok számára, akik újak az Arduino számára, mivel lehetővé teszi a szokásos Arduino kód használatát valós idejű feladatok kezeléséhez. A cikkben leírt módszer azonban csak hobbistáknak és kutatóknak szól. Komolyabb projektek esetében más módszerekre van szükség.