cosa fa arduino? (menu, loop in parallelo, ecc) + quale libro acquistare

Buongiorno a tutti, come avrete letto dal titolo, chiedo delle precisazioni circa le potenzialità di questa piattaforma (nb. per ora non ho acquistato nessuna scheda e ho programmato solo in C).

Sebbene la domanda possa apparire ai più come banale, per me è importante sapere se con arduino è possibile:
1)creare un menu di scelta dei loop da eseguire (per esempio usando lo Switch, e scegliendo la preferenza tramite pressione di pulsanti fisici, magari anche con l’aiuto di un display).
2)svolgere attività contemporaneamente (avviare un loop che si terminerà autonomamente al verificarsi di un evento, tornare al menu e nel frattempo avviarne un altro).
3) se in definitiva valgono le stesse librerie di C, oltre quelle specifiche della scheda.

Inoltre vorrei un consiglio su quale libro acquistare per studiare le librerie di Arduino e dei sensori disponibili (nb. vorrei un libro di livello universitario, non voglio una semplice visione panoramica)

Grazie e a presto !!! :grin:

Io lo sto implementando e mi funziona al 90%, ho fiducia di poterlo mettere a punto. Parlo del classico "4 pulsanti" funzionante in modo tale che alla pressione prolungata di uno di essi venga invocata una funzione di accensione del sistema, a una pressione più prolungata venga spento e con una pressione più breve ancora, si entri in modo navigazione (UP/DOWN/OK).

Come in questi casi in cui manca un SO realmente multitasking ho implementato tutto con una FSM con quattro task; la pulsantiera è affidata al secondo, con una temporizzazione di 250 ms che mi pare abbastanza reattiva sotto le dita. Ma credo che sia lo stesso possibile senza FSM, basta registrare i tempi in corrispondenza di ciascun evento e chiamare i metodi opportuni.

arkeo2001: Come in questi casi in cui manca un SO realmente multitasking ho implementato tutto con una FSM con quattro task; la pulsantiera è affidata al secondo, con una temporizzazione di 250 ms che mi pare abbastanza reattiva sotto le dita.

Ecco appunto, anche io avevo pensato che l'unico modo è tenere la cpu in ascolto con queste modalità. Cosa intendi con FSM? I 4 task di cui parli sono dei Loop (non annidati) ?

Grazie per aver risposto :)

E' l'acronimo di Finite State Machine ed era il modo di realizzare un apparente multitasking sui primi mainframe. Tuttora si può implementare quando non c'è un SO realmente multitasking e occorre in qualche modo avere un effetto almeno simile.

In pratica il trhead da implementare viene scomposto in una serie di passi all'interno di una funzione. Questa funzione ha una variabile statica contatore che ricorda dove si è arrivati e ritorna 0 se si è alla fine o altro valore se no. Questo "thread" viene chiamato da uno schedulatore che a turno chiama tutti i task e in questo modo si ottiene l'effetto.

Di fatto ogni thread viene fatto avanzare a turno: più frammenti la funzione più il tutto dovrebbe risultare in un'esecuzione con blocchi sempre più brevi.

Se da un lato c'è lo svantaggio che non è un vero multitasking, dall'altro non ci sono problemi di accesso alle variabili, semafori, mutex e compagnia bella. Sei "per definizione" sicuro che non possono esserci tentativi di "accesso simultaneo" ad alcuna variabile o funzione che sia.

Ti copincollo un paio di routines da cui si vede grossomodo come almeno io ho fatto (copiando il codice di un amico, dato che non sapevo niente di questo sistema). Manca qualche passaggio perché chiamo i task con puntatori a funzioni che stanno in altre parti del mio progetto ma credo che quanto sotto sia sufficiente ad avere un'idea.

NB: non sono un programmatore, sono uno sciacquino e quindi ci sono un sacco di "ingenuità" e goffaggini, quindi mi aspetto che tutto sia ampiamente migliorabile. Per quel che serve a me mi basta...

ciao!

Apx

@arkeo2001 : Come da regolamento (che dovresti aver letto), punto 7, il codice DEVE essere racchiuso tra i tag CODE (… è il bottone a sinistra fatto così : </>) … quindi cortesemente edita il tuo post e sistemalo.

Poi, in generale … sarebbe il caso che “dimenticaste” tutto ciò che avete appreso su PC e grosse CPU :grin: … qui siete su una MCU che ha 32 KB per il codice e … solo 2 miseri KB di SRAM … quindi … tutte le belle teorie del multitasking vanno a farsi friggere.

Quello che si può fare è un banalissimo scheduler che, magari usando il watchdog (per non rubare alcuna delle già poche risorse) lanci delle “funzioni”.

Magari vi può essere utile dare un’occhiata a QUESTA libreria di Leo :wink:

Guglielmo

gpb01:
@arkeo2001 : Come da regolamento (che dovresti aver letto), punto 7, il codice DEVE essere racchiuso tra i tag CODE (… è il bottone a sinistra fatto così : </>) … quindi cortesemente edita il tuo post e sistemalo.

Non vedo alcun bottone né altro che possa permettermi di formattare il testo; ho eliminato il codice tanto non è granché interessante.

arkeo2001: Non vedo alcun bottone né altro che possa permettermi di formattare il testo; ho eliminato il codice tanto non è granché interessante.

Invece di fare un "quick reply", bisogna fare "reply", smaschera l'editor completo...

Quando entri in “edit” del post, il primo bottone che hai a sinistra è fatto così : </> … è quello che inserisce i tag CODE … come descritto nel regolamento al punto 7 (cambia solo la posizione e l’icona del bottone, ma il senso è sempre quello).

Guglielmo

Vero, ora lo vedo... e grazie per la spiegazione, terrò presente per eventuale prossima volta :)

Arduino usa un 8 bit controller con 16 Mhz di clock. Non so che etá hai. se conosci il vecchio Vic20 Commodore. Siamo a quei livelli come memoria ma é un po piú veloce. Visto che lo programiamo in C e alcune librerie specifiche Arduino non sono un esempio lampante di programmazione mirata alla velocitá non raggiunge la velocitá di un 6502 programmato in assembler.

Arduino visto che usa il compilatore originale della Ditta produtrice del Controller conosce tutte le librerie/funzioni del C e una parte del C++

Visto la memoria RAM ridotta é altamente sconsigliato l' uso di stringhe.

Non ha supporto di multitasking. Se devi avere 2 cose che funzionano quasi in paralello devi programmarlo Tu in modo che questo funzioni bene.

Riguadra sensori: molti sensori e integrati / hardware in comercio sono stati usati con Arduino ed percui qualcuno ha pubbicato una libreria per la gestione di quel Pezzo con Arduino. Basta cercare.

Ciao Uwe

Grazie Uwe, quindi ipotizzando di voler costruire una macchinetta radiocomandata potrei annidare il loop della sterzata dentro il loop dell'accelerazione.

Ogni loop funzionerà così: [PSEUDOCODICE]:

loop acceleratore () {
         SE (acceleratore==1)  {darà corrente al motore;}
           ELSE continua;
                  loop sterzo(){
                        SE (sterzo==-1) {gira a sinistra usando un servo;}
                        SE (sterzo==1) {gira a destra usando un servo;}
                        ELSE continua;}
    }

e poi ripete il ciclo. Se poi volessi accendere dei led colorati, dovrei aggiungerli ad esempio a fine loop, così la cpu controlla se è arrivato l'input di accensione.

Posso comprare una board e cominciare a sperimentare, grazie ancora ragazzi :)

C'è un loop principale che viene eseguito sempre. Dentro questo loop principale puoi mettere i vari IF che rimandano alle relative funzioni.

void loop()
{
 ...
 if (acceleratore == 1)
   {
     accelera();
     accendiled1();
     ...
    }

if (sterzo != 0)
   {
     leggiangolo();
     gira();
   }

}

... il tutto sperando che siano funzioni poco o nulla bloccanti. Sarà che mi ci sto dannando questi giorni ma programmare questi aggeggi è tutt'altro che banale.

arkeo2001: ... il tutto sperando che siano funzioni poco o nulla bloccanti. Sarà che mi ci sto dannando questi giorni ma programmare questi aggeggi è tutt'altro che banale.

Vero. E ringrazia che dietro c'e' una parte del codice (incluso di nascosto) che si incarica di inizializzare l'hardware e altre cosette. Se provi a mettere le mani su altre MCU, meno "semplici" di Arduino, ti spaventi. Stiamo parlando di "aggeggi" e programmazione a "basso livello", di sicuro non semplice.

Ritengo fuorviante/errata la spiegazione data di una macchina a stati finiti

Testato: Ritengo fuorviante/errata la spiegazione data di una macchina a stati finiti

Peggio, è totalmente sbagliata visto che ha fatto un mix tra macchina a stati finiti e sistema real time, sopratutto la macchina a stati finiti non ha nulla a che vedere con il real time o uno schedulatore. Per inciso i primi mainframe disponevano di sistema operativi multi tasking, p.e. l'IBM 360 usava OS/360 che, a seconda della versione, aveva capacità multitasking con numero fisso, o variabile, di task. In tutto questo le macchine a stati finiti non c'entrano nulla in quanto sono solo dei percorsi dove l'out è determinato dallo stato, macchina di Moore, oppure dallo stato e dagli input, macchina di Mealy.