Scopriamo le macchine a stati finiti, utili in automazione e hobbistica per un design chiaro e semplice, fondamentale in elettronica e automazione industriale.
Una macchina a stati finiti (FSM dall’inglese finite state machine) o automa a stati finiti (ASF o FSA dall’inglese finite state automaton) è un modello che è in grado di descrivere efficacemente il comportamento di un sistema che presenta un numero finito di stati e che in ogni istante si può trovare in uno solo di essi definito con il termine stato corrente; il sistema può passare da uno stato all’altro solo se si verificano determinate condizioni e tale passaggio viene definito con il termine transizione.
Le macchine a stati finiti nella vita quotidiana
Un modello di questo tipo è molto diffuso in ambito scientifico in quanto il modo di procedere risulta sempre caratterizzato da semplicità e chiarezza; è applicabile in particolar modo anche nel settore dell’automazione industriale. L’impiego di una progettazione basata sul concetto di macchina a stati finiti consente infatti di realizzare più facilmente apparati elettronici e sistemi. Il metodo, una volta acquisito, può anche essere utilizzato dai maker (hobbisti tecnologici) che, grazie all’avvento di schede come Arduino, coprono un settore che è sempre più praticato anche da coloro che non posseggono conoscenze approfondite in ambito elettronico/informatico o che, addirittura, partono da zero.
Anche chi ha un minimo di conoscenze di base spesso non si accorge che le macchine a stati finiti sono costantemente presenti nella vita quotidiana; si citano come esempi l’ascensore, la lavatrice, il distributore automatico di bibite o di merendine, il semaforo, il cancello automatico. Visto come macchina a stati finiti l’ascensore può ad esempio essere considerato come un automa che presenta un numero di stati pari a quello dei piani; la transizione da uno stato all’altro viene definita dai pulsanti di chiamata posti ai piani e dai pulsanti che si trovano all’interno della cabina.
Uno strumento grafico fondamentale: il diagramma degli stati
Una macchina a stati finiti si può definire utilizzando un diagramma degli stati che può essere descritto graficamente attraverso un grafo orientato.
Un grafo orientato (Fig. 1) è una struttura che viene nella maggior parte dei casi rappresentata da un numero finito di cerchi (nodi) e da un numero finito di archi provvisti di freccia (archi orientati) che collegano ciascun nodo agli altri nodi; gli archi dei grafi orientati hanno una direzione.

I nodi rappresentano gli stati a cui vengono associate le azioni da implementare all’interno degli stati stessi (ad esempio l’accensione di una lampada o l’avviamento di un motore); gli archi (talvolta sostituiti con tratti rettilinei anch’essi orientati) definiscono le condizioni per le quali si verificano le transizioni di stato causate da eventi esterni (ad esempio la pressione di un pulsante).
Progetto: metodologie
Dopo questa breve introduzione si prosegue con la descrizione del procedimento che consente la realizzazione di una macchina a stati (lo schema sintetico viene riportato in Fig. 2).

È comunque bene precisare subito che il passaggio che dall’analisi del problema porta alla definizione del grafo orientato è praticamente indipendente dal tipo di ambiente di sviluppo che viene utilizzato e assume pertanto validità generale. Dall’analisi del problema si ricavano il numero di stati dell’automa, le condizioni necessarie per passare da uno stato ad un altro e, di conseguenza, il grafo orientato. Il passo successivo, quello che consente di creare un legame tra diagramma degli stati e codice, dipende in parte dall’ambiente di sviluppo scelto; si procede di seguito facendo riferimento ad una scheda Arduino, quella più utilizzata e di più semplice impiego.
Dal grafo al codice: la struttura switch…case
Per la scrittura del codice si può utilizzare un procedimento standard. In fase di programmazione si tratta di tradurre le informazioni fornite dal grafo orientato in una struttura a selezione multipla (switch…case) avente un numero di case pari al numero di stati. Ad ogni case si fa corrispondere un sottoprogramma ed è all’interno di questo che, utilizzando in modo opportuno strutture di selezione e/o di iterazione (if, while, for), si definiscono le condizioni per il passaggio da uno stato ad un altro nonché l’esecuzione delle azioni che, stato per stato, devono essere implementate.
I case che si devono di volta in volta eseguire dipendono dal valore che si assegna alla variabile su cui opera l’istruzione (definita anche con il termine selettore). Il modo di procedere stilisticamente e intuitivamente più valido è quello ora descritto. Una possibile alternativa è quella di non utilizzare i sottoprogrammi ma di inserire le istruzioni che consentono di definire i passaggi di stato e le azioni da implementare all’interno dei case. Si procede di seguito con alcuni esempi facilmente realizzabili che consentano di comprendere il procedimento poi applicabile a situazioni più complesse.
Un primo esempio: il deviatore degli impianti elettrici civili
Il deviatore è un dispositivo molto comune negli impianti elettrici civili tradizionali che consente di accendere un punto luce da due punti distanti l’uno dall’altro; lo schema elettrico dell’impianto (denominato anche deviata) viene schematizzato in Fig. 3.

La rappresentazione dell’automa che ne definisce il funzionamento è molto semplice in quanto l’automa stesso presenta due stati che sono le possibili condizioni OFF e ON della lampada L (denominata LED) definiti stato 0 e stato 1; le condizioni che si possono verificare per passare da OFF a ON e viceversa dipendono da come vengono azionati i due pulsanti (denominati P1 e P2) che sostituiscono i deviatori D1 e D2. Il funzionamento può essere descritto molto semplicemente (grafo orientato di Fig. 4) in quanto è sufficiente premere uno qualsiasi dei due pulsanti per passare da uno stato all’altro. Lo schema elettrico riportato in Fig. 5 si riferisce alla realizzazione pratica dell’automa che utilizza la scheda Arduino UNO.


Il codice Arduino del deviatore
Il codice rappresentativo dell’automa di seguito riportato è quello di Arduino; il pulsante P1 è stato collegato al pin 10, il pulsante P2 al pin 12, il LED infine al pin 8.
La presenza di due stati porta immediatamente a definire una struttura switch…case con due case; i sottoprogrammi che ne conseguono definiscono di pertanto lo stato del LED e le condizioni relative ai passaggi di stato. Nella soluzione alternativa di seguito proposta le istruzioni che consentono di definire i passaggi di stato vengono inserite all’interno dei case. Come possibile variante relativa a questo esempio potrebbe essere una ulteriore applicazione utilizzata negli impianti civili tradizionali ovvero l’accensione di un punto luce da tre punti (l’impianto viene comunemente denominato interrotta).


Un secondo esempio: accensione in sequenza di LED
Si considerino due LED (LED 1 e LED 2) che si accendono e spengono in sequenza a seguito della pressione di un pulsante.
Si definiscono quattro possibili stati:
- stato 0_è lo stato iniziale in cui i due LED sono spenti premendo il pulsante si passa nello stato 1
- stato 1_si accende il LED 1 premendo per la seconda volta il pulsante si passa nello stato 2
- stato 2_il LED 1 si spegne, dopo 3 s si accendono entrambi premendo per la terza volta il pulsante si passa nello stato 3
- stato 3_si spengono entrambi i LED, dopo 3 s si accende il LED 2 premendo per la quarta volta il pulsante si ritorna nello stato 0
Dalla descrizione del problema si passa facilmente al grafo orientato riportato in Fig. 6. Lo schema elettrico riportato in Fig. 7 si riferisce alla realizzazione pratica dell’automa che utilizza la scheda Arduino UNO.


Il pulsante è stato collegato al pin 12, il LED 1 al pin 8, il LED 2 infine al pin 10. Il codice rappresentativo dell’automa viene di seguito riportato. La presenza di quattro stati porta immediatamente a definire una struttura switch…case con quattro case; i sottoprogrammi che ne conseguono definiscono di conseguenza lo stato dei LED e le condizioni relative ai passaggi di stato.
Un terzo esempio: verso l’automazione industriale
In questo terzo esempio vengono mostrate in modo molto semplificato alcune azioni che sono tipiche dell’automazione industriale. In Fig. 8 viene riprodotto un nastro trasportatore il cui movimento dipende dallo stato assunto da un pulsante (per l’avvio del nastro), da due finecorsa (definiti di andata e di ritorno posti agli estremi del nastro stesso) e da una fotocellula posta in posizione intermedia. Il funzionamento dell’impianto può essere sintetizzato nel modo seguente definendo quattro possibili stati:
- stato 0_è lo stato iniziale in cui il motore è fermo
- premendo il pulsante PA si passa nello stato 1
- stato 1_il nastro è avviato nella modalità marcia avanti MA

Dallo stato 1 si possono seguire due percorsi ovvero passare allo stato 2 (quando viene rilevato lo stato ON della cellula fotoelettrica) o direttamente allo stato 3 (quando viene rilevato lo stato ON del finecorsa FCA):
- stato 2_il motore si ferma per 60 s e riprende il movimento sempre in modalità MA
- quando viene rilevato lo stato ON del finecorsa FCR si passa nello stato 3
- stato 3_ il motore si ferma per 60 s e riprende il movimento in modalità MI; quando viene rilevato lo stato ON del finecorsa FCR si ritorna nello stato 0
Il grafo orientato e il cablaggio del nastro trasportatore
Dalla descrizione del problema si passa facilmente al grafo orientato riportato in Fig. 9. Per verificare la correttezza di quanto affermato vengono utilizzati due LED (che simulano rispettivamente la marcia avanti e la marcia indietro del motore), un pulsante (che simula il pulsante di avvio) e tre pulsanti (che simulano il comportamento dei tre sensori). Lo schema elettrico riportato in Fig. 10 si riferisce alla realizzazione pratica dell’automa che utilizza la scheda Arduino UNO. Il codice rappresentativo dell’automa viene di seguito riportato.




Conclusioni
Abbiamo visto come le macchine a stati finiti (FSM) siano fondamentali per la modellazione di sistemi con comportamenti deterministici, giocando un ruolo cruciale nell’ingegneria del controllo e dell’automazione. Le FSM offrono un quadro metodologico solido per delineare sistemi complessi attraverso stati ben definiti e transizioni precise, facilitando la progettazione di circuiti elettronici e sistemi di automazione industriale. Grazie alla loro struttura rigorosa e alla capacità di rappresentare chiaramente ogni possibile stato di un sistema, le FSM aiutano a prevenire errori e migliorare l’affidabilità dei processi automatizzati.
Il ruolo di Arduino nella pratica
Abbiamo anche scoperto l’importanza delle piattaforme come Arduino nell’implementazione pratica delle FSM, sottolineando la loro accessibilità e versatilità. Arduino si è rivelato uno strumento prezioso non solo per gli ingegneri esperti ma anche per gli hobbisti e i principianti, democratizzando così l’accesso a tecnologie sofisticate e incentivando l’innovazione e la sperimentazione in un ampio spettro di applicazioni. Grazie ad Arduino, chiunque può sviluppare e testare prototipi di sistemi automatizzati, rendendo la tecnologia più inclusiva e promuovendo la creatività.
Attraverso vari esempi, abbiamo osservato come le FSM siano impiegate in numerosi dispositivi e sistemi quotidiani, evidenziando la loro ubiquità e importanza nell’ambito tecnologico. Questi esempi hanno concretizzato il concetto di FSM, dimostrando come principi teorici si traducano in applicazioni pratiche essenziali per il nostro quotidiano. Dal funzionamento degli elettrodomestici agli impianti industriali complessi, le FSM sono alla base di molte tecnologie che utilizziamo ogni giorno, dimostrando la loro rilevanza e versatilità.
Infine, abbiamo esplorato la transizione dalla teoria alla pratica delle FSM, con una guida dettagliata per la loro realizzazione utilizzando Arduino. Questo collegamento tra la comprensione teorica e l’applicazione pratica è stato cruciale per evidenziare il potenziale delle FSM in progetti reali, aprendo nuove prospettive nell’automazione e oltre. La capacità di tradurre la teoria in pratica non solo arricchisce la comprensione degli studenti e dei professionisti, ma stimola anche nuove idee e soluzioni innovative per le sfide tecnologiche contemporanee.


