Sei sulla pagina 1di 71

Raspberry…Python

Python è il linguaggio di programmazione scelto dalla Fondazione Raspberry

Per verificare la sua presenza in un computer basta digitare, nella finestra di


terminale, il comando:

python -V (maiuscolo)

Se è presente, l'interprete Python ci risponde con la versione installata.

Se si digita unicamente:

python

si apre l'ambiente di programmazione


Raspberry…Python
Python è un linguaggio interpretato e non richiede di essere compilato prima
dell'esecuzione

La struttura dei programmi si imposta indentando i gruppi di istruzioni in base


alla logica che si vuole realizzare. Non esistono parentesi graffe che
racchiudono i gruppi di istruzioni o istruzioni "end" che chiudono cicli "while"
o strutture "if".

Non si usano caratteri di chiusura delle istruzioni, come il ‘’;’’ in C.

La struttura del programma si imposta indentando correttamente le istruzioni,


in modo da rispettare i blocchi di istruzioni che appartengono a sequenze, cicli
e selezioni. Solo le istruzioni di selezione sono terminate da ":"
Raspberry…Python
Tabella delle parole/istruzioni chiave del linguaggio
Raspberry…Python
Per lanciare un programma si deve usare la forma:

python nome-file

Proviamo la linea di comando e digitiamo:

python

al prompt " >>>" digitate:

print "Ciao a tutti " seguito da "invio"


Raspberry…Python

L'istruzione viene eseguita immediatamente.


Per chiudere digitate:
exit ()
Raspberry…Python
Passiamo all'utilizzo di Python in modalità "normale", cioè con il listato del
programma contenuto in un file di testo. Possiamo utilizzare ‘’Geany’’, inserito nelle
distribuzioni per la scrittura e la modifica di programmi in vari linguaggi.
Raspberry…Python
La prima riga è il
cosiddetto shebang, una
direttiva per l'interprete
a linea di comando che
indica quale "interprete"
di linguaggio utilizzare
per l'esecuzione del
programma. Nel nostro
caso il Python
Raspberry…Python
Salviamo il programma in /home/pi
Raspberry…Python
Digitiamo:

python /home/pi/Prova .py


Raspberry…Python
Iniziamo ad utilizzare i GPIO pins…Premettiamo che..

GPIO, essendo un registro hardware, è comandabile nativamente dal sistema


operativo attraverso alcuni comandi, che possono essere lanciati da riga di
comando, o da programma scritto ad hoc.

Il valore più “standard” a cui fare riferimento è il numero BCM, ma attenzione


che il numero BCM non ha una corrispondenza diretta con il reale PIN. Ad
esempio, al BCM 17 corrisponde il pin fisico 11.

(La codifica BCM è la codifica “nativa” di Raspberry PI, ed in particolare del


chip BCM2835, e viene utilizzata per comandare i singoli Pin da linguaggi come
ad esempio Python o altre librerie).
Raspberry…Python
l circuito più “basic” possibile è sicuramente l’accensione di un LED
tramite GPIO.

Innanzitutto, come ricordato in precedenza, i pin


del GPIO vanno sempre protetti con una
resistenza al fine di limitare la corrente (sia in
ingresso che in uscita). Per un LED è sufficiente
una resistenza da 330 Ω – 1k Ω

Colleghiamo il pin 6 (ground) alla massa e il


pin 11 (BCM 17) al segnale (+).
Raspberry…Python
Colleghiamo il pin 6 (ground) alla massa e il
pin 11 (BCM 17) al segnale (+).
Raspberry…Python
Apriamo Geany e scriviamo il seguente codice per la gestione dell’accensione e
lampeggio di un LED
Raspberry…Python
Code per accendere (e far lampeggiare) un LED
Raspberry…Python
Digitare
sudo python LED.py

CTRL+C per uscire dal programma


Raspberry…Python
Esempio con LED and BUTTON:

Il circuito farà una cosa molto semplice:

di default sarà acceso un LED

Tendendo premuto il pulsante, spegniamo il


LED e accendiamo quello accanto.
Raspberry…Python

…continua..
Raspberry…Python
…continua..
Raspberry PI – Sensori
Lettura dati dai sensori - Temperatura (Termistore NTC - Analogico)

Termistore NTC
Raspberry PI – Sensori
Lettura dati dai sensori - Temperatura (Termistore NTC - Analogico)

Il termistore NTC e connesso è collegato, attraverso un partitore di tensione,


all’integrato PCF8591 che si occupa di effettuare la conversione analogico
digitale, come evidenziato in figura

Integrato PCF8591

Termistore NTC
Raspberry PI – Sensori
Lettura dati dai sensori - Temperatura (Termistore NTC - Analogico)

Il PCF8591 è un Convertitore Analogico Digitale (ADC: Analog to Digital


Converter) ADC ad 8 bit

Premettiamo che…un ADC è un circuito che converte una tensione analogica


(fornita ai capi del nostro termistore), compresa in un certo intervallo, in un
numero intero binario, anche lui compreso in un intervallo, in modo esso possa
essere elaborato dai circuiti digitali.

Ovviamente questa operazione implica un'approssimazione:

- Due tensioni in ingresso vicine tra di loro possono essere convertite nello
stesso numero intero in uscita

- Ad un numero in uscita non corrisponde una tensione precisa, ma un (piccolo)


intervallo di tensioni
Raspberry PI – Sensori
La conversione Analogico - Digitale

Il simbolo spesso utilizzato per un ADC è il seguente:

In ingresso (linee inclinate, In uscita (linee


non la punta di una freccia) è squadrate, a gradino),
rappresentata una sinusoide, un'onda quadra, tipico
tipico segnale analogico segnale digitale
Raspberry PI – Sensori
La conversione Analogico - Digitale
Il legame tra ingresso e uscita di un ADC può essere rappresentato con il grafico “a
scala”, come riportato nella figura esemplificativa seguente:

In ascissa è riportato l'ingresso:


sono per esempio ammessi tutti i
valori di tensione compresi tra 0 e
10 V (in questo esempio).

La massima tensione che l'ingresso


può assumere viene detta tensione
di fondo scala (VFS, nell'esempio
pari a 10 V).
Raspberry PI – Sensori
La conversione Analogico - Digitale
In ordinata sono riportato i valori numerici
binari in uscita, otto nell'esempio. Si noti
che non sono ammessi valori intermedi a
quelli indicati
Guardando il grafico si vede, per esempio,
che la tensione di 3 V viene convertita nel
numero 010; anche la tensione di 2,7 V
3
viene convertita nello stesso numero 010,
V
a causa delle approssimazioni introdotte.
La tensione di 4,5 V viene invece
convertita nel numero 011
2.7V
Con il termine risoluzione si indica il numero di bit necessari per esprimere il
massimo numero in uscita al convertitore, che di solito è una potenza di due.
Nell'esempio in figura l'uscita dell'ADC è un numero intero compreso tra 0 e 7
(000... 111 in binario). Quindi la risoluzione è pari a 3 bit.
Raspberry PI – Sensori
La conversione Analogico - Digitale
La “lunghezza” di un gradino (in genere tutti uguali tra loro) si indica con il
termine quanto (Q). Esso indica la minima variazione della tensione in
ingresso che causa una variazione nel codice binario in uscita. L'operazione
di approssimazione di una tensione ad un numero intero si
chiama quantizzazione.
Nel caso in esempio:
quanto (Q)

In genere la risoluzione è molto più


elevata dei 3 bit dell'esempio: nel
mondo reale varia tra 8 e 16 bit e anche
oltre. Più è elevata la risoluzione, in
genere, migliore è il convertitore
perché migliore è l'approssimazione
effettuata nella conversione (“gradini”
più piccoli).
Raspberry PI – Sensori
La conversione Analogico - Digitale
Per digitalizzare un segnale variabile nel tempo è necessario, prima di
effettuare la quantizzazione, individuare, istante dopo istante, alcuni valori di
tensione da sottoporre successivamente a quantizzazione. Questa operazione
si chiama campionamento e, praticamente sempre, viene effettuata ad
intervalli di tempo costanti. L'intervallo T tra due istanti di campionamento si
chiama periodo di campionamento; il suo inverso frequenza di
campionamento

Dato un generico segnale


variabile nel tempo, solo i
punti evidenziati saranno
sottoposti a quantizzazione.
Raspberry PI – Sensori
Il protocollo I2C
Vediamo ora come comunica l’integrato ADC PCF8591 con la scheda
Raspberry PI. Esso usa il protocollo di comunicazione digitale I2C
Il protocollo I2C (pronuncia I-quadro-C, in Inglese I-squared-C) è stato creato
dalla Philips Semiconductors nel 1982; la sigla, comunemente indicata anche
con con I2C, sta per Inter-Integrated Circuit.
Il protocollo permette la comunicazione di dati tra due o più dispositivi I2C
utilizzando un bus (canale di comunicazione ) a due fili, più uno per il
riferimento comune di tensione (la massa)

In tale protocollo le informazioni sono inviate serialmente usando una


linea per i dati (SDA: Serial Data line) ed una per il Clock (SCL: Serial
Clock line).
Raspberry PI – Sensori
Il protocollo I2C

Microcontrollore (Master =
inizia la comunicazione) Dispositivo Slave =
(Il microprocessore di risponde alla
Raspberry nel nostro caso) comunicazione
(Il nostro ADC)

Due linee di comunicazione:


SDA per lo scambio dei dati
SCL per il segnale di
temporizzazione (clock)
Raspberry PI – Sensori
Il protocollo I2C
Una sequenza elementare di lettura o scrittura di dati tra master e slave segue il
seguente ordine :

1. Invio del bit di START (S) da parte del master


2. Invio dell’indirizzo dello slave (ADDR) ad opera del master

3. Invio del bit di Read (R) o di Write (W), che valgono rispettivamente 1 e 0 (sempre ad
opera del master)

4. Attesa/invio del bit di Acknowledge (ACK)

5. Invio/ricezione del byte dei dati (DATA)

6. Attesa/invio del bit di Acknowledge (ACK)

7. Invio del bit di STOP (P) da parte del master


Raspberry PI – Sensori
Il protocollo I2C

Sequenza
di start

1 2 3 4 Sequenza
di stop

5 6 7
Raspberry PI – Sensori
Lettura dati dai sensori - Temperatura
(Termistore NTC - Analogico)

Le linee del bus I2C, SDA (dati)


ed SCL (clock), sono collegate
rispettivamente ai pin fisici 3 e 5
del connettore GPIO di
Raspberry Pi

Il bus di comunicazione I2C con


l'integrato convertitore PCF8591
funziona con i livelli a 3,3 V
Raspberry PI – Sensori
Lettura dati dai sensori – Pin da utilizzare
Raspberry PI – Sensori
Lettura dati dai sensori – Termistore NTC

Come accennato prima, l'elemento che


realizza il sensore di temperatura è la
resistenza NTC da 10 kohm, collegata,
tramite il partitore di tensione composto
da R16 e dall'NTC stessa, all'ingresso
analogico AN_0 dell'integrato
PCF8591.
La tensione di riferimento per la misura
degli ingressi analogici è fornita dalla
resistenza di limitazione R18, dal diodo
Zener DZ1 e dal condensatore
elettrolitico C1, che mantiene stabile la
tensione.
Raspberry PI – Sensori
Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la
lettura del valore di temperatura rilevato dal sensore
Raspberry PI – Sensori
Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la
lettura del valore di temperatura rilevato dal sensore
Raspberry PI – Sensori
Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la
lettura del valore di temperatura rilevato dal sensore
Raspberry PI – Sensori
Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la
lettura del valore di temperatura rilevato dal sensore
Raspberry PI – Sensori
Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la
lettura del valore di temperatura rilevato dal sensore
Raspberry PI – Sensori
Lettura dati dai sensori – Temperatura (Termistore NTC) – script in Python per la
lettura del valore di temperatura rilevato dal sensore
Raspberry PI – Sensori
Libreria per la comunicazione con protocollo I2C usata nel programma
Raspberry…Arduino
Interfacciamo Raspberry PI con Arduino
Raspberry…Arduino
Interfacciamo Raspberry PI con Arduino: pacchetti da installare:

Package: arduino (2:1.0.5+dfsg2-4.1)


Raspberry…Arduino
Interfacciamo Raspberry PI con Arduino: pacchetti da installare:

Package: openjdk-8-jre (8u151-b12-1~deb9u1)


Raspberry…Arduino
Interfacciamo Raspberry PI con Arduino: pacchetti da installare:

Package: default-jre (2:1.8-58)


Raspberry…Arduino
Interfacciamo Raspberry PI con Arduino: IDE Arduino
Raspberry…Arduino
Interfacciamo Raspberry PI con Arduino: Carichiamo lo sketch:
Raspberry…Node-RED
Apriamo Node-RED
Raspberry…Node-RED
Visualizziamo l’indirizzo con cui collegarci a Node-RED: http:// IP di Raspberry:1880

Digitiamo sul nostro browser l’indirizzo di Node-RED


Raspberry…Node-RED
L’ambiente Node-RED

Le applicazioni Node-RED sono definite come "flow" (flusso) la rappresentazione


visuale è realizzata attraverso HTML (ed in parte anche JavaScript) mentre la
parte implementativa ed elaborativa esclusivamente in JavaScript, in quanto tutto
si basa sul framework NodeJS (JavaScript server side).
I "blocchi" che compongono il flusso sono chiamati "nodi" .

Nodi
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Un’applicazione è costituita da una serie di blocchi (nodi).

Tali blocchi utilizzano una o più porte (sia in ingresso che in uscita) per poter
essere collegati tra loro attraverso delle connessioni in modo da costituire una
rete nell’ambito della quale comunicano scambiandosi dati sotto forma di
messaggi noti anche come “information packets” (IP).

Il programma non è più una sequenza di istruzioni ma è caratterizzato da un


insieme di flussi di dati che vengono scambiati tra i blocchi in maniera
completamente asincrona.

Le “strade” percorse dai dati possono essere molteplici e parallele.


Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming
Realizzeremo un semplicissimo flow nel quale iniettare come ingresso il nostro
nome (es. Paolo) e visualizzare sulla finestra di debug il messaggio “Hello,
<nome> !” (es. Hello, Paolo !).

Dalla toolbox sul lato sinistro, tra i nodi di “input”, trasciniamo il nodo
denominato inject all’interno dello sheet
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming
Realizziamo un semplicissimo flow nel quale iniettare come ingresso il nostro
nome (es. Paolo) e visualizziamo sulla finestra di debug il messaggio “Hello,
<nome> !” (es. Hello, Paolo !).

Dalla toolbox sul lato sinistro, tra i nodi di “input”, trasciniamo il nodo
denominato inject all’interno dello sheet

Questo nodo permette


di “iniettare” un
messaggio all’interno
del flusso in modalità
“on demand” ossia alla
pressione del tasto che
troviamo alla sinistra
del nodo stesso oppure
in maniera periodica
ed automatica
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Per default, il payload del messaggio (il dato) è un timestamp ma possiamo


specificare una stringa oppure lasciarlo completamente vuoto; quest’ultimo
caso può essere utile quando vogliamo rappresentare un evento che non abbia
necessariamente del contenuto informativo da portare con sé.

Una volta trascinato il


nodo all’interno del
flusso, se clicchiamo
due volte su di esso,
sarà visualizzata una
finestra per la relativa
configurazione.
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Cambiamo solo il tipo di payload da “timestamp” a “string” ed assegnare come


valore per tale stringa il proprio nome (es. Paolo); possiamo eventualmente
assegnare un nome al nodo (in modo da riconoscerlo nel flusso) utilizzando il
campo “Name”
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming
Attraverso l’impostazione “Repeat” è possibile specificare un’eventuale
periodicità con cui il messaggio deve essere iniettato (es. ogni 10 sec), in
quale intervallo temporale (es. dalle 10:00 alle 12:00 del Lunedi) oppure in
un istante preciso (es. alle 11:00 di ogni giorno).
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Il nodo di “inject” ha alla sua sinistra un tasto attraverso il quale possiamo


iniettare quando vogliamo il messaggio nel flusso e sulla sua destra un piccolo
quadratino che rappresenta la porta di uscita grazie al quale possiamo collegarlo
ad un altro nodo, in modo tale che il messaggio prodotto in uscita diventi
l’ingresso per il nodo successivo.
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Abbiamo a disposizione il messaggio che porta con se la stringa contenente il


nostro nome, a questo punto vogliamo processarlo per poter generare un nuovo
messaggio contenente l’intera stringa “Hello, <nome>!” da visualizzare
attraverso il nodo di debug. Per fare ciò, trasciniamo all’interno del flusso il
nodo “function” che troviamo nell’omonima sezione di nodi della toolbox
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming
La relativa finestra di configurazione che in questo caso è un vero e proprio
“piccolo editor” grazie al quale possiamo scrivere del codice JavaScript che
effettua l’elaborazione di cui abbiamo bisogno.

Ogni messaggio viaggia nel flusso


sotto forma di oggetto JSON
chiamato “msg” con le due seguenti
proprietà:
- payload contiene il body
del messaggio (nel nostro caso la
stringa con il nostro nome)
- topic rappresenta il medesimo
concetto di topic del protocollo
MQTT
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Attraverso il campo “Outputs”, il numero di porte di uscita che esso deve avere
(di default una sola porta) e quindi poter restituire un array di messaggi in
luogo del singolo messaggio.
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Terminata la configurazione del nodo, possiamo collegare la porta di uscita


del nodo “inject” con la porta di ingresso del nodo “function”
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Uno dei nodi utilizzati tipicamente per funzionalità di debug è l’omonimo nodo
che possiamo trovare nella toolbox all’interno della sezione “output”. Attraverso
di esso, abbiamo la possibilità di stampare il contenuto del messaggio ricevuto in
ingresso nella “debug tab” che troviamo sul lato destro all’interno brower.
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Attraverso il campo “Output” possiamo specificare se deve essere visualizzato


l’intero messaggio (in formato JSON) oppure solo il corrispondente payload; nel
campo “to” è possibile impostare la visualizzazione nella “debug tab” oppure
anche sulla console (da cui abbiamo lanciato Node-RED
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Colleghiamo la porta di output del nodo “function” con la porta di input del
nodo “debug”

Il tasto quadrato che troviamo alla destra del nodo “debug” permette di
disattivare la visualizzazione nella “debug tab”; in questo modo possiamo
escludere il debugging senza rimuovere i nodi dal flusso ma semplicemente
disabilitandoli.
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Effettuare il deploy del flusso utilizzando il tasto di “Deploy”


1

2
Cliccare su ‘’inject’’
Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Effettuare il deploy del flusso utilizzando il tasto di “Deploy”


Raspberry…Node-RED
L’ambiente Node-RED - Flow-Based Programming

Per evidenziare la modalità con cui i messaggi si muovono nel flusso sotto forma
di oggetti JSON, modifichiamo la configurazione del nodo “debug” impostando il
campo “Output” su “complete msg object” ed il campo “to” su “debug tab and
console”; ogni qual volta eseguiamo una modifica al flusso, va ovviamente
rieseguito il deploy dello stesso.
Raspberry…Node-RED
L’ambiente Node-RED: installiamo la ‘’dashboard’’ con cui creare un’interfaccia grafica
per l’utente
Raspberry…Node-RED
…per far questo…

Cliccare per aprire il


menu
Raspberry…Node-RED
Dobbiamo installare ‘’Manage palette’’
Raspberry…Node-RED
Per installare ‘’Manage palette’’ apriamo LX terminal e digitiamo i seguenti comandi:

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install npm

sudo npm install -g npm@ 3.x

P.S.
Per verificare la versione in uso di Node-RED digitare: node -v

Per verificare la versione in uso di npm digitare: npm -v


Raspberry…Node-RED
Colleghiamoci a http:// indirizzo IP di Raspberry:1880

E verifichiamo che abbiamo installato ‘’Manage palette’’

Potrebbero piacerti anche