Cosa sono e a cosa servono i GPIO

GPIO

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).

Figura 1. Schema del circuito proposto nell’esempio GPIO
Figura 1. Schema del circuito proposto nell’esempio

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.

Figura 2. Codice nel caso di PIN digitale
Figura 2. Codice nel caso di PIN digitale

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.

Figura 3. Codice nel caso di PIN analogico
Figura 3. Codice nel caso di PIN analogico

 

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

 

 

 

LASCIA UN COMMENTO

Inserisci il tuo commento
Inserisci il tuo nome