Arduino · 2 agosto 2012 17

looper, uno schedulatore software per Arduino

Dopo aver rilasciato il leOS, mi è stato fatto notare che spesso alcune librerie di terzi usano il timer 2, risultando incompatibili con leOS. Altri mi hanno chiesto uno schedulatore più semplice, sempre indipendente dai timer/interrupt del microcontrollore.
Rielaborando il core del leOS è nato looper (che si potrebbe tradurre in un orrido “ciclicatore”), che altro non è se non una routine che esegue ad intervalli prefissati altre sub-routine. looper non usa timer o interrupt ma si basa esclusivamente sulla funzione millis() di Arduino.

A differenza di leOS, va richiamato manualmente all’interno del ciclo principale del proprio sketch ma, rispetto ad esso, consuma meno risorse ed è indipendente dall’hardware, potendo essere compilato su ogni microcontrollore supportato dall’IDE di Arduino.

Per usare looper, scaricate il pacchetto che trovate in fondo all’articolo e scompattatelo all’interno della vostra cartella delle librerie (/home/utente/sketchbook/libraries su Linux, \Documenti\Arduino\libraries su Windows). Fatto questo, includete il core di looper all’inizio del vostro sketch e create una nuova istanza della libreria:

#include "looper.h"
 looper myScheduler;

Fatto questo, siete pronti ad usare looper. Looper mette a disposizione questi 4 metodi per gestire i compiti, che nel looper si chiamano “jobs”:

myScheduler.addJob(funzione, intervallo_in_ms[, ONE_TIME]);
 myScheduler.removeJob(funzione);
 myScheduler.pauseJob(funzione);
 myScheduler.restartJob(funzione);

La sintassi è identica a quella dei corrispondenti metodi di leOS con la differenza che “Task” è stato sostituito da Job per far capire che nel looper le funzioni da eseguire non sono indipendenti dal codice principale (nel leOS esse sono eseguite da uno scheduler gestito da un interrupt). Con .addJob si aggiunge allo scheduler un nuovo job indicato da “funzione”, con un intervallo di esecuzione specificato da “intervallo_in_ms”. L’aggiunta del parametro opzionale ONE_TIME indica a looper che questo task deve essere eseguito 1 volta sola e poi eliminato.

.removeJob elimina il task indicato, mentre .pauseJob e .restartJob rispettivamente mettono in pausa e riavviano un determinato job.
Per far lavorare looper basta aggiungere la chiamata al metodo .scheduler() in qualunque parte del loop principale:

void loop() {
 ...
 myScheduler.scheduler();
 }

Una importante caratteristica di looper è il metodo .myDelay() che permette di fermare l’esecuzione del codice contenuto nel loop() senza fermare l’esecuzione dei job che sono presenti nello scheduler. Per usare questa funzione basta sostituire la funzione delay() di Arduino con .myDelay():

...
 myScheduler.myDelay(intervallo in ms);
 ...

Visto che looper non si basa sugli interrupt, la sua precisione dipende totalmente dalla durata del loop principale. looper funziona bene se il loop principale ha una durata inferiore a quella del task con il tempo di intervallo più breve perché altrimenti il task verrà eseguito non alla scadenza prefissata ma dopo il loop principale. looper non viene invocato automaticamente ma solo manualmente: è in pratica una routine come tutte le altre che richiama altre routine.

Corredano la libreria diversi esempi che mostrano l’utilizzo di looper.

[notice]Il codice basato sulla precedente versione di looper deve essere aggiornato per renderlo compatibile con la nuova sintassi dei metodi.[/notice]

[important]NOTA PER GLI UTENTI DI leOS:
a partire dalla versione 1.0.0, looper può essere utilizzato abbinato al leOS: uno degli esempi allegati mostra proprio questa possibilità.[/important]

Looper
Looper
looper_1.1.1.zip
Version: 1.1.1
150.1 KiB
3438 Downloads
Dettagli...