Progettiamo una Sensor Network per i parametri ambientali – Parte 3

Nell’ultimo decennio si sono sviluppate moltissime piattaforme hardware orientate all’Internet of Things in tutte le sue forme ed applicazioni: domotica, monitoraggio, applicazioni industriali, automotive e tanto altro ancora. Infatti, grazie all’utilizzo di schede come Arduino, ESP32, Raspberry Pi o le tante altre soluzioni dei diversi produttori è diventato estremamente semplice ed immediato realizzare degli oggetti connessi efficienti mantenendo comunque un costo ridottissimo, e adatti a qualsiasi applicazione sia essa indoor che all’aperto. La possibilità di integrare i più svariati sensori e protocolli di comunicazione ha permesso di poter realizzare qualsiasi Sensor Network, sia cablata che wireless. In questa serie di quattro articoli andremo a progettare una WSN (Wireless Sensor Network) per il monitoraggio dei principali parametri ambientali all’interno della propria casa. In questo articolo affronteremo la terza parte: lo sviluppo del data-aggregate node, ossia il gateway tra i dati acquisiti dai sensori e una generica piattaforma applicativa.

Introduzione

Partendo dall’architettura di progetto mostrata nella prima parte di questa serie di articoli (e rappresentata in Figura 1), abbiamo già sviluppato i nodi della rete atti all’acquisizione dei parametri ambientali e all’invio dei dati tramite messaggi UDP all’interno della rete Wi-Fi domestica. Come già osservato nell’architettura, un elemento fondamentale di una Sensor Network è il nodo di Data-Aggregate, ossia quel nodo progettato appositamente per raccogliere le informazioni dalle sorgenti vicine, in genere smart sensor, ed effettuare funzioni come data-storage o invio sulla rete Internet, con diverse tecnologie di comunicazione. Le sorgenti possono essere innumerevoli e di differenti tipologie in funzione della specifica applicazione (connessione wireless o wired con altri oggetti e sensori, anche remoti). Si comporta praticamente da gateway di informazioni tra reti o livelli applicativi diversi.

Figura 1: Architettura di progetto

I vantaggi dell’uso di nodi di data-aggregate sono innumerevoli quali:

  • concentrare le elaborazioni in un’unità più performante potendo lavorare sui dati grezzi ricevuti da innumerevoli sensori e applicare gli algoritmi di elaborazione o data-fusion
  • cadenzare i momenti di salvataggio dei dati e di elaborazione successiva
  • ridurre il numero di connessioni alla rete (ad esempio, sfruttando una rete tra concentratore o nodi tipo Bluetooth, Xbee e via dicendo)
  • salvare i dati fondamentali su dispositivi rimovibili come card SD

Accedere alle piattaforme cloud aggregate risulta dunque una strategia vincente quando si lavora con il Cloud di Arduino nella versione gratuita. Infatti, sappiamo che il cloud presenta dei limiti sul numero massimo di dispositivi connessi e questi inoltre devono essere tra le tipologie di schede riconosciute nella lista di compatibilità. In questo modo è possibile contenere anche il costo dei sensori remoti che potrebbero andare persi o distrutti, mentre gli elementi più costosi si comportano da aggregatori di dati. Un’altra possibile applicazione dei nodi di data-aggregate è quella di dispositivi di visualizzazione locali, ad esempio tramite delle HMI o semplici display. Questa soluzione è molto utile quando il nodo principale si trova in un altro posto, ma è di difficile accesso e si vogliono visualizzare le informazioni principali in loco.

In questo articolo, terza parte del progetto “Sensor Network per i parametri ambientali” affronteremo dunque i seguenti argomenti:

  • La piattaforma hardware dei sensori
  • Tutorial di start-up
  • Struttura del progetto Firmware
  • Codice dello sketch
  • Considerazioni finali

La piattaforma hardware del data-aggregate node

Per la realizzazione del nodo di data-aggregate ho deciso di utilizzare la scheda Arduino MKR Wi-Fi 1010 (vedi Figura 2) che integra l’interconnessione Wi-Fi e Bluetooth concepita per lo sviluppo di progetti di Internet of Things in maniera semplice ed immediata. La scheda è dotata di un Arm Cortex-M0 che si interfaccia con un chipset per le comunicazioni wireless.

Figura 2: Arduino MKR Wi-Fi 1010

Le caratteristiche tecniche complete della scheda sono:

  • Microcontroller SAMD21 Cortex®-M0+ 32bit low power ARM MCU
  • Modulo radio u-blox NINA-W102
  • Alimentazione (USB/VIN) 5 V
  • Tensione operativa 3.3 V
  • Secure Element ATECC508
  • Digital I/O Pins 8
  • PWM Pins 13 (0 .. 8, 10, 12, 18/A3, 19/A4)
  • Comunicazioni: UART, SPI, I2C
  • Analog Input Pins 7 (ADC 8/10/12 bit)
  • Analog Output Pins 1 (DAC 10 bit)
  • External Interrupts 10
  • CPU Flash Memory 256 kB (internal)
  • SRAM 32 kB
  • LED_BUILTIN 6
  • USB Full-Speed USB Device and embedded Host
  • Dimensioni fisiche: 61.5 mm x 255 mm/peso 32 g

Tra i punti forti di questa scheda troviamo anche la completa compatibilità alla piattaforma Arduino Cloud.

Tutorial Start-up

Come fatto per i sensori, anche in questo caso andremo a realizzare prima un piccolo esempio applicativo per provare la corretta configurazione della board all’interno di Arduino e la corretta comunicazione UDP all’interno della nostra rete domestica. A differenza degli ESP8266, con la scheda Arduino MKR Wi-Fi 1010 possiamo collegarci direttamente per la programmazione. All’interno dell’IDE Arduino è necessario configurare correttamente le impostazioni per poter lavorare con queste nuove tipologie di schede. Per farlo è necessario aggiungere il pacchetto ARDUINO SAMD BOARDS nella finestra Strumenti – Schede – Gestore Schede e selezionare la scheda “Arduino MKR Wi-Fi 1010” lasciando invariate tutte le impostazioni. Inoltre, consiglio di aggiungere la libreria WifiNINA che implementa le funzionalità di gestione del Wi-Fi (comprese le trasmissioni UDP) con piena compatibilità alle schede del pacchetto Arduino SAMD Boards.

Dal menu File -> Esempi -> WifiNINA andiamo a selezionare lo sketch di esempio WifiUdpSendReceiveString con cui potremo verificare sia il caricamento del firmware sulla scheda, che il corretto interfacciamento UDP all’interno della propria rete Wi-Fi domestica.

Anche se appartenente ad un'altra famiglia di esempi, questo esempio ha una struttura molto simile a quella che abbiamo osservato nell'esempio per gli ESP8266. La funzione di setup prevede la configurazione del modulo Wi-Fi e della serial di debug per il monitor seriale dell’IDE. Al termine della funzione viene avviato il protocollo UDP con la relativa funzione. All’interno della funzione loop vi è la lettura di un generico pacchetto UDP. Quando questo è presente, dunque, la dimensione del pacchetto è diversa da zero, il costrutto if gestisce il messaggio attraverso le seguenti azioni:

  • Stampa la sorgente del messaggio sul monitor seriale
  • Stampa il contenuto del messaggio sul monitor seriale
  • Invia un pacchetto di avvenuta ricezione al mittente

Il messaggio che invierà è scolpito nel software attraverso questa definizione/dichiarazione:

char ReplyBuffer[] = "acknowledged";

Per il corretto funzionamento dello sketch andranno semplicemente inseriti SSID e password della propria rete Wi-Fi, e caricato il software sulla scheda a nostra disposizione. Una volta caricato il software sulla scheda Arduino procediamo alla stimolazione dei messaggi UDP con il software PacketSender, disponibile gratuitamente al sito www.packetsender.com.

Struttura del progetto Firmware

Andiamo ora a progettare il firmware vero e proprio del nostro progetto, da poter caricare sulla scheda Arduino MKR Wi-Fi 1010. Partendo dalla struttura del progetto di esempio, possiamo sviluppare una gestione della comunicazione UDP più attenta ed adatta al nostro progetto. In particolar modo:

    • All’interno della funzione di setup andiamo ad aggiungere le inizializzazioni delle variabili globali e la chiamata alla funzione searchSensorNode() che affronteremo di seguito.
    • La funzione di loop è stata riscritta per gestire le funzioni message_handle() e searchSensorNode().
    • La funzione message_handle() è scritta per gestire le diverse tipologie di messaggi UDP che la scheda può ricevere. In particolar modo gestisce:
      • i messaggi di conferma della configurazione dei nodi sensoristici
      • i messaggi contenenti i dati acquisiti dai nodi sensoristici
    • La funzione searchSensorNode() implementa al suo interno le funzionalità di ricerca dei nuovi sensori disponibili all’interno della rete Wi-Fi. Effettua questa ricerca inviando un messaggio al generico indirizzo IP, contenuto nella sottorete di cui fa parte. Ad esempio, se l’indirizzo della stazione di data-aggregate è 192.168.1.10, effettuerà una ricerca di nodi nel range di indirizzi 192.168.1.[1-255]. Ad ogni chiamata di questa funzione verrà gestito un solo indirizzo e attraverso una variabile globale sarà incrementato l’indice (dunque l’indirizzo) per l’esecuzione successiva. All’interno della stessa funzione viene effettuato un check anche per discriminare eventuali nodi non più attivi.

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2263 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend