RaspBerry Pi – Iniziamo a conoscere il GPIO

agosto 24th, 2014 | Posted by Marco Plessi in Esperimenti | Recensioni | Informatica | Visite: 12.207

Addentriamoci nel mondo che circonda il Raspberry, fuori dalle funzioni puramente informatiche, parlando di GPIO e hardware. Iniziamo a capire come funziona, e prendiamo confidenza con i software specifici.

Il Raspberry Pi mi ha sempre affascinato da quando è stato immesso sul mercato, ma l’ho sempre utilizzato per funzioni informatiche, come server, o mediacenter (vedi “Mediacenter con Raspberry Pi“).

Ma il raspberry è molto più di un piccolo computer, infatti è dotato di un connettore GPIO, utilissimo per applicazioni che necessitano di ingressi e uscite fisici, rendendolo di fatto un Arduino (un po’ più complicato da programmare e usare) ma con una CPU da 700 MHz!

Con questo articolo vorrei rendervi partecipi di questa esperienza, perché secondo me apre un mondo di applicazioni embedded, sia in ambito domotico che nell’automazione industriale.

Per queste prove ho utilizzato uno shield della Futura Elettronica (FT1060M), che permette di avere diversi tipi di I/O, tutti raggrupati su una scheda (in stile shield di Arduino).

Di seguito è riportato il pin-out del connettore GPIO:

raspberry_gpio

Attenzione! il livello logico alto (equivalente ad 1) è di 3,3V ! NON di 5 V. Collegando degli ingressi a 5V si danneggierà irrimediabilmente la CPU, quindi prestare attenzione sia durante le fasi di test che durante la progettazione di eventuale hardware.

 

1 – Preparativi

Preparare: tastiera, mouse, monitor, collegamento ethernet, alimentazione 5V.

L’alimentazione lasciamola scollegata inizialmente, prima dobbiamo preparare la SD con il sistema operativo.

raspberry_gpio_1

2 – Flashare il sistema operativo sulla SD

Per questa operazione, è necessaria una SD di ottima qualità (la SD sarà l’hard disk del Raspberry, e come tale non deve essere scarso), e un lettore di SD.

Io ho utilizzato la stessa dell’articolo relativo al Mediacenter, ovvero una Kingston SDHC UltimateX 100X da 8GB.

Scarichiamo Win32DiskImager, e installiamolo.

Scarichiamo anche l’immagine del sistema operativo, ovvero RaspBian, che è una particolare distro basata su Debian Wheezy, adatta per il Raspberry (perché sappiamo bene che il raspberry ha una CPU ARMv6, che non è supportata dalla maggior parte dei sistemi operativi).

Adesso bisogna aprire Win32DiskImager e caricare l’immagine di RaspBian, quindi selezionare il supporto (la SD).

raspbian_1

Quindi premere su “Scrivi” e confermare l’operazione, che può durare diversi minuti.

 

3 – Primo avvio del raspberry

Quando il sistema operativo è stato scritto sulla SD, inseritela nello slot del raspberry, e collegate l’alimentazione.

Qui si possono verificare due cose: sul monitor si vedono i vari dati e si avvia, oppure sul monitor non si vede nulla.

Se avete collegato un monitor HDMI, probabilmente non si vedrà nulla, quindi procedete come segue (se si vede qualcosa passate direttamente al capitolo 4).

-Collegate l’uscita video composito (il connettore giallo) del raspberry ad un monitor o tv dotato di tale interfaccia.

-Attendete il caricamento del sistema operativo, se parte la procedura guidata utilizzatela solo per selezionare la tastiera italiana;

-Chiudete la procedura guidata premendo “enter” sul tasto finish (muovendosi con Tab);

-Dalla riga di comando sudo nano /boot/config.txt

-Si aprirà il file di configurazione, bisogna abilitare le seguenti opzioni (cancellando il carattere # all’inizio della riga, che serve a commentare):

hdmi_safe=1   (che abilita una modalità sicura, in cui si ha la massima compatibilità con l’hardware)
hdmi_force_hotplug=1   (raspberry tiene attiva l’uscita hdmi anche se in fase di boot non rileva un monitor collegato)
hdmi_drive=2   (abilita la modalità HDMI con anche l’audio. Non è necessario abilitarla)
config_hdmi_boost=4   (questo parametro potenzia il segnale in uscita, utile nel caso in cui il segnale dovesse essere disturbato per via di distrubi elettromagnetici ambientali).

-Quindi chiudere il file con Ctrl+X e confermare scrivendo Y, quindi premere Invio;

-Adesso si può spegnere il raspberry e ripristinare il monitor HDMI.

 

4 – Configurazione iniziale

Adesso che il raspberry si è avviato e sul monitor hdmi vediamo la riga di comando in attesa del login, possiamo inserire le credenziali di default, che sono:

user: pi
password: raspberry

Adesso sarebbe meglio avviare la procedura guidata per la configurazione di base, e si fa inviando il comando:

sudo raspi-config

Le operazioni da fare sono:

1 Expand filesystem: permette di sfruttare tutto lo spazio in più della SD come file system. Spesso permette di aumentare lo spazio di archiviazione.

2 Change user password: per cambiare la password di default dell’account pi.

4 Internationalisation options: per cambiare la lingua e il layout della tastiera;

Nel caso in cui vogliate aumentare le prestazioni, c’è anche la voce overclock, grazie alla quale si può spingere la cpu fino a 1 GHz, ma ovviamente la vita del Raspberry sarà molto più corta.

8 Advanced options -> A4 SSH: abilitate l’ssh per poter controllare il raspberry anche da remoto.

Quindi spostarsi con Tab su “finish” e premere Invio, dopo la conferma, il Raspberry si riavvia.

Quando il raspberry ha finito la fase di avviamento, effettuare il login.

Adesso configuriamo un IP statico al raspberry, in modo da poterlo utilizzare da remoto. Per fare ciò, nella riga di comando del raspberry, digitare: sudo nano /etc/network/interfaces

In questo modo si apre il file di configurazione delle interfacce di rete, qui bisogna cancellare la riga iface eth0 inet dhcp , e al suo posto inserire le sguenti stringhe:

iface eth0 inet static
address 192.168.1.40
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
 

L’esempio sopra assegna 192.168.1.40 al raspberry, in una rete dove il router ha l’ip 192.168.1.1.

Quindi Salvre il file e riavviare il raspberry (per riavviare: sudo reboot).

Adesso possiamo anche scollegare tastiera, mouse e monitor dal raspberry, e collegarci via SSH. Se siete in ambiente Windows utilizzate PuTTY; se siete in ambiente linux è sufficiente aprire un terminale e scrivere ssh “ip-del-raspberry”.

 

5 – Finalmente, utilizziamo il GPIO !

Adesso spegnete il raspberry (sudo shutdown -h now) e scollegate l’alimentazione, per innestare sul GPIO lo shield FT1060M, quindi ricollegate l’alimentazione.

raspberry_gpio_3

Come fare ad accendere (e spegnere) un led:

1 – echo “4” > /sys/class/gpio/export : con questo comando si attiva il pin GPIO4, e ci permette di utilizzarlo;

2 – echo “out” > /sys/class/gpio/gpio4/direction : utilizziamo il pin come uscita, questo comando scrive nel parametro direction della struttura dati dedicata al pin 4, il valore out, per configurarlo come uscita. Possiamo verificare la modalità di un pin scrivendo cat /sys/class/gpio/gpio4/direction.

3 – echo “1” > /sys/class/gpio/gpio4/value : con questo comando mettiamo a 1 l’uscita, ovvero accendiamo il led! Per spegnerlo è sufficiente un echo “0” > /sys/class/gpio/gpio4/value.

4 – Per disattivare il pin gpio, bisogna inviare il comando echo “4” > /sys/class/gpio/unexport, che cancella la struttura dati creata al punto 1 per il controllo del pin.

Ricapitolando:

con echo “valore” > “percorso” scriviamo un parametro su un file.

con cat “percorso” controlliamo il parametro

echo “4” > /sys/class/gpio/export – crea la struttura per il controllo del pin;

echo “4” > /sys/class/gpio/unexport – cancella la struttura dati e il pin non può essere controllato;

/sys/class/gpio/gpio4/direction contiene il parametro che indica se il pin è un’uscita o un ingresso;

/sys/class/gpio/gpio4/value contiene lo stato del pin.

L’esempio è stato fatto per il pin GPIO4, ma ovviamente vale anche per tutti gli altri.

Di seguito il layout dello shield FT1060M, per sapere a cosa sono collegati i vari devices:

7100-FT1060M_1

 

6 – Controllare il GPIO con Python

Il metodo descritto nel capitolo precedente per controllare il GPIO, serve solo per prendere confidenza, ma ovviamente è possibile realizzare dei programmi in Python, che permettono di controllare i pin del gpio secondo determinate logiche.

Python è un potente linguaggio di programmazione interpretato (ovvero non deve essere compilato), molto utilizzato per svariate applicazioni. Per approfondire l’argomento Python, la guida di html.it è perfetta. Qui non tratterò il funzionamento di tutte le operazioni del Python, ma solo alcune (quelle necessarie allo sviluppo di applicazioni per raspberry).

Python dovrebbe essere già installato di default su Raspbian, per controllare, inviate il comando pyhton -V, e come risposta verrà data la versione di Python installata. Se cosi non fosse (cosa molto strana) installate Python con il comando sudo apt-get install python.

Bisogna installare anche le librerie per controllare il GPIO con Python. Per fare ciò, inviate il comando sudo apt-get install python-rpi.gpio .

Adesso create un nuovo file “firstprogram” nella home. Per fare ciò: sudo nano firstprogram.

Nel file, scriviamo:

#!/usr/bin/python
 
import time
import RPi.GPIO as GPIO
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
 
while 1:
   GPIO.output(4, True)
   time.sleep(1)
   GPIO.output(4, False)
   time.sleep(1)

Salvate e chiudete con Ctrl-X. (attenzione: Python è case sensitive: True è diverso da true!!)

La prima riga (#!/usr/bin/python) indica la posizione dell’interprete.

import serve ad importare una libreria, in questo caso importiamo la libreria time (per le pause) e RPi.GPIO per il controllo del gpio. Scrivendo RPi.GPIO as GPIO, nel codice possiamo scrivere GPIO invece di RPi.GPIO, rendendo l’intero listato più leggibile.

GPIO.setmode(GPIO.BCM) carica la mappa del connettore GPIO, in modalità BCM, ovvero i numeri assegnati ai pin sono quelli riportati sullo schema (nel disegno del capitolo 5, quelli esterni). Esiste anche la modalità BOARD, dove al singolo pin viene assegnato il progressivo del pin del connettore (nel disegno del capitolo 5, i numeretti all’interno dei pallini).

GPIO.setup(4, GPIO.OUT) imposta il pin 4 come uscita.

while 1: è l’inizio del ciclo while infinto, ovvero le istruzioni al suo interno vengono eseguite sempre fino all’interruzione del programma.

GPIO.output(4, True) imposta a 1 il pin 4 impostato precedentemente come uscita.

sleep(1) introduce una pausa di 1 secondo.

Adesso inviate il comando sudo python firstprogram. Il led LD5 sullo shield inizierà a lampeggiare! Si lo so non è chissà cosa, ma significa che abbiamo preso il controllo del GPIO, che abbiamo capito come controllarlo e che il raspberry ora è completamente sotto il nostro controllo.

Per terminare il programma, si usa la solita combinazione Ctrl+C.

7 – Qualcosa di leggermente più complicato

Proviamo qualcosa di leggermente più interessante, abbiamo anche la possibilità di avere degli ingressi, no?

Allora create un nuovo file: sudo nano doppiolampeggio .

E scrivete il seguente codice:

#!/usr/bin/python
 
import time
import RPi.GPIO as GPIO
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.OUT)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
 
while 1:
    GPIO.output(4, True)
    GPIO.output(23, False)
    time.sleep(1)
    if GPIO.input(17):
        GPIO.output(4, False)
        GPIO.output(23, True)
    else:
        GPIO.output(4, False)
        GPIO.output(23, False)
    time.sleep(1)

In questo listato possiamo vedere che, oltre ad un’altra uscita, viene configurato un ingresso. La stringa di configurazione è: GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN), di diverso dall’uscita ha pull_up_down=GPIO.PUD_DOWN, questo parametro attiva la resistenza di pull-down.

if GPIO.input(17): esegue le istruzioni successive solo se l’ingresso 17 è a livello alto.

Perciò questo programma genera due tipi di lampeggio: uno normale, se l’interruttore SW1 sullo shield (o l’ingresso GPIO17) è a livello basso;

Se il GPIO17 è a 1 (o l’interruttore SW1 sullo shield è ad on) viene eseguito un lampeggio doppio alternando il led LD5 con il led LD2.

8 – Conclusione

Dopo questa piccola esperienza, molto semplice, abbiamo preso confidenza con il GPIO. Questo sarà il primo articolo di una probabile serie, in cui cercherò di addentrarmi sempre di più nello specifico, con applicazioni sempre più complesse e interessanti. L’articolo non è scritto con l’intento di realizzare una guida/tutorial su come-fare-a-fare-quella-cosa, ma l’ho scritto per registrare una mia esperienza, che sono sicuro possa essere utile a qualcun’altro.

raspberry_gpio_2

 

Licenza Creative Commons
Quest’opera di www.tecnovolt.it è distribuita con Licenza Creative Commons Attribuzione – Non commerciale – Non opere derivate 3.0

You can follow any responses to this entry through the RSS 2.0 You can leave a response, or trackback.

One Response



Leave a Reply

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

Name the Author      
 

* Privacy Policy GDPR

*

Accetto