A - Programmazione di base
ES03 - Raspberry PI GPIO programming
FB - 12.2021 - v1.0
Raspberry PI GPIO programming
Gestione e utilizzo dei pin GPIO disponibili sulla Raspberry PI in C, Bash e Python.
�
2
© FB - 12.2021
Indice
�
3
© FB - 05.2021
Obiettivi didattici
4
Obiettivi didattici
5
© FB - 12.2021
Introduzione teorica
6
GPIO
7
© FB - 02.2022
Limiti elettrici del GPIO
Un pin GPIO non può pilotare carichi direttamente se non limitati a pochissimi milliampere (di solito 2-20 mA) a tensione di 3.3 volt.
Ad eccezione quindi, del pilotaggio di piccoli led, della lettura dello stato di pulsanti o microswitch o di interfacciamento verso altri circuiti integrati sullo stesso stampato, è sempre necessario avere una interfaccia di potenza per poter usare un pin GPIO.
8
© FB - 12.2021
Che aspetto ha un GPIO
9
© FB - 12.2021
Che aspetto ha un GPIO
DIP è l’acronimo di dual in-line package ed è il package usato ad esempio dalle CPU Atmel Atmega 328 utilizzate sulle schede Arduino.
I pin GPIO in questo caso sono distanti 2.54 mm pari a 100 MILS e sono molto più facili da manipolare.
Questo tipo di package è poco adatto ad una produzione industriale in quanto usa la tecnologia through-hole (THT) molto meno efficiente in termini di spazio occupato e tecnologia di montaggio oltre ad essere più costosa per via del maggior materiale utilizzato.
BGA è l’acronimo di ball grid array ed è il package delle CPU e delle RAM utilizzate in produzione da Acme Systems.
I “pin” GPIO in questo caso sono distanti 0.8 mm l’uno dall’altro.
10
© FB - 02.2022
Che aspetto ha un GPIO
Thin Quad Flat Package
TQFP - 9x9 mm
pitch 0.80 mm
Very Quad Flat No-leads
VQFN - 4x4 mm
pitch 0.45 mm
Dual In-line Package
DPI - 35x8 mm
pitch 2.54 mm
Micro Lead Frame
MLF - 5x5 mm
pitch 0.50 mm
Fine Pitch Ball Grid Array
FPBGA - 4x4 mm
pitch 0.50 mm
11
© FB - 02.2022
GPIO Electrical Specifications
12
© FB - 05.2021
GPIO pins
13
© FB - 05.2021
GPIO Electrical Specifications
14
© FB - 05.2021
GPIO Electrical Specifications
15
© FB - 05.2021
Pinout
16
© FB - 05.2021
Pinout
Il pin 5V può essere utilizzato per alimentare l’intera scheda. Si ricorda che i pin non accettano tensioni maggiori di 3.3V
17
© FB - 12.2021
Permissions
18
© FB - 05.2021
Permissions
Per utilizzare le porte GPIO, l'utente deve essere membro del gruppo gpio. L'utente pi è un membro per impostazione predefinita, altri utenti devono essere aggiunti manualmente
sudo adduser utente gpio; sudo grep gpio /etc/group
Il comando gpio della libreria WiringPi è progettato per essere chiamato da un utente normale senza utilizzare il comando sudo o accedere come root.
19
© FB - 12.2021
GPIO sysfs in Bash
20
© FB - 05.2021
sysfs
Il filesystem sysfs è uno pseudo-filesystem che fornisce un'interfaccia ai vari sottosistemi del kernel, dispositivi hardware e driver di dispositivo tramite file virtuali. Oltre a fornire informazioni su vari dispositivi e sottosistemi del kernel, i file virtuali esportati vengono utilizzati anche per la loro configurazione.
Il filesystem sysfs è comunemente montato su /sys
Molti dei file nel filesystem sysfs sono di sola lettura, ma alcuni i file sono scrivibili, consentendo la modifica delle variabili del kernel. [man page]
21
© FB - 12.2021
GPIO in Bash
22
© FB - 12.2021
GPIO in Bash - Esempio
Esempio di accensione di un led collegato al pin 17
# Exports pin to userspace
echo "17" > /sys/class/gpio/export
# Set up GPIO 17 and set to output
echo "out" > /sys/class/gpio/gpio17/direction
# Write output
echo "1" > /sys/class/gpio/gpio17/value
sleep 5
echo "0" > /sys/class/gpio/gpio17/value
# Clean up
echo "17" > /sys/class/gpio/unexport
https://elinux.org/RPi_GPIO_Code_Samples#Shell
23
© FB - 02.2020
GPIO in Bash - Esempio
24
© FB - 12.2021
Lampeggio led
25
© FB - 12.2021
Utilizzare wiringPi da Bash e l’utility gpio
wiringPi è disponibile come pacchetto standard in Raspbian:
pi@raspberrypi:~ $ sudo apt install wiringpi�pi@raspberrypi:~ $ gpio -v�pi@raspberrypi:~ $ gpio readall # visualizzare i pin a disposizione
pi@raspberrypi:~ $ gpio mode 3 out�pi@raspberrypi:~ $ gpio write 3 1
https://www.vincenzov.net/tutorial/RaspberryPi/wiringpi.htm�https://projects.drogon.net/raspberry-pi/wiringpi/the-gpio-utility/
26
© FB - 02.2020
WiringPi
27
© FB - 05.2021
WiringPi
WiringPi è una libreria per l’accesso ai PIN GPIO scritta in C per i dispositivi SoC BCM utilizzati in tutti i Raspberry Pi.
WiringPi include un'utilità da riga di comando gpio che può essere utilizzata per programmare e configurare i pin GPIO, sia per leggere che per scrivere i pin. Può essere utilizzata per controllare i pin tramite script di shell.
WiringPi Resources:
28
© FB - 12.2021
WiringPi - Esempio LedBlink
29
© FB - 12.2021
WiringPi
30
© FB - 12.2021
WiringPi deprecated
WiringPi è stato incluso in Raspberry Pi OS (non Bullseye), sebbene la versione (2.50) attualmente inclusa non supporti Pi4. È disponibile un aggiornamento alla 2.52 per Raspberry Pi4, datato 24 giugno 2019, disponibile per il download. WiringPi è stato ritirato il 6 agosto 2019 e non è disponibile alcun supporto per funzionalità aggiuntive su Pi4. WiringPi non è disponibile in Raspberry Pi OS - Bullseye.[ref]
$ cd
$ git clone https://github.com/WiringPi/WiringPi
$ cd WiringPi
$ ./build
31
© FB - 01.2022
Utilizzare wiringPi da Bash e l’utility gpio
pi@raspberrypi:~ $ gpio -v # documentazione ufficiale�pi@raspberrypi:~ $ gpio readall # visualizzare i pin a disposizione
pi@raspberrypi:~ $ gpio mode 3 out�pi@raspberrypi:~ $ gpio write 3 1
32
© FB - 02.2022
GPIO in Python
33
© FB - 12.2021
GPIO in Python con la libreria RPi.GPIO
La libreria RPi.GPIO è stata rilasciata all'inizio del 2012 dallo sviluppatore Ben Croston. È una solida libreria che consente agli utenti di controllare i pin GPIO tramite codice Python.
34
© FB - 12.2021
GPIO in Python con la libreria GPIO Zero
La libreria GPIO Zero è una libreria Python per lavorare con i pin GPIO. È stata scritta dal community manager di Raspberry Pi Ben Nuttall. Mirato a essere intuitivo e "amichevole", semplifica il codice Python per la maggior parte degli utilizzi. Questa libreria è una delle più complete disponibili.
GPIO Zero è già installata nell'immagine desktop del sistema operativo Raspberry Pi.
La documentazione completa è disponibile su https://gpiozero.readthedocs.io/
35
© FB - 12.2021
LedBlink con GPIO Zero
Per scrivere il programma Python con Windows possiamo usare Thonny, disponibile anche come software preinstallato nelle ultime versioni di Raspbian.
from gpiozero import LED
from time import sleep
led = LED(17)
while True:
led.on()
sleep(1)
led.off()
sleep(1)
36
© FB - 12.2021
GPIO in altri linguaggi
37
© FB - 12.2021
Altro
38
© FB - 12.2021
Esercitazione
39
Esercizio a�Led blink
40
© FB - 12.2021
Led blink
Scrivere un programma che faccia lampeggiare il led collegato alla rasberry n volte ad intervalli di m secondi
n = 3 + iniziale cognome�m = iniziale nome/20*1000
In C usare la funzione int usleep(useconds_t usec);
In Bash usare il comando sleep
41
© FB - 12.2021
Esercizio b�Luci smart auto
42
© FB - 12.2021
Luci smart auto
Progettare un sistema (simile a quello dell’accensione luci interne auto) che rilasciato il pulsante accenda il led. Dopo 2 minuti (5 sec) il led si deve spegnere automaticamente. Con Flowgorithm disegnare il diagramma di flusso
Collegare la Raspberry PI e vedere l’indirizzo ip, collegarsi da un pc remoto con ssh e scrivere lo script bash richiesto. Documentare le varie fasi del progetto e aggiungere il documento alla propria�tabella progetti.
43
© FB - 01.2022
Accensione luci interne auto intelligente
44
© FB - 12.2021
Traccia per lo svolgimento progetto
TITOLO: Luci auto smart
OBIETTIVO: Progettare un sistema (simile a quello dell’accensione luci interne auto) che rilasciato il pulsante accenda il led. Dopo 2 minuti (5 sec) il led si deve spegnere automaticamente.
PREMESSE TEORICHE: <richiamare gli argomenti teorici necessari per realizzare il progetto>
PROGETTO: definizione dell’hardware, schema elettrico, con Flowgorithm disegnare il diagramma di flusso
45
© FB - 01.2022
Schema elettrico
46
© FB - 02.2022
Traccia per lo svolgimento progetto
IMPLEMENTAZIONE:
47
© FB - 01.2022
Traccia per lo svolgimento progetto
LAVORO PRELIMINARE OPZIONALE:
48
© FB - 02.2022
Traccia per lo svolgimento progetto
IMPLEMENTAZIONE:
COLLAUDO:
49
© FB - 02.2022
Esercizio c
50
© FB - 12.2021
Display oled
Collegare il display oled alla Raspberry e scrivere un script che visualizzi indirizzo ip e hostname utilizzando il programma “oled”�./oled "$(hostname): $(hostname -I)"
51
© FB - 01.2022
Esercizio d
52
© FB - 12.2021
Display oled
Scrivere un programma che letto un argomento da linea di comando lo visualizzi sul display. esempio:
./oled "$(hostname) $(hostname -I)"
53
© FB - 12.2021
Esercizio e
54
© FB - 12.2021
GPIO e thread
Realizzare un'applicazione con thread che faccia lampeggiare ad intervalli distinti due led collegati ai pin GPIO della Raspberry PI�
Definizione delle specifiche di progetto, analisi dei requisiti
Disegno (progettazione)
55
© FB - 12.2021
Valutazione
56
Consegna del lavoro
Raccogliere in un documento, da aggiungere alla tabella progetti, i passaggi principali dell’esercitazione
57
© FB - 12.2021
Grazie per l’attenzione
58
Link/Riferimenti
59
© FB - 05.2021
Revisioni
v1.0 14/05/21 - versione iniziale�v1.1 02/02/22 - nuovi esempi ed esercizi
60