Siamo al terzo appuntamento del percorso didattico sulla programmazione embedded di Selezione di Elettronica in collaborazione con NXP e Greta Galli. Completando il corso, sarà possibile candidarsi a ricevere una scheda NXP Freedom gratuita. Questo mese parliamo di GPIO (General Purpose Input/Output), uno dei “fondamentali” nel controllo e nel monitoraggio del flusso di segnali elettrici in un dispositivo
Tutto sul GPIO
GPIO (General Purpose Input/Output) è una tecnologia fondamentale nell’ambito dell’elettronica, perché permette di controllare e monitorare il flusso di segnali elettrici in un dispositivo. Si riferisce a un tipo di PIN, o porta, su un microcontrollore o altro hardware che può essere utilizzato sia per le funzioni di input che di output.
I pin GPIO sono estremamente versatili: possono, ad esempio, pilotare LED e controllare sensori, come vedremo nel seguito, oppure motori, interruttori e altro ancora.
I segnali digitali inviati e ricevuti dai PIN GPIO sono rappresentati dai valori binari di 0 e 1, che corrispondono rispettivamente a tensioni basse e alte.
Python è un linguaggio molto usato per lavorare con GPIO, ma possono essere utilizzati anche C/C++, JavaScript, Bash script, Scratch.
Vediamo in concreto come sia possibile modificare lo stato di un LED RGB su una macchina utilizzando un PIN come output, prima nel caso digitale e poi in quello analogico, simulato mediante modulazione dell’ampiezza dell’impulso (PWM).

PIN digitale
Iniziamo con il caso del PIN digitale. Esso è in grado di leggere i soli stati binari 0 e 1. In questo esempio consideriamo il pulsante collegato al PIN GPIO P0_23 (figura 1).
L'idea è quella di rilevare quando il pulsante viene premuto o rilasciato e usare questo valore per cambiare lo stato del LED: quando il pulsante viene premuto, lo stato logico è 0 (spento), e quando viene rilasciato, lo stato logico è 1 (acceso).
Nell’ambiente di programmazione Visual Studio Core, creiamo un nuovo progetto MicroPython, quindi colleghiamo la scheda al computer e selezioniamo la porta COM a cui è collegata la scheda stessa.
A questo punto dobbiamo scrivere un semplice codice:
- Importiamo la classe PIN dal modulo machine
- Definiamo due variabili: una per il pulsante e una per il LED
- Impostiamo un ciclo while che controlli lo stato del pulsante cambiando di conseguenza quello del LED
Ora eseguiamo il codice sulla scheda. Il risultato atteso è quello di riuscire ad accendere e spegnere il LED tenendo premuto e rilasciando il pulsante.

PIN analogico
Passiamo adesso a considerare il PIN analogico. Esso, diversamente da quello digitale, è in grado di leggere valori compresi in un intervallo continuo compreso fra 0 e 1.023, che corrisponde al livello di tensione sul PIN medesimo. Questa proprietà è utile per leggere i dati, ad esempio, provenienti da sensori che rilevano la temperatura o la luce.
In questo caso, per scrivere il codice, si procede come segue:
- Importiamo le classi PIN e ADC dal modulo machine
- Importiamo la funzione sleep dal modulo tempo
- Definiamo due variabili: una per il sensore e una per il PIN (nel nostro esempio useremo il PIN GPIO P4_12)
- Impostiamo un ciclo while che legge il valore dell’input analogico e lo stampa sul monitor seriale con un piccolo ritardo di 100 millisecondi
È possibile alimentare il sensore direttamente dalla scheda, ma occorre controllare che i livelli di tensione siano compatibili.

Funzionalità principali dei GPIO NXP
| Configurabilità | Possono essere impostati dinamicamente come input (per leggere segnali da sensori o interruttori) o output (per pilotare componenti esterni). |
| Resistori di Pull-up/Pull-down Interni | Molti GPIO NXP integrano resistori di pull-up o pull-down configurabili, riducendo la necessità di componenti esterni. |
| Uscite Open-Drain | Supportano configurazioni open-drain, utili per bus di comunicazione come I²C dove più dispositivi possono condividere la stessa linea. |
| Drive Strenght | È possibile regolare la corrente che il pin può erogare o assorbire, ottimizzando il consumo energetico e l'integrità del segnale. |
| Latch di input | Per una lettura più rapida e robusta dei segnali in ingresso. |
| Capacità di interrupt | Molti GPIO possono generare interrupt in risposta a cambiamenti di stato (fronte di salita, fronte di discesa, o entrambi), consentendo al microcontrollore di reagire a eventi esterni senza polling continuo. |
| Modalità a basso consumo | In alcuni processori (come la serie i.MX 8ULP), i GPIO possono mantenere il loro stato anche in modalità a basso consumo o durante le transizioni di stato di alimentazione |
| Secure GPIO | Alcuni MCU NXP con TrustZone (es. LPC55Sxx) implementano GPIO sicuri per proteggere i dati sensibili, impedendo l'accesso non autorizzato ai pin configurati per funzioni di sicurezza. |
Blue, verde, rosso
Nella video lezione 3 del nostro percorso formativo, vediamo come utilizzare il sensore di temperatura integrato e cambiare il colore del LED RGB, anch’esso integrato, in base alle soglie di temperatura. L’obiettivo è costruire un semplice sistema che mostri il blu per le temperature fredde, il verde per le temperature confortevoli e il rosso per le temperature calde.
Per prima cosa, apriamo Visual Studio Code. Premendo il pulsante nell'angolo in basso a sinistra è possibile creare un nuovo progetto MycroPhyton.
Successivamente occorre selezionare "Crea un progetto MicroPhyton vuoto", assegnare un nome al progetto e scegliere una posizione in cui salvarlo. A questo punto, si collega la scheda NXP FRDM al computer e si preme il pulsante in basso a sinistra per selezionare la porta COM a cui è collegata la scheda stessa.
Passiamo ora alla scrittura del codice. Occorre importare alcuni moduli, configurare il sensore di temperatura e i pin dei LED (72 è l’indirizzo del sensore di temperatura). Nell’impostare i pin dei LED RGB, bisogna ricordare che essi usano la logica inversa, dove 1 è spento e 0 è acceso.
Il passo seguente prevede la creazione della funzione di lettura della temperatura: quando inviamo uno 0 al sensore per misurare la temperatura, il sensore invia due byte per leggerla. Dobbiamo quindi prendere il primo byte e spostarlo di quattro posizioni a sinistra, nonché prendere il secondo byte e spostalo di quattro posizioni a destra. Combiniamo poi questi due numeri e moltiplichiamo il risultato per 0,0625, che è il più piccolo intervallo che il nostro sensore di temperatura può misurare.
Infine, è il momento di scrivere il ciclo principale del programma. In esso, prima leggiamo la temperatura e la stampiamo, poi spegniamo tutti i LED. Accendiamo quindi il LED appropriato impostandone il valore a 0.
Ora eseguiamo il codice cliccando sul pulsante Esegui, nell'angolo in basso a sinistra.
Per testare il nostro sistema, possiamo usare un asciugacapelli: quando la temperatura è inferiore a 23 gradi Celsius, la scheda accenderà il LED blu, quando invece la temperatura è compresa tra 23 e 24 gradi Celsius, la scheda accenderà il LED verde e, infine, quando la temperatura è superiore a 24 gradi, la scheda accenderà il LED rosso.
È possibile osservare la temperatura visualizzata sul monitor seriale mentre cambia ed è importante non toccare mai la scheda direttamente con le mani, poiché ciò potrebbe danneggiare i componenti.
PROGRAMMAZIONE ELETTRONICA EMBEDDED



