Programmare Arduino con gli SFC – GRAFCET

Realizzare diagrammi SFC per programmare qualunque cosa.

Oggi Vi mostro un metodo di programmazione che mi è stato insegnato da un mio professore di elettronica e che mi ha permesso di realizzare tantissimi progetti, anche complessi, con estrema facilità.

Sto parlando della programmazione con l’utilizzo dei digrammi SFC (Sequential Function Chart) più comunemente chiamati GRAFCET.

Questo metodo utilizza un diagramma visivo di tipo sequenziale composto da step e transizioni.
Possiamo considerare gli step come delle stanze e le transizioni come delle porte o corridoi. Per passare da una stanza all’altra (ovvero da uno step ad un altro) dobbiamo far si, che determinate condizioni presenti all’interno delle transizioni si verifichino.

All’interno delle stanze avvengono normalmente, tutte le funzioni che regolano le uscite del sistema mentre alle porte vengono associati gli ingressi. Ovviamente questa non è una regola fissa. Ed e possibile fare infinite associazioni ad ingressi ed uscite, sia negli step che nelle transizioni.

Forse il modo migliore per farvi capire come funzionano gli SFC e mostrarvi il diagramma ed il codice.

Quando programmiamo con gli SFC dobbiamo sempre realizzare una digramma funzionale e due tabelle. Una per gli step ed una per le transizioni.

Creiamo un piccolo esempio per capire meglio. Proviamo a realizzare un codice per far accendere un Led quando si preme un pulsante e poi ripremendo lo stesso pulsante lo facciamo spegnere.

Come lo rappresentiamo con gli SFC?


Possiamo immaginare di trovarci in una stanza dove il led è spento. Quello è lo step 0. Vogliamo passare in una seconda stanza dove il led è acceso quello è lo step 1.

Per aprire la porta che permette il passaggio dalla prima alla seconda stanza dobbiamo premere un pulsante.
Ovviamente una volta passati dalla stanza zero a quella uno, la porta si chiude e per riaprirla e tornare indietro dovremmo premere nuovamente il pulsante.
Ora vediamo come abbiamo realizzato il codice dell’esempio appena descritto, da caricare sull’Arduino.

//DEFINIAMO I PIN UTILIZZATI DAL PROGRAMMA
#define Led 8
#define Pulsante 3

bool STEP[2]{0,0};
bool TRAN[2]{0,0};

//VARIABILE DI TEMPO PER UMANIZZARE IL SISTEMA
int T_Hum = 400;

void setup() {
  pinMode(Pulsante, INPUT_PULLUP);
  pinMode(Led, OUTPUT);
  STEP[0]=HIGH;
}

void loop() {
  //TUTTI GLI STEP
  if(STEP[0]){
    digitalWrite(Led, LOW);
    TRAN[0]=HIGH;
    }
  if(STEP[1]){
    digitalWrite(Led, HIGH);
    TRAN[1]=HIGH;
    }
 //TUTTE LE TRANSIZIONI
 if(TRAN[0]){
  if(digitalRead(Pulsante)==LOW){TRAN[0]=LOW; STEP[0]=LOW; STEP[1]=HIGH; delay(T_Hum);}
  }
 if(TRAN[1]){
  if(digitalRead(Pulsante)==LOW){TRAN[0]=LOW; STEP[1]=LOW; STEP[0]=HIGH; delay(T_Hum);}
  }
}

Nella parte superiore abbiamo definito i pin utilizzati dal sistema, quelli dove andremo a collegare il pulsante ed in led con la sua opportuna resistenza per limitare la corrente assorbita.

Siccome nel digramma utilizziamo due step e due transizioni, creeremo un array con due step ed un array con due transizioni. Gli array sono di tipo booleano. Quindi le variabili contenute al suo interno possono avere solo due valori. O o 1, oppure Vero o Falso o HIGH e LOW

Logicamente se il sistema utilizza più step o transizioni basterà cambiare il numero nella parentesi quadra ed aggiungere il giusto numero di zeri. Io parto con tutte le variabili a valore 0 ma si può inizializzare il sistema con qualsiasi fase.

Ho inserito anche una variabile chiamata T_Hum che andrò ad utilizzare nei delay per rallentare il sistema e “umanizzarlo”.
So che molti mi diranno che 400 millisecondi sono un po’ troppi, però per questo tipo di progetto tale valore va più che bene.

Dopo aver settato i pin e attivato lo step zero all’interno della funzione Setup, nel Loop le condizioni prima descritte si verificano.

Non mi metto a spiegare passo passo ogni stringa di codice in quanto sarebbe troppo banale. E poi se non siete in grado di capirlo da soli, allora non siete ancora pronti per questo tipo di programmazione.

Schema di collegamento

Lista dei componenti utilizzati e altro

Benché il progetto possa risultare molto banale ed il codice troppo confusionale per ciò che realmente fa il sistema, questa metodologia di programmazione vi semplificherà moltissimo la vita quando realizzerete progetti più complessi.

Questo grafico mostra quanto si possa articolare una rete utilizzando più step e transizioni. E’ possibile associare ad uno step di partenza più transizioni che portano a step diversi. Oppure avere transizioni che attivano più step contemporaneamente e, in certi casi, si possono utilizzare transizioni che stoppano il sistema e no restituiscono step.

Scarica lo sketch da questo link:
SFC_Esempio_Led

Tutti i file compressi disponibili per il download, sono stati realizzati utilizzando il software IZArc. Il software è totalmente gratuito e scaricabile da qui. Per una corretta estrazione dei file, Vi consiglio di scaricarlo.

Nella sezione 100 Progetti con Arduino Uno puoi trovare articoli simili con file sorgenti liberamente scaricabili.

Per qualsiasi info, per un aiuto nella realizzazione dei vostri progetti, o più semplicemente per segnalarci degli errori o link corrotti, utilizzate la pagina Contattaci.

Grazie per aver letto questo articolo, se puoi leggine degli altri, commenta per sostenere il blog e iscriviti al mio canale Youtube. Seguimi anche su Instagram e Facebook dove puoi anche pubblicare i tuoi progetti sul gruppo Arduino For Peoplem.

You may also like...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *