Arduino

HeliOS per Arduino

HeliOS per Arduino
I microcontrollori di un Arduino utilizzano un unico programma per controllare tutti gli interruttori, i LED e altre parti del sistema. Il primo programma appreso da un utente Arduino è in genere il programma "Blink", che utilizza la funzione di ritardo per accendere e spegnere un LED in uno schema uniforme. Questo semplice programma può essere esteso per fare molte cose, ma non può includere il multitasking.

Per progetti più avanzati, è necessario modificare i valori e leggere i dati in tempo reale, cosa non possibile con la funzione di ritardo standard in Arduino. Pertanto, è necessaria una soluzione diversa. Fortunatamente, HeliOS può aiutare.

I limiti di Arduino

Come accennato nell'introduzione, il linguaggio standard di un Arduino può essere applicato in molti modi. Tuttavia, c'è un problema: Arduino non può multitasking multi. Ad esempio, non è possibile impostare tre LED diversi in modo che lampeggino a intervalli indipendenti. Questa operazione non può essere eseguita perché, se si utilizza il ritardo, il LED con il ritardo più lungo bloccherà il lampeggio degli altri LED in attesa di cambiare stato.

Anche il polling standard è problematico, poiché il controllo dello stato di un pulsante richiede un'azione da intraprendere. In un Arduino standard, devi impostare una funzione per interrogare lo stato di un interruttore o di qualsiasi altro stato.

Mentre ci sono soluzioni per affrontare questi problemi (e.g., interruzioni hardware, la funzione millis, l'implementazione di FreeRTOS), ma anche queste soluzioni hanno dei limiti. Per superare i problemi di queste soluzioni, Mannie Peterson ha inventato HeliOS. HeliOS è piccolo ed efficiente e può funzionare anche su controller a 8 bit.

Considera il codice seguente, che nella migliore delle ipotesi è inaffidabile perché l'istruzione di ritardo impedirà il controllo del pulsante.

int pulsantePin = 2; // il numero del pin del pulsante
int ledPin = 4; // il numero del pin LED
// le variabili cambieranno:
int buttonState = 0; // variabile per la lettura dello stato del pulsante
void setup()
// inizializza il pin LED come output:
pinMode(ledPin, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
// inizializza il pin del pulsante come input:
pinMode(buttonPin, INPUT);

ciclo vuoto()
// legge lo stato del valore del pulsante:
buttonState = digitalRead(buttonPin);
// controlla se il pulsante è premuto. Se lo è, il buttonState è ALTO:
if (Statopulsante == HIGH)
digitalWrite(ledPin, HIGH); // accendi il LED
altro
digitalWrite(ledPin, LOW); // spegni il LED

digitalWrite(LED_BUILTIN, HIGH); // accendi il LED (HIGH è il livello di tensione)
ritardo(1000); // aspetta un secondo
digitalWrite(LED_BUILTIN, LOW); //spegnere il LED rendendo la tensione BASSA
ritardo(1000); // aspetta un secondo

Quando esegui questo codice vedrai che il 'ledPin' lampeggerà normalmente. Tuttavia, quando si preme il pulsante, non si accenderà o, in caso affermativo, ritarderà la sequenza di lampeggio. Per far funzionare questo programma, puoi passare ad altri metodi di ritardo; tuttavia, HeliOS fornisce un'alternativa.

Linux integrato su Arduino (HeliOS)

Nonostante il “OS” nel nome, HeliOS non è un sistema operativo: è una libreria di funzioni multitasking. Tuttavia, implementa 21 chiamate di funzione che possono semplificare complesse attività di controllo. Per le attività in tempo reale, il sistema deve gestire le informazioni esterne man mano che vengono ricevute. Per fare ciò, il sistema deve essere in grado di multitasking.

È possibile utilizzare diverse strategie per gestire le attività in tempo reale: strategie basate sugli eventi, strategie bilanciate in fase di esecuzione e strategie di notifica delle attività. Con HeliOS, puoi utilizzare una di queste strategie con chiamate di funzione.

Come FreeRTOS, HeliOS migliora le capacità multitasking dei controller. Tuttavia, gli sviluppatori che stanno pianificando un progetto complesso di importanza critica devono utilizzare FreeRTOS o qualcosa di simile perché HeliOS è destinato all'uso da parte di appassionati e hobbisti che desiderano esplorare la potenza del multitasking.

Installazione di HeliOS

Quando si utilizzano le librerie Arduino, è possibile installare nuove librerie con l'IDE. Per le versioni 1.3.5 e versioni successive, scegli di utilizzare il Gestore della libreria.


In alternativa, puoi scaricare un file zip dalla pagina web e utilizzare quel file per installare HeliOS.


Si prega di notare che è necessario includere HeliOS nel codice prima di poter iniziare a usarlo.

Esempio

Il codice seguente può essere utilizzato per far lampeggiare un LED una volta al secondo. Sebbene abbiamo aggiunto il codice HeliOS, l'effetto finale è lo stesso del tutorial introduttivo.

La differenza principale qui è che devi creare un'attività. Questa attività viene messa in uno stato di attesa e un timer è impostato per dire all'attività quando deve essere eseguita. Inoltre, il ciclo contiene solo un'istruzione: xHeliOSLoop(). Questo ciclo esegue tutto il codice definito nel setup() del codice. Quando pianifichi il tuo codice, devi impostare tutti i pin, le costanti e le funzioni nell'impostazione superiore.

#includere
//Utilizzato per memorizzare lo stato del LED
volatile int ledState = 0;
volatile int buttonState = 0;
const int buttonPin = 2;
const int ledPin = 4;
// Definisci un compito lampeggiante
void taskBlink(xTaskId id_)
if (ledState)
digitalWrite(LED_BUILTIN, LOW);
stato led = 0;
altro
digitalWrite(LED_BUILTIN, HIGH);
stato led = 1;



// Definisce un'attività di lettura del pulsante
void buttonRead(xTaskId id_)
buttonState = digitalRead(buttonPin);
// controlla se il pulsante è premuto. Se lo è, il buttonState è ALTO:
if (Statopulsante == HIGH)
// accendi il LED:
digitalWrite(ledPin, HIGH);
altro
//spegne il LED:
digitalWrite(ledPin, LOW);


void setup()
// id tiene traccia delle attività
xTaskId id = 0;
// Questo inizializza le strutture dati di Helios
xHeliOSSetup();
pinMode(LED_BUILTIN, OUTPUT);
pinMode(ledPin, OUTPUT);
// inizializza il pin del pulsante come input:
pinMode(buttonPin, INPUT);
// Aggiungi e poi fai attendere taskBlink
id = xTaskAdd("TASKBLINK", &taskBlink);
xTaskWait(id);
// Intervallo del timer per 'id'
xTaskSetTimer(id, 1000000);
id = xTaskAdd("BUTTON", &buttonRead);
xTaskStart(id);

ciclo vuoto()
//Questo, e solo questo, è sempre nel ciclo quando si usa Helios
xHeliosLoop();

Con questo codice, puoi programmare il LED in modo che lampeggi in qualsiasi momento senza doversi preoccupare che Arduino venga ritardato.

Conclusione

Questo progetto è ottimo per le persone che non conoscono Arduino, in quanto ti consente di utilizzare il normale codice Arduino per gestire attività in tempo reale. Tuttavia, il metodo descritto in questo articolo è solo per hobbisti e ricercatori. Per progetti più seri, sono necessari altri metodi.

Come cambiare i pulsanti sinistro e destro del mouse su PC Windows 10
È abbastanza normale che tutti i mouse dei computer siano progettati ergonomicamente per gli utenti destrimani. Ma sono disponibili dispositivi mouse ...
Emula i clic del mouse passando il mouse utilizzando il mouse senza clic in Windows 10
L'uso di un mouse o di una tastiera nella postura sbagliata di un uso eccessivo può causare molti problemi di salute, tra cui tensione, sindrome del t...
Aggiungi i gesti del mouse a Windows 10 utilizzando questi strumenti gratuiti
Negli ultimi anni computer e sistemi operativi si sono notevolmente evoluti greatly. C'è stato un tempo in cui gli utenti dovevano usare i comandi per...