RaspberryPI

Gestire i GPIO del Raspberry Pi da riga di comando: Guida a Sysfs

Padroneggia la gestione hardware direttamente da shell

Con questa guida completa vogliamo mostrare come gestire lo switch on/off dei GPIO (General Purpose Input/Output) presenti sulla scheda Raspberry Pi. Questa tecnica, conosciuta come Sysfs interface, prevede l’interazione diretta con i pin tramite riga di comando utilizzando il terminale di Raspbian (o del sistema operativo basato su Linux che state utilizzando).

Il grande vantaggio di questo metodo è che non richiede l’installazione di librerie esterne (come Python o C): sfrutta nativamente il file system di Linux. Per la dimostrazione che segue è stato utilizzato un banale diodo LED, ma sfruttando le basi dell’elettronica potreste associare tranquillamente ai terminali di uscita dei relè, dei fotoaccoppiatori o dei transistor di potenza per comandare carichi a tensione superiore.

Punto fondamentale di partenza è la directory di sistema /sys/class/gpio/, la quale contiene tutte le interfacce di controllo dei vari GPIO sotto forma di semplici file di testo.

Lo schema elettrico e la numerazione BCM

Nell’esempio seguente ipotizzeremo di utilizzare uno schema elettrico minimale, sfruttando un diodo LED e una resistenza di limitazione da 150 ohm su un Raspberry Pi (compatibile con tutte le versioni, dal Pi 1 al Pi 4).

Attenzione: Quando si lavora da riga di comando con la cartella sysfs, il numero del GPIO fa sempre riferimento alla numerazione del processore (Broadcom – BCM) e non al numero fisico del pin (BOARD) sul connettore della scheda.

Schema di collegamento LED su Raspberry Pi

Per interagire con qualsiasi GPIO e gestirne l’attivazione, dobbiamo seguire questi step fondamentali:

1 – Richiamare il GPIO interessato (Export)

Questo passaggio è necessario per “svegliare” il pin e dire al sistema operativo che intendiamo utilizzarlo. Si tratta di passare al sistema il numero del GPIO sul quale vogliamo agire. Per far questo apriamo il terminale e, supponendo di voler lavorare sul GPIO 15, utilizziamo il comando:

echo 15 > /sys/class/gpio/export

Eseguendo questa istruzione, all’interno della directory /sys/class/gpio/ verrà creata dinamicamente una nuova cartella chiamata gpio15, contenente tutti i relativi file di configurazione per quel pin specifico.

2 – Definire se il nostro GPIO è un Input o un Output (Direction)

Questo passaggio è cruciale: definisce la direzione del segnale, ovvero se il pin deve erogare corrente (scrivere) o rilevarla (leggere). Solitamente, se il nostro obiettivo è pilotare un attuatore (transistor, relè, LED), dovremo impostare il GPIO come output. Se invece vogliamo ottenere informazioni da un sensore o leggere la pressione di un pulsante, lo imposteremo come input.

Per farlo, dobbiamo scrivere la parola “in” o “out” all’interno del file direction. Per rendere il nostro GPIO 15 un’uscita, procediamo con:

echo out > /sys/class/gpio/gpio15/direction

3 – Definire lo stato logico del nostro GPIO (Value)

Ora che il pin è configurato come uscita, possiamo fargli emettere un segnale. Abbiamo a disposizione gli stati logici 0 (OFF) e 1 (ON), che corrispondono rispettivamente a 0 Volt e a 3.3 Volt. (Attenzione a non confondervi con i 5 Volt: i pin del Raspberry Pi lavorano rigorosamente a 3.3V, immettere tensioni superiori danneggerebbe irrimediabilmente la scheda!).

Per accendere il LED collegato al nostro GPIO 15, inviamo il valore 1:

echo 1 > /sys/class/gpio/gpio15/value

Per spegnerlo nuovamente, basterà inviare uno zero:

echo 0 > /sys/class/gpio/gpio15/value

4 – Pulizia delle risorse (Unexport)

Una buona norma di programmazione (spesso trascurata) è quella di rilasciare le risorse del sistema operativo quando abbiamo finito di utilizzarle. Per dire a Linux di disabilitare e rimuovere la cartella del GPIO 15, usiamo il comando di unexport:

echo 15 > /sys/class/gpio/unexport

Riassumendo (con esempi corretti)

Per esportare il GPIO 15 come output e impostarlo allo stato logico ON dobbiamo dare i comandi:

echo 15 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio15/direction
echo 1 > /sys/class/gpio/gpio15/value

Per esportare un pin diverso, ad esempio il GPIO 14, come output e impostarlo allo stato logico OFF, dobbiamo dare i comandi:

echo 14 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio14/direction
echo 0 > /sys/class/gpio/gpio14/value

Bonus: Leggere un Input e creare Script Bash

Se volessimo leggere lo stato di un pulsante collegato, ad esempio, al GPIO 21, i comandi sarebbero molto simili, ma useremmo in invece di out e il comando cat per visualizzare a schermo il valore:

echo 21 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio21/direction
cat /sys/class/gpio/gpio21/value

Infine, la vera potenza di questo approccio a riga di comando si rivela nella creazione di script automatizzati. Ecco un esempio di un piccolo Script Bash che fa lampeggiare il nostro LED per 5 volte di fila senza dover usare alcun altro linguaggio di programmazione:

#!/bin/bash
echo 15 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio15/direction

for i in {1..5}
do
  echo 1 > /sys/class/gpio/gpio15/value
  sleep 0.5
  echo 0 > /sys/class/gpio/gpio15/value
  sleep 0.5
done

echo 15 > /sys/class/gpio/unexport
echo "Lampeggio completato!"

 

Admin | MST-Tutorial

Appassionato di elettronica, elettrotecnica e programmazione. Fondatore di MST-Tutorial, condivido con entusiasmo conoscenze, esperienze e progetti legati all’innovazione tecnologica, con l’obiettivo di rendere accessibili concetti tecnici complessi attraverso tutorial chiari e pratici.

Articoli Correlati

Pulsante per tornare all'inizio