Negli articoli pubblicati fino ad ora, sono stati affrontati dei concetti davvero elementari; il codice binario, il linguaggio dei microprocessori e le grandezze elettriche fondamentali, tensione, corrente e resistenza. Argomenti questi che stanno davvero alla base di tutto il mondo dell’informatica e dell’elettronica. Proviamo ora ad abbinare tra di loro questi concetti per comprendere ad esempio come con una piccola schedina programmabile, si possano realizzare una miriade di dispositivi per gestire le più disparate funzioni.
Possiamo considerare un qualsiasi sistema programmabile composto da due parti essenziali; il braccio e la mente.
La mente è la parte che si occupa di prendere decisioni, di eseguire una sorta di “ragionamento” conseguenza di un insieme di istruzioni che vengono date. Il braccio è invece la parte che permette alla mente di agire e di mettere in pratica le sue decisioni.
Ogni sistema programmabile è composto in questo modo, pensiamo ad esempio ad un semplicissimo sistema che controlla in automatico l’accensione e lo spegnimento di una lampada in caso di presenza di un persona in una stanza. Un simile sistema può essere tranquillamente gestito da un sistema programmabile composto da una CPU (Central Processing Unit cioè un microprocessore) e da dispositivi elettronici che danno le informazioni o che eseguono delle operazioni, genericamente definiti come “sensori” e “attuatori”.
Senza scendere nel funzionamento di questi ultimi, consideriamo un sensore come un dispositivo che riesce a trasformare una qualsiasi grandezza fisica in una corrente o in una tensione. I sensori sono infatti gli occhi, il naso o le orecchie di un sistema, sono in grado di rilevare una temperatura, di verificare la presenza di un corpo umano, e di acquisire tantissime altre grandezze fisiche. Esistono in commercio tantissimi tipi di sensori adatti a rilevare ogni tipo di grandezza.
Un attuatore invece possiamo considerarlo come un dispositivo che esegue qualcosa di fisico, ad esempio un movimento o l’accensione di un dispositivo che emette calore o luce, ma anche qualcosa che può creare un suono. Anche in questo caso le possibilità sono tante ed ovviamente esiste una grande varietà di dispositivi attuatori.
Perciò il nostro sistema che controlla l’accensione di una luce dovrà avere degli “occhi” per vedere se c’è qualcuno nella stanza e se la luce è accesa, e dovrà avere delle braccia per accendere o spegnere la luce. Ma a noi non interessano, almeno per ora, i dispositivi di ingresso e di uscita (sensori ed attuatori) ma ci interessa sapere che essi interagiscono con il sistema tramite dei segnali elettrici, cioè corrente o tensione.
Perciò il sensore informerà la C.P.U. (rappresentata in figura dalla scheda Arduino) della presenza di una persona, dando un segnale elettrico, in questo caso una Tensione di 5 Volt su uno degli ingressi appartenenti al gruppo dei G.P.I.O. (General Purpose Input Output). La presenza di un livello di tensione di 5 Volt corrisponde ad un livello logico alto “1 logico“, mentre invece un livello di tensione pari a 0 Volt corrisponde ad un livello logico basso “0 logico“.
Queste due condizioni 1 e 0 sono anche indicate con TRUE e FALSE e vengono elaborate dalla mente e cioè la C.P.U. Questo ragionamento vale anche per gli attuatori, volendo accendere qualcosa (nel caso di cui sopra una luce) occorre mettere sull’uscita un 1 logico, TRUE, che corrisponderà ad una tensione di 5 Volt.
Ogni sistema programmabile, ogni elaboratore, partendo dal PC che tutti noi utilizziamo, ha dei dispositivi di ingresso ed altri di uscita, da quelli molto semplici che danno solo un’informazione sottoforma di un bit che può valere 0 e 1 (FALSE e TRUE) a quelli più complessi dove magari c’è una tastiera o altri dispositivi che consentono di acquisire delle informazioni. Ma torniamo al nostro semplice sistema che deve controllare l’accensione di una lampada e proviamo a scrivere le istruzioni che la C.P.U. dovrà eseguire in maniera grafica, con quello che viene chiamato diagramma di flusso o Flow chart.
Nello schema vediamo un inizio ed una fine, perciò il programma verrebbe eseguito una sola volta, nella realtà questa sequenza di istruzioni dovrà essere eseguita ciclicamente (vedremo poi come fare).
Leggiamo ora la sequenza di istruzioni date alla C.P.U. La prima è la lettura dello stato del sensore, per determinare se c’è o non c’è una persona nella stanza, la seconda istruzione invece valuta cosa fare dopo aver acquisito l’informazione dal sensore. Perciò se l’ingresso a cui è collegato il sensore avrà una tensione di 5 Volt ci sarà un “1 logico” e cioè TRUE, il percorso del programma proseguirà perciò a destra verso la T di True. La successiva istruzione sarà quella di verificare se la luce è già accesa. Anche in questo caso avremo due possibilità e cioè la luce è già accesa (TRUE) o la luce non è già accesa (FALSE) in questo caso dovremo eseguire il blocco “Accendi la luce”. Se invece inizialmente il sensore avesse dato l’informazione che non ci sono persone nella stanza, allora dopo aver aspettato un tempo di un secondo la luce verrà spenta.
Ora cerchiamo invece di eseguire le istruzioni in maniera ciclica. Un modo potrebbe essere ad esempio quello di inserire le istruzioni all’interno di un blocco che viene eseguito solo se c’è una condizione sempre vera, come ad esempio il fatto che 1 sia uguale ad 1, una domanda scontata che da sempre la stessa risposta e cioè si che tradotto in gergo diventa TRUE. Perciò il nuovo schema sarà il seguente.
In questo modo avremo un funzionamento continuo del sistema.
Questo modo grafico di scrivere un programma è universale, in quando prescinde dal linguaggio utilizzato, ed è molto utile per comprendere il funzionamento di un qualsiasi programma. Ogni bravo programmatore dovrebbe prima di tutto fare un’analisi grafica di questo tipo e successivamente cominciare a scrivere le istruzioni in maniera testuale.
Per meglio comprendere come scrivere un FLOW CHART, proviamo con un altro esempio totalmente diverso. Consideriamo l’operazione matematica definita FATTORIALE di un numero, indicata sulla calcolatrice con il simbolo n!.
Il fattoriale di un numero è il prodotto dei numeri interi positivi inferiori a tale numero. Ad esempio il fattoriale di 4 si ottiene moltiplicando 4x3x2x1 cioè 24.
Possiamo distinguere in questo FLOW CHART i vari blocchi:
- La lettura di un valore in ingresso, o la scrittura in uscita con il blocco che ha la forma di un parallelogramma.
- L’assegnazione di un valore, con la forma di un rettangolo.
- La valutazione di una condizione, cioè se vera “TRUE” o falsa “FALSE”, con un rombo.
Anche in questo caso al sistema vengono forniti dei dati (cioè il numero) magari con una tastiera, e viene restituito dal sistema un risultato che non è un azione da eseguire ma un valore ottenuto dal calcolo.
Insomma ogni ragionamento può essere tradotto in un diagramma di flusso, ma come si fa poi a passare da questo alle istruzioni da dare alla CPU ?
Non dimentichiamoci poi che la CPU comprende solo numeri binari, perciò se vogliamo dargli delle istruzioni, dovremo scriverle sottoforma di codice binario. Per semplificarci un po’ la vita ci sono però i “linguaggi di programmazione”, cioè un insieme di istruzioni che rispettano una determinata sintassi e che ci consentono di tradurre in una maniera comprensibile al programmatore, le istruzioni viste sopra. Una volta scritto il programma, esso verrà poi tradotto in codice binario eseguibile dalla CPU, da altri programmi chiamati COMPILATORI e LINKER.
Proviamo ora a scrivere il primo programma con uno dei linguaggi di programmazione più noti, il linguaggio C, e proviamo a farlo utilizzando l’ambiente di sviluppo della scheda Arduino, utilizzata nel sistema sopra indicato per gestire l’accensione della lampada.
In un programma scritto in linguaggio C si possono inserire dei commenti utilizzando il doppio slash // , perciò il programma commentato sarà il seguente:
Una volta che il programma verrà dato in pasto al compilatore per essere tradotto in linguaggio macchina esso diventerà un insieme di 0 e 1.
Il codice macchina ottenuto verrà scritto in una memoria a cui accederà la CPU per leggere ed eseguire le istruzioni.
Spero che con questo semplice esempio possa aver chiarito la struttura di un sistema programmabile, e la sua interazione con il mondo esterno. Grazie dell’attenzione.