Raspberry…PythonPython è 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.
python
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
python nome-file
python
Raspberry…Python
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
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.
Iniziamo ad utilizzare i GPIO pins…Premettiamo che..
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
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
Raspberry PI – Sensori Lettura dati dai sensori - Temperatura
(Termistore NTC - Analogico)
Termistore NTC
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
Termistore NTC
Integrato PCF8591
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
Il simbolo spesso utilizzato per un ADC è il seguente:
In ingresso (linee inclinate, non la punta di una freccia) è
rappresentata una sinusoide, tipico segnale analogico
In uscita (linee squadrate, a gradino), un'onda quadra, tipico
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).
quelli indicati
che la tensione di 3 V viene convertita nel
numero 010; anche la tensione di 2,7 V
viene convertita nello stesso numero 010,
a causa delle approssimazioni introdotte.
La tensione di 4,5 V viene invece
convertita nel numero 011
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
3 V
2.7V
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.
quanto (Q)
Nel caso in esempio:
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 La conversione Analogico - Digitale
Il protocollo I2C Vediamo ora come comunica l’integrato ADC PCF8591
con la scheda
Raspberry PI. Esso usa il protocollo di comunicazione digitale
I2C
Raspberry PI – Sensori
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).
Il protocollo I2C
(Il microprocessore di Raspberry nel nostro caso)
Dispositivo Slave = risponde alla
comunicazione (Il nostro ADC)
Due linee di comunicazione: SDA per lo scambio dei dati SCL per il
segnale di temporizzazione (clock)
Raspberry PI – Sensori
Raspberry PI – Sensori
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
Il protocollo I2C
Sequenza di start
Sequenza di stop
5 6 7
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
Lettura dati dai sensori - Temperatura (Termistore NTC -
Analogico)
Raspberry PI – Sensori
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 PI – Sensori
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:
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
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”
Cliccare su ‘’inject’’
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 npm install -g
[email protected] 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’’