1 of 60

A - Programmazione di base

ES03 - Raspberry PI GPIO programming

FB - 12.2021 - v1.0

2 of 60

Raspberry PI GPIO programming

Gestione e utilizzo dei pin GPIO disponibili sulla Raspberry PI in C, Bash e Python.

2

© FB - 12.2021

3 of 60

Indice

3

© FB - 05.2021

4 of 60

Obiettivi didattici

4

5 of 60

Obiettivi didattici

  • Saper controllare i pin GPIO presenti nella scheda Raspberry PI in C
  • Saper controllare i pin GPIO presenti nella scheda Raspberry PI in Bash

5

© FB - 12.2021

6 of 60

Introduzione teorica

6

7 of 60

GPIO

7

© FB - 02.2022

8 of 60

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

9 of 60

Che aspetto ha un GPIO

9

© FB - 12.2021

10 of 60

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

11 of 60

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

12 of 60

GPIO Electrical Specifications

12

© FB - 05.2021

13 of 60

GPIO pins

13

© FB - 05.2021

14 of 60

GPIO Electrical Specifications

  • I diodi interni mostrati nella figura sono FET parassiti, possono proteggere da eventi transitori di bassa corrente causati da tensioni transitorie fuori intervallo applicate ai pin, ma non sono destinati a proteggere dall'applicazione di tensioni maggiori della tensione di alimentazione o inferiori a ground, anche con un resistore in serie esterno.
  • Il gate di ingresso rileva se il livello della tensione di ingresso è basso o alto confrontandolo con una tensione di soglia. Normalmente la soglia di tensione è di circa 1.8V, ma non è garantita; può essere ovunque tra l'ingresso massimo basso e l'ingresso minimo alto, cioè tra circa 0,8 e 2,0 V.

14

© FB - 05.2021

15 of 60

GPIO Electrical Specifications

  • L'uscita va a 3,3 V (alto) o 0 V (basso). Nello schema è mostrato un solo driver, ma in realtà ce ne sono diversi cablati in parallelo, con controllo software abilitato, in modo che l'impedenza del drive di uscita possa essere variata per offrire una sorgente da 2 mA a 16 mA e capacità di corrente di caduta, in incrementi di 2 mA.
  • Sebbene nella figura sia mostrato un valore di resistenza pull-up/down di 50 KΩ, Broadcom non ne specifica il valore. È probabile che sia compreso tra 40 e 100 KΩ. I transistor che abilitano il resistore pull-up/down contribuiscono ad esso con la loro apprezzabile resistenza non lineare, quindi la resistenza effettiva non è costante sulla tensione del pin di ingresso gamma. Il comportamento di pull-up è in qualche modo un incrocio tra resistenza costante e comportamento a corrente costante.
  • Raspberry Pi Documentation - General Purpose I/O (GPIO)Raspberry Pi OS - GPIO and the 40-pin Header

15

© FB - 05.2021

16 of 60

Pinout

16

© FB - 05.2021

17 of 60

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

18 of 60

Permissions

18

© FB - 05.2021

19 of 60

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

20 of 60

GPIO sysfs in Bash

20

© FB - 05.2021

21 of 60

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

22 of 60

GPIO in Bash

22

© FB - 12.2021

23 of 60

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

24 of 60

GPIO in Bash - Esempio

24

© FB - 12.2021

25 of 60

Lampeggio led

25

© FB - 12.2021

26 of 60

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.htmhttps://projects.drogon.net/raspberry-pi/wiringpi/the-gpio-utility/

26

© FB - 02.2020

27 of 60

WiringPi

27

© FB - 05.2021

28 of 60

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

29 of 60

WiringPi - Esempio LedBlink

29

© FB - 12.2021

30 of 60

WiringPi

30

© FB - 12.2021

31 of 60

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]

Per installarlo manualmente

$ cd

$ git clone https://github.com/WiringPi/WiringPi

$ cd WiringPi

$ ./build

31

© FB - 01.2022

32 of 60

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

33 of 60

GPIO in Python

33

© FB - 12.2021

34 of 60

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

35 of 60

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

36 of 60

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

37 of 60

GPIO in altri linguaggi

37

© FB - 12.2021

38 of 60

Altro

38

© FB - 12.2021

39 of 60

Esercitazione

39

40 of 60

Esercizio a�Led blink

40

© FB - 12.2021

41 of 60

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

42 of 60

Esercizio b�Luci smart auto

42

© FB - 12.2021

43 of 60

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

44 of 60

Accensione luci interne auto intelligente

44

© FB - 12.2021

45 of 60

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

46 of 60

Schema elettrico

46

© FB - 02.2022

47 of 60

Traccia per lo svolgimento progetto

IMPLEMENTAZIONE:

  • montaggio del circuito

47

© FB - 01.2022

48 of 60

Traccia per lo svolgimento progetto

LAVORO PRELIMINARE OPZIONALE:

  • testiamo il funzionamento base del circuito montato: Ci colleghiamo alla Raspberry PI, leggiamo l’indirizzo ip, ci colleghiamo da un pc remoto con ssh.
  • Prima di scrivere il codice completo testiamo il funzionamento di led e pulsante
    • Scriviamo un programma che faccia accendere il led
    • Scriviamo un programma che legga lo stato del pulsante, alla pressione accende il led e al rilascio lo spegne.

48

© FB - 02.2022

49 of 60

Traccia per lo svolgimento progetto

IMPLEMENTAZIONE:

  • traduzione del diagramma di flusso in codice

COLLAUDO:

  • verifichiamo il codice scritto documentando le varie prove eseguite

49

© FB - 02.2022

50 of 60

Esercizio c

50

© FB - 12.2021

51 of 60

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

52 of 60

Esercizio d

52

© FB - 12.2021

53 of 60

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

54 of 60

Esercizio e

54

© FB - 12.2021

55 of 60

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

  • pin sui quali sono collegati i led sono 4, 17
  • ip raspberry per ssh -> 93.63.169.237:2022 -> 10.10.0.100:22
  • intervalli per il lampeggio 1,3sec led1 e 3,4sec led2
  • pin e intervallo vengono passati come parametro al thread

Disegno (progettazione)

  • Disegnare lo schema elettrico.

55

© FB - 12.2021

56 of 60

Valutazione

56

57 of 60

Consegna del lavoro

Raccogliere in un documento, da aggiungere alla tabella progetti, i passaggi principali dell’esercitazione

57

© FB - 12.2021

58 of 60

Grazie per l’attenzione

58

59 of 60

Link/Riferimenti

59

© FB - 05.2021

60 of 60

Revisioni

v1.0 14/05/21 - versione iniziale�v1.1 02/02/22 - nuovi esempi ed esercizi

60