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.
python
Se si digita unicamente:
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
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
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
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
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
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).
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
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
3V
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
Microcontrollore (Master = inizia la comunicazione)
(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
Raspberry PI – Sensori Il protocollo I2C
Sequenza di start
Sequenza di stop
1 2 3 4
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
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 PI – Sensori
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”
Cliccare su ‘’inject’’
1
2
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’’