Internet of Things (IoT): un’esperienza partendo da zero (parte 1)

autore: Marco Picarella

 

Premessa

Poco più di venti anni fa mi sono occupato di ricerca in campo ambientale all’università. Una delle attività che seguivo era il monitoraggio di un corso d’acqua da un punto di vista chimico per valutarne lo stato di qualità. Ricordo che periodicamente mi recavo sul sito di campionamento dove era stata installata una centralina per la misura di temperatura, pH e conducibilità; il mio compito in questo caso era quello di scaricare i dati acquisiti dalla centralina per poi elaborarli in laboratorio. Questa operazione di per sé facile aveva delle difficoltà non proprio trascurabili in quanto gli strumenti di misura erano stati collocati in una posizione scomoda da raggiungere. Era una situazione molto frequente nel lavoro sul campo.

All’ultima edizione (2017) della Maker Faire di Roma mi sono imbattuto nello stand del dipartimento di elettronica dell’univerisità di Siena che presentava alcuni strumenti di monitoraggio dell’ambiente marino basati du Arduino. Fui in particolare colpito da quei sistemi che grazie ad un collegamento alla rete GSM i dati acquisiti venivano trasmessi direttamente su una piattaforma accessibile nel web. Affascinante anche il fatto che questi strumenti erano stati il prodotto di un “fai da te” (sebbene molto avanzato trattandosi di laboratori universitari) utilizzando materiale sostanzialmente open e quindi con costi decisamente inferiori a quelli che erano stati sostenuti a suo tempo per le mie attività di ricerca. Pensai allora tra me e me: “Ah, se avessi avuto anch’io queste possibilità!”. Fermo restando che l’attività di ricerca di un ecologo deve essere svolta anche all’aperto, è indubbio che dispositivi di questo tipo agevolano la raccolta dei dati.

Tutti questi vantaggi (rapidità, economicità, sicurezza degli operatori) sono altrettanto evidenti se intendiamo dare una finalità didattica all’attività di monitoraggio per lo studio dell’ambiente portandola in un contesto scolastico.

Stiamo quindi entrando nell’era dell’Internet of Things (IoT).

Quella che presento qui di seguito è la mia prima esperienza in assoluto nel campo dell’IoT ed è molto semplice da replicare, quindi consigliata a chi come me è affascinato dall’IoT ma ha limitate conoscenze di base.

In internet comunque è disponibile una grande mole di esempi con differenti gradi di difficoltà e che contemplano l’uso anche di altri strumenti oltre a quelli che descrivo io.

Si può quindi cominciare da qui per poi far crescere le proprie conoscenze navigando nel web.

Cosa occorre

La lista del materiale è in genere semplice e decisamente breve; nel mio caso consiste di:

  • Raspberry Pi
  • Thingspeak

 

R aspberry Pi si presenta come una piccola scheda elettronica ma in sostanza è un computer a tutti gli effetti. E’ prodotto dalla bitannica Raspberry Pi Foundation. Oltre ad avere un microprocessore e una memoria RAM, sulla scheda sono disponibili (mi riferisco alla versione Pi 3 model B che ho io): un’interfaccia GPIO con 40 pin per collegare la scheda a dispositivi esterni, quattro porte USB,  una porta HDMI per il collegamento ad un monitor esterno, uno slot per microSD che funge da memoria di massa e dove viene caricato il sistema operativo, una porta Ethernet, Bluetooth e WiFi. Quindi come si può vedere tutte le componenti di un normale computer.

Su Raspberry  si possono installare diversi sistemi operativi, principalmente basati su Linux, anche se nell’ultima versione si può utilizzare anche Windows 10 IoT. Soo disponibili due sistemi operativi: Noobs e Raspbian, entrambi derivati dal Debian (la stessa fonte di Ubuntu, una delle più note e diffuse distribuzioni Linux). Io ho usato Noobs perché pensato specificatamente per i principianti, avendo un’installazione molto semplificata e tutto ciò che serve per iniziare subito. Qui si trovano le istruzioni di installazione del sistema operativo. Ricordo che il sistema operativo va salvato su una microSD (io ne ho usato una da 8 GB).

Il Raspberry può essere alimentato dalla rete elettrica tramite il suo trasformatore (costa circa 10 euro) oppure tramite pacco batterie ricaricabili (ne esistono diversi modelli con costi variabili).

Il costo di Rapsberry Pi 3 modello B si aggira intorno ai 50 euro.

 

Per godere della massima portabilità del mio Raspberry io ho acquistato anche il monitor touchscreen ufficiale da 7 pollici che costa circa 75 euro, una cifra di tutto rispetto. Esistono comunque in commercio altri monitor, anche più piccoli e a prezzi più contenuti. Ad ogni modo come già scritto il Raspberry ha una porta HDMI che permette il collegamento ad un qualunque monitor che monta questo tipo di porta (tutti gli ultimi modelli).

Completa la configurazione hardware del mio Raspberry una tastiera ed un mouse wireless.

Raspberry: vista posteriore. In primo piano il display del Sense Hat. A destra le porte USB ed Ethernet della sottostante scheda Raspberry.

Raspberry: vista dall’alto con indicazione dei diversi “strati”

Raspberry: vista frontale (monitor touchscreen da 7 pollici)

 

Thingspeak è una piattaforma open source per l’IoT che permette di raccogliere ed archiviare dati inviati da vari dispositivi come Arduino, Raspberry Pi, BeagleBone Black, e altro hardware, su internet o su una rete locale.

La potenza di Thingspeak è la disponibilità, parzialmente gratuita, di strumenti di analisi e visualizzazione dei dati grazie all’integrazione del software MATLAB.

Per utilizzare Thingspeak occorre creare un account. La registrazione è gratuita.

I dati vengono archiviati in canali che possono essere privati o pubblici. Ogni canale può contenere un massimo di otto serie di dati. Sono disponibili anche funzioni di importazione ed esportazione dei dati.

 

E per quanto riguarda le abilità da possedere per intraprendere esperienze di IoT? Quello che posso consigliare sulla base della mia personalissima esperienza è una breve e forse banale serie di indicazioni:

  • avere una conoscenza delle basi della programmazione (sono partito da ragazzo con il basic; oggi lavoro soprattutto con Scratch);
  • avere pazienza nel cercare il vasto materiale, anche semplice, sull’IoT che si trova in internet;
  • sapere l’inglese, almeno quello tecnico (che è molto scolastico), per leggere gli articoli;
  • avere una grande curiosità di scoprire e sperimentare nuove tecnologie che va di pari passo con la dimestichezza di armeggiare con queste tecnologie;
  • avere umiltà di chiedere a chi ne sa di più e al tempo stesso aiutare chi ne sa di meno, in altre parole creare comunità.

 

Istruzioni passo-passo

Punto di partenza è un articolo pubblicato nella comunità di Thingspeak. Esso spiega come aggiornare un canale di Thingspeak inviando dati da un Raspberry Pi utilizzando il protocollo MQTT che è stato specificatamente progettato per essere leggero e per far dialogare dispositivi con poca RAM, con CPU di basse prestazioni e con un limitato consumo di banda.

L’attività descritta dall’articolo permette in particolare di pubblicare su un canale di Thingspeak i dati di uso della CPU e della RAM di Raspberry.

Qui trovate il testo integrale. Di seguito vi propongo una sintesi commentata.

Creare un canale su Thingspeak

Come già scritto i canali servono a raccogliere e visualizzare i dati che vengono trasmessi da dispositivi come il nostro Raspberry. Qui viene spiegato come fare.

Nel nostro caso il canale avrà due campi: uno per i dati della CPU ed uno per la RAM.

Una volta salvato il canale vengono generati automaticamente il suo ID e la chiave API che verranno inseriti nel file Python che vedremo nel passo successivo.

Impostazioni del canale

Creare un file Python per la trasmissione dei dati da Raspberry a Thingspeak

Prima di procedere è necessario assicurarsi che il software installato sul Raspberry sia aggiornato: si apre il terminale cliccando sull’icona a forma di lampone in alto a sinistra, quindi si seleziona “Accessori” e poi “LXTerminal”. Sulla linea di comando digitare il seguente codice in successione (dopo ogni riga si preme invio):

sudo apt-get update
sudo apt-get upgrade

Per inviare dati a Thingspeak da un Raspberry è necessario installare sul dispositivo una libreria MQTT. Nell’esempio si usa a tale scopo Paho: da terminale si digita il seguente codice:

sudo pip install paho-mqtt

Sempre in riferimento all’esempio va anche installata la libreria che permette di ottenere informazioni sulle componenti hardware del Raspberry (CPU, memoria, ecc.); si tratta di psutil. Il codice da inserire nel terminale è questo:

sudo pip install psutil

A questo punto si apre l’ambiente di programmazione Python 2 cliccando sull’icona a forma di lampone in alto a sinistra, quindi selezionare “Programmazione” e poi “Python 2 (IDLE)”.

Attenzione che nel sistema operativo installato è presente anche il Python 3, ma non esegue correttamente il codice indicato in basso.

Una volta aperto il programma Python 2 si genera un nuovo file da menù oppure con la combinazione Ctrl+N. Qui si incolla il seguente codice (è quello riportato nell’articolo):

# ThingSpeak Update Using MQTT
# Copyright 2016, MathWorks, Inc

# This is an example of publishing to multiple fields simultaneously.
# Connections over standard TCP, websocket or SSL are possible by setting
# the parameters below.
#
# CPU and RAM usage is collected every 20 seconds and published to a
# ThingSpeak channel using an MQTT Publish
#
# This example requires the Paho MQTT client package which
# is available at: http://eclipse.org/paho/clients/python

from __future__ import print_function
import paho.mqtt.publish as publish
import psutil

### Start of user configuration ###

# ThingSpeak Channel Settings

# The ThingSpeak Channel ID
# Replace this with your Channel ID
channelID = “XXXX”

# The Write API Key for the channel
# Replace this with your Write API key
apiKey = “XXXXYYYYXXXXYYYY”

# MQTT Connection Methods

# Set useUnsecuredTCP to True to use the default MQTT port of 1883
# This type of unsecured MQTT connection uses the least amount of system resources.
useUnsecuredTCP = False

# Set useUnsecuredWebSockets to True to use MQTT over an unsecured websocket on port 80.
# Try this if port 1883 is blocked on your network.
useUnsecuredWebsockets = False

# Set useSSLWebsockets to True to use MQTT over a secure websocket on port 443.
# This type of connection will use slightly more system resources, but the connection
# will be secured by SSL.
useSSLWebsockets = True

### End of user configuration ###

# The Hostname of the ThinSpeak MQTT service
mqttHost = “mqtt.thingspeak.com”

# Set up the connection parameters based on the connection type
if useUnsecuredTCP:
tTransport = “tcp”
tPort = 1883
tTLS = None

if useUnsecuredWebsockets:
tTransport = “websockets”
tPort = 80
tTLS = None

if useSSLWebsockets:
import ssl
tTransport = “websockets”
tTLS = {‘ca_certs’:”/etc/ssl/certs/ca-certificates.crt”,’tls_version’:ssl.PROTOCOL_TLSv1}
tPort = 443

# Create the topic string
topic = “channels/” + channelID + “/publish/” + apiKey

# Run a loop which calculates the system performance every
# 20 seconds and published that to a ThingSpeak channel
# using MQTT.
while(True):

# get the system performance data
cpuPercent = psutil.cpu_percent(interval=20)
ramPercent = psutil.virtual_memory().percent
print (” CPU =”,cpuPercent,” RAM =”,ramPercent)

# build the payload string
tPayload = “field1=” + str(cpuPercent) + “&field2=” + str(ramPercent)

# attempt to publish this data to the topic
try:
publish.single(topic, payload=tPayload, hostname=mqttHost, port=tPort, tls=tTLS, transport=tTransport)

except (KeyboardInterrupt):
break

except:
print (“There was an error while publishing the data.”)

Nel file appena creato vanno aggiunti i dati relativi al canale di Thingspeak: si tratta del numero identificativo del canale (ChannelID, 19° riga) e della chiave API (APIkey, 22° riga); entrambe le righe sono evidenziate in grassetto. Tutto il resto va bene così com’è, per il momento.

Quando si esegue il file (chiamato modulo) dal menù “Run” e “Run Module” (in alternativa basta premere il tasto F5), si apre una nuova finestra (Shell) in cui sono mostrati i valori di uso della CPU e della RAM. Contemporaneamente attraverso un browser si accede a Thingspeak.com e nel canale appositamente creato per questo esempio sono mostrati gli stessi dati all’interno di due grafici temporali, uno per la CPU e una per RAM.

Visualizzazione dei dati relativi alle prestazioni di CPU e RAM del Raspberry

Grafici generati n tempo reale con i dati acquisiti nel canale

 

Facile, no?

Adesso se sono riuscito a farvi appassionare all’IoT con Raspberry, vi accompagno ad un livello superiore di applicazione e vi spiego come trasmettere i dati ambientali misurati dal Sense Hat. Vi rimando quindi alla seconda parte dell’articolo, qui.

 

Vai alla barra degli strumenti