Il nuovo redditometro Francesca Stradini Università di Urbino “Carlo Bo”
UNIVERSITA DEGLI STUDI DI URBINO CARLO BO · 2019. 9. 11. · UNIVERSITA DEGLI STUDI DI URBINO...
Transcript of UNIVERSITA DEGLI STUDI DI URBINO CARLO BO · 2019. 9. 11. · UNIVERSITA DEGLI STUDI DI URBINO...
UNIVERSITA DEGLI STUDI DIURBINO CARLO BO
CORSO DI INFORMATICA APPLICATA
”IA Training Camp 2019”
MANUALE ESERCITAZIONI
Costruiamo una smart-home con Raspberry Pi
Autore
Paolo Capellacci
DOCENTE: Emanuele Lattanzi
Indice
1 Introduzione 1
1.1 Raspberry pi 3 ModelB+ . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Installazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Modalita GPIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Setup e Configurazioni 6
2.1 Moduli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Connessione SSH e VNC Viewer . . . . . . . . . . . . . . . . . . . . . 6
2.3 Configurazione di rete . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Configurazione Video . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3 Ambienti di sviluppo 12
3.1 Python3 (IDLE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Thonny Python IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3 Bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4 Applicazioni 15
4.1 Accensione di un LED . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.2 Pulsante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.3 Pulsante e Led . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
INDICE I
INDICE
4.4 Segnali analogici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.4.1 Sensore di luminosita - fotoresistenza 5516 . . . . . . . . . . . 20
4.4.2 LM35 Sensore di Temperatura . . . . . . . . . . . . . . . . . . 21
Elenco delle figure 21
Bibliografia 22
INDICE II
Capitolo 1
Introduzione
Il Raspberry Pi e un single-board computer sviluppato nel Regno Unito dalla Ra-
spberry Pi Foundation. La scheda e stata progettata per ospitare sistemi operativi
basati sul kernel Linux o RISC OS. E stato sviluppato anche un sistema operativo
appositamente dedicato, chiamato Raspbian.
Il progetto ruota attorno a un system-on-a-chip di fabbricazione Broadcom che
incorpora un processore ARM, una GPU VideoCore IV, e 1 Gigabyte di memoria. Il
progetto non prevede ne hard disk ne una unita a stato solido, affidandosi invece a
una scheda SD per il boot e per la memoria non volatile.
1.1 Raspberry pi 3 ModelB+
Il modello di riferimento e Raspberry Pi 3 Model B+ rappresentato in Figura 1.1
• SoC: Broadcom BCM2837B0 Quad Core Cortex-A53 a 1.4 GHz, 32 kB L1 e 512
kB L2.
• GPU: Broadcom VideoCore IV Dual Core a 400 MHz.
• RAM: 1GB LPDDR2 a 900 MHz.
1
Cap. 1 Introduzione §1.2 Installazione
Figura 1.1: Raspberry pi 3 Model B+
• Rete: wireless dual-band a 2,4 GHz e 5 GHz e quello per Bluetooth 4.2 e
Bluetooth Low Energy, Gigabit Ethernet
• Porte: microSD, HDMI 1.4, CEC Jack 3.5 mm, 4xUSB 2.0.
• GPU: Interfacce: CSI Camera Connector, DSI Display Connector, GPIO header
40-pin.
• Dimensioni: 85 x 56 x 17 mm.
1.2 Installazione
Prima di procedere assicurarsi di avere a disposizione sia una scheda sd micro da al-
meno 16GB e possibilmente con buone prestazioni per l’accesso dati, un alimentatore
2
Cap. 1 Introduzione §1.3 Modalita GPIO
appropriato da 5V e 3A, un monitor e il relativo cavo HDMI, mouse e tastiera. La
procedura di installazione e reperibile all’url:
https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/1.
Una volta preparata la scheda con la versione del sistema operativo selezionato, la
si inserisce nell’apposito alloggiamento e si collegano tutti i cavi. Quando appare la
schermata tipica di Raspberry, selezionare un’eventuale rete wifi o utilizzare un colle-
gamento LAN per reperire gli aggiornamenti da internet. Selezionare la distribuzione
consigliata e attendere il completamento del download e il riavvio del dispositivo. Se
siete arrivati sin qui, il dispositivo e pronto.
1.3 Modalita GPIO
Il dispositivo mette a disposizione 40 pin ed essi si possono utilizzare con diverse
configurazioni. La Figura 1.2 mostra lo schema dei pin.
Il GPIO e l’aspetto piu semplice, ma accessibile del Raspberry Pi. I pin GPIO
sono digitali, vuol dire che possono avere solo due stati, spento o acceso. Possono
avere una direzione per ricevere o inviare corrente (input, output rispettivamente)
e questo e tutto completamente controllabile tramite linguaggi di programmazione
come Python, JavaScript, node-RED ed altri. I pin funzionano con una tensione di
3, 3 V e con un assorbimento massimo di corrente di 16 mA. Questo significa che
possiamo alimentare in modo sicuro, da un singolo pin GPIO, tramite un resistore,
uno o due LED.
Per alimentare qualsiasi altra cosa richieda piu corrente, ad esempio un motore
DC, e decisamente necessario usare componenti esterni (come transistor) in modo da
evitare di danneggiare il GPIO. Per controllare il GPIO con Python va, per prima
cosa, importata una libreria di codice scritto in precedenza. La piu comune e diffusa
3
Cap. 1 Introduzione §1.3 Modalita GPIO
Figura 1.2: Raspberry-GPIO
e Rpi.GPIO, usata per creare migliaia di progetti sin dagli albori del Raspberry Pi.
In tempi piu recenti e stata introdotta un’altra libreria, denominata GPIO Zero, che
offre un’esperienza piu semplice per chi e nuovo a Python e all’elettronica di base.
Entrambe le librerie sono preinstallate nel sistema operativo Raspbian. Per quanto
riguarda la nomenclatura dei pin GPIO, vi sono vari modi per identificarli; il metodo
piu semplice ed ovvio e sicuramente quello che fa riferimento alla loro posizione fisica.
C’e un altro metodo usato, ed e la numerazione dei pin di Broadcom (BCM)
(GPIO pin numbering) che pero puo sembrare essere caotica, con GPIO17, 22 e 27
che si susseguono con quella che parrebbe una poca riflessione sulla numerazione
logica. In realta la mappatura dei pin BCM si riferisce ai pin GPIO che sono stati
direttamente collegati SoC del Raspberry Pi.
4
Cap. 1 Introduzione §1.3 Modalita GPIO
Infine, alcuni pin GPIO hanno anche funzioni secondarie che permettono loro di
interfacciarsi con diversi tipi di dispositivi che usano i protocolli I2C, SPI o UART.
Ad esempio, GPIO3 e GPIO4 sono anche pin SDA e SCL I2C usati per collegare
i dispositivi tramite il protocollo I2C. Per usare questi pin con questi protocolli, e
necessario abilitare le interfacce usando l’applicazione Raspberry Pi Configuration
disponibile nel sistema operativo Raspbian, nel menu Preferenze.
5
Capitolo 2
Setup e Configurazioni
2.1 Moduli
Per configurare l’ambiente in modo da poter eseguire gli esempi utilizzati in questo
corso sara necessario aggiungere il modulo spidev utile alla gestione dell’interfaccia
SPI di comunicazione digitale. Per semplificare la procedura e possibile utilizzare il
gestore dei pacchetti pip. Lanciando il seguente comando pip3 install spidev si
ottiene l’installazione del modulo.
2.2 Connessione SSH e VNC Viewer
Per utilizzare Raspberry da un’altra postazione o eventualmente da remoto si puo fare
uso del protocollo SSH o dell’app VNC Viewer. Prima di effettuare una connessione
ssh e necessario abilitare il servizio dal menu/configuration/interfaces ed abiltare il
servizio SSH. Figura 2.1.
Per quanto riguarda SSH, nel caso si utilizzi una macchina Linux o Mac, e suf-
ficiente un comando da terminale ssh [email protected] dove 192.168.xxx.xxx
rappresenta l’indirizzo di rete di Raspberry. Alla prima connessione viene inviato un
messaggio che chiede se vogliamo condividere le chiavi per la connessione, digitan-
6
Cap. 2 Setup e Configurazioni §2.2 Connessione SSH e VNC Viewer
Figura 2.1: Pannello per abilitare le connessioni ssh in entrata
do yes si conferma ed il prompt dei comandi mette a disposizione le risorse della
macchina Raspberry. Figura 2.2.
Figura 2.2: Connessione da terminale per la connessione in ssh
7
Cap. 2 Setup e Configurazioni §2.3 Configurazione di rete
Volendo utilizzare una macchina Windows sara necessario usare un’applicazione
per la comunicazione secondo il protocollo ssh, come, ad esempio, PuTTY che non
necessita di una installazione. Dopo aver inserito l’indirizzo della macchina e cliccato
su connetti, viene chiesto il nome utente e la password, come al solito alla prima
connessione la conferma delle chiavi. La Figura 2.3 mostra la configurazione per la
connessione.
Figura 2.3: App PuTTY
Per una connessione con desktop remoto si puo far uso di VNC Viewer dato che,
su Raspberry, l’applicazione server e gia istallata di default.
Per il download usare l’url: https://www.realvnc.com/en/connect/download/viewer/
La Figura 2.5 mostra la videata per la connessione, mentre la Figura 2.6 mostra il
desktop remoto connesso.
2.3 Configurazione di rete
Di default Raspberry e configurato per accettare un indirizzo dal DHCP del router.
Nel caso volessimo assegnare alla scheda un indirizzo statico, con il comando sudo
nano /boot/cmdline.txt si puo modificare il file ed aggiungere il nuovo indirizzo, per
esempio ip=192.168.1.10, alla fine del file. Affinche la modifica possa avere effetto
sara necessario riavviare la scheda Raspberry. Nota: Assicurarsi che L’indirizzo sia
libero nella maschera di rete in cui ci colleghiamo per non dare luogo a conflitti.
8
Cap. 2 Setup e Configurazioni §2.4 Configurazione Video
Figura 2.4: Videata per la configurazione della connessione
2.4 Configurazione Video
Per modificare la risoluzione del monitor, con il comando sudo nano /boot/config.txt
aprire il file e decommentare le righe
framebuffer width=1024
framebuffer height=768
all’occorrenza modificare i valori della risoluzione orizzontale e verticale a piacere. Poi
salvare e riavviare.
9
Cap. 2 Setup e Configurazioni §2.4 Configurazione Video
Figura 2.5: Videata dell’app VNC Viewer
10
Cap. 2 Setup e Configurazioni §2.4 Configurazione Video
Figura 2.6: Desktop remoto connesso con VNC Viewer
11
Capitolo 3
Ambienti di sviluppo
3.1 Python3 (IDLE)
Tramite questa applicazione e possibile editare un file python3 e, lanciando il comando
Run/Run Module, eseguire l’applicazione. All’avvio si aprira una seconda finestra che
gestira l’input/output dell’applicazione. Figura 3.1
Figura 3.1: IDE per programmare in python3
12
Cap. 3 Ambienti di sviluppo §3.2 Thonny Python IDE
3.2 Thonny Python IDE
Un’alternativa e Thonny Python IDE che mette a disposizione un’interfaccia piu ricca
poiche comprende il prompt dei comandi ed un riquadro per l’ispezione delle variabili
e delle funzioni che vengono richiamate durante l’esecuzione del programma. Figu-
ra 3.2
Figura 3.2: Thonny Python IDE
13
Cap. 3 Ambienti di sviluppo §3.3 Bash
3.3 Bash
Per una programmazione piu a basso livello si puo optare per un utilizzo tramite
terminale usando comandi bash. Prima di iniziare assicurarsi che l’utente appartenga
al gruppo gpio e per farlo servirsi del comando
groups
il comando fornisce un output simile:
pi adm dialout cdrom sudo audio video plugdev games users input netdev
gpio i2c spi
per attivare il pin 22
echo 22 > /sys/class/gpio/export
per definire la modalita input o output
echo out > /sys/class/gpio/gpio22/direction
1 per assegnare il valore di un’uscita a 5v, 0 per assegnare 0V
echo 1 > /sys/class/gpio/gpio22/value
Figura 3.3: Thonny Python IDE
14
Capitolo 4
Applicazioni
Per le esercitazioni si e fatto uso delle guide reperibile all url:
https://projects.raspberrypi.org/en/projects/physical-computing
dove si utilizza la libreria gpiozero reperibile all’url:
https://gpiozero.readthedocs.io/en/stable/
4.1 Accensione di un LED
Un qualsiasi led deve essere collegato, con una resistenza in serie, tra la massa (pin n.6
GND) ed una qualsiasi porta GPIO. In questa esercitazione e stato scelto il GPIO4 che
corrisponde al pin n. 7. La resistenza, nell’ordine delle centinaia di Ohm, serve a limi-
tare la corrente che attraversa il led evitandone il surriscaldamento ed eventualmente
la fusione.
# d i c h i a r a r e i modul i da impor tarefrom gpiozero import LEDfrom time import sleep
#d i c h i a r a r e una v a r i a b i l e con i l p in d i r i f e r imen t o per i l l e dled = LED(4)
# d e f i n i r e un c i c l o wh i l e per accendere e spegnere i l l e dwhile True:
# accendere i l l e d
15
Cap. 4 Applicazioni §4.1 Accensione di un LED
Figura 4.1: Configurazione per il collegamento del led, con un resistore da 220 Ω
led.on()
# i n s e r i r e una pausa d i mezzo secondosleep(0.5)
# spegnere i l l e dled.off()
# i n s e r i r e una pausa d i mezzo secondosleep(0.5)
16
Cap. 4 Applicazioni §4.2 Pulsante
4.2 Pulsante
Un qualsiasi pulsante normalmente aperto puo essere collegato tra la massa (in questo
caso pin n. 14 GND) ed una qualsiasi porta GPIO. In questo esercizio e stata scelta la
porta GPIO21 corrispondente al pin n. 40. I pin GPIO sono configurati di default con
resistenza di pull-up attivata. Per generare un interrupt quindi sara necessario portare
il pin al valore zero connettendolo alla massa. La funzione wait for press() della
classe Button blocchera il programma in attesa dell’interrupt sul pin designato. Alla
pressione del pulsante l’interrupt sblocchera l’esecuzione e verra finalmente eseguita
l’istruzione print("You pushed me").
Figura 4.2: Configurazione per il collegamento di un pulsante
# d i c h i a r a r e i modul i da impor tarefrom gpiozero import Button
# d i c h i a r a r e una v a r i a b i l e per i l p u l s an t e ed i l p in a s s o c i a t obutton = Button(21)
# met tere i l programma in a t t e s a che i l p u l s an t e venga premutobutton.wait for press()
# i n s e r i r e un messagg io a l l a p r e s s i on e d e l p u l s an t eprint(’You pushed me’)
17
Cap. 4 Applicazioni §4.3 Pulsante e Led
4.3 Pulsante e Led
Figura 4.3: Configurazione per il collegamento di un led e di un pulsante
# d i c h i a r a r e i modul i da impor tarefrom gpiozero import LEDfrom gpiozero import Buttonfrom time import sleep
# d i c h i a r a r e d e l l e v a r i a b i l i per i l l e d ed i l p u l s an t eled = LED(17)button = Button(21)
while True:
button.wait for press()# accendere i l l e dled.on()# at t endo 2 second isleep(2)# spegnere i l l e dled.off()
18
Cap. 4 Applicazioni §4.4 Segnali analogici
4.4 Segnali analogici
Raspberry non possiede un convertitore analogico digitale (ADC) pertanto, per ac-
quisire segnali analogici sara necessario utilizzare sistemi ADC esterni. In questa
esercitazione utilizziamo una ADC del tipo MCP3008 che converte i segnali analogici
in segnali digitali campionando a 200.000 campioni al secondo e con una risoluzione di
10 bit per campione. I valori digitalizzati vengono trasmessi al Raspberry tramite la
porta digitale SPI. I valori analogici vengono convertiti nell’intervallo [0.0, 1.0] dove
1 corrisponde alla tensione di alimentazione (nel nostro caso 3.3V). Il chip MCP3008
e stato collegato alle porte GPIO8, GPIO9, GPIO10 e GPIO11 che implementano la
comunicazione SPI.
Figura 4.4: Integrato MCP3008, per convertire un segnale analogico in digitale
19
Cap. 4 Applicazioni §4.4 Segnali analogici
4.4.1 Sensore di luminosita - fotoresistenza 5516
Una fotoresistenza e una resistenza con la particolarita di essere sensibile alla luce. Il
suo valore in Ohm e inversamente proporzionale alla quantita di luce che lo colpisce,
cioe diminuisce man mano che aumenta la luminosita, e la corrente elettrica che
l’attraversa e proporzionale all’intensita luminosa, cioe aumenta all’aumentare della
quantita di luce alla quale viene esposta. In genere tale tipo di resistore viene utilizzato
per creare interruttori crepuscolari, cioe attivabili con il calare della luce solare, e
disattivabili al sorgere del sole, naturalmente possono essere utilizzati in migliaia di
applicazioni diverse.
La fotoresistenza e stata collegata tra la massa (pin n. 6 GND) e 5V (pin n. 2,
5V) tramite una resistenza da 100 KΩ ed il suo valore misurato tramite il canale n.
2 dell’ADC (MCP3008)
# Sensore l um ino s i t \ ‘ a# importo i modul ifrom gpiozero import MCP3008from time import sleep
#de f i n i s c o una v a r i a b i l e per i l p in d e l s ensoreluminisita = MCP3008(2)
# de f i n i s c o un c i c l o wh i l e per i l l oopwhile True:
valore = luminosita.value
print("Luninosita: ", valore)
sleep(1)print(" ")
20
Cap. 4 Applicazioni §4.4 Segnali analogici
4.4.2 LM35 Sensore di Temperatura
L’LM35 permette di misurare temperature comprese nell’intervallo [-55C; 150C]
restituendo valori in tensione, dove ogni 10mV di tensione corrispondono ad un grado
centigrado. Quindi, con la temperatura di 20 gradi si avranno 200mV = 0.2V. Poiche
l’MCP3008 restituisce valori nell’intervallo [0,1], moltiplicando il valore campionato
per 3.3, la tensione di alimentazione di MCP3008, avremo la tensione espressa in Volt.
Moltiplicando ancora per 100 avremo la temperatura in gradi centigradi. tempC
= (valore * 3.3 * 100)
Moltiplicando la temperatura in gradi centigradi per 1.8 e aggiungendo 32 si ha
temperatura gradi in Fahrenheit. tempF = (tempC * 3.3 * 100)
# Sensore temperatura# importo i modul ifrom gpiozero import MCP3008from time import sleep
#de f i n i s c o una v a r i a b i l e per i l p in d e l s ensoresensore = MCP3008(0)
# de f i n i s c o un c i c l o wh i l e per i l l oopwhile True:
valore = sensore.valueprint("Valore: ", valore)
votls = valore ∗ 3.3print("Volts: ", volts)
tempC = (volts ∗ 100)tempF = tempC ∗ 1.8 + 32)print("Temperatura: ", tempC, " C ", tempF, " F")
sleep(1)print(" ")
21
Elenco delle figure
1.1 Raspberry pi 3 Model B+ . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Raspberry-GPIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1 Pannello per abilitare le connessioni ssh in entrata . . . . . . . . . . . 7
2.2 Connessione da terminale per la connessione in ssh . . . . . . . . . . 7
2.3 App PuTTY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Videata per la configurazione della connessione . . . . . . . . . . . . . 9
2.5 Videata dell’app VNC Viewer . . . . . . . . . . . . . . . . . . . . . . 10
2.6 Desktop remoto connesso con VNC Viewer . . . . . . . . . . . . . . 11
3.1 IDE per programmare in python3 . . . . . . . . . . . . . . . . . . . . 12
3.2 Thonny Python IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3 Thonny Python IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.1 Configurazione per il collegamento del led, con un resistore da 220 Ω 16
4.2 Configurazione per il collegamento di un pulsante . . . . . . . . . . . 17
4.3 Configurazione per il collegamento di un led e di un pulsante . . . . . 18
4.4 Integrato MCP3008, per convertire un segnale analogico in digitale . 19
22
Bibliografia
[1] Paolo Capellacci, “Esercitazioni Raspberry”, Universita di Urbino, 2019.
23