Tecnologie

Il confine tra IoT e PC: quando non è il software a distinguere i dispositivi

La continua evoluzione dei processori, in particolare dei microcontrollori basati su processori ARM, consente di eseguire software sempre più complessi fino a rendere sempre più sfumata la distinzione tra un microcontrollore e un sistema completo. È il caso della piattaforma .NET

Pubblicato il 06 Apr 2021

microcontrollori

Sappiamo tutti come il continuo progredire della potenza di calcolo dei processori, unita alla miniaturizzazione, abbia portato alla disaggregazione di sistemi di controllo, rendendo autonomi dispositivi come sensori e attuatori che interagiscono con il sistema di controllo mediante l’uso dei protocolli Internet TCP/IP. La rivoluzione Internet of Things (IoT) è stata possibile grazie alla possibilità di eseguire protocolli di alto livello come TCP/IP su dispositivi piccoli e a basso costo, ma la continua evoluzione dei processori, in particolare dei microcontrollori basati su processori ARM consente di eseguire software sempre più complessi fino a rendere sempre più sfumata la distinzione tra un microcontrollore e un sistema completo. Analizziamo il progetto Raspberry PI e la piattaforma .NET.

Raspberry PI, un microcontrollore basato su chip ARM

È il caso del Raspberry PI, progetto open di un microcontrollore basato su chip ARM che è cresciuto fino a divenire uno dei riferimenti per i controllori a basso costo in ambito IoT. La piattaforma dai costi molto contenuti (per meno di 50 euro è possibile acquisire il modello Raspberry PI 3 B e per circa il doppio il nuovo modello Raspberry PI 4 B con 8 GB di RAM) è capace di eseguire una variante della distribuzione Debian di Linux chiamata Raspberry PI OS (prima noto come Raspian). Il modello 4 supporta le istruzioni a 64 bit di ARM ed è possibile con poco sforzo installare il popolare software di virtualizzazione vmware ESXi per poter eseguire (poche) macchine virtuali sulla piattaforma.

Figura 1. Setup fisico di un Raspberry PI 4 che esegue vmware ESXi e una macchina virtuale Debian

È difficile continuare a pensare a questi piccoli dispositivi come dei semplici microcontrollori che controllano una caldaia, è più naturale immaginarli come veri e propri sistemi completi, che si gestiscono come PC o server ma con meno capacità computazionali rispetto ai fratelli maggiori.

In questo panorama, piattaforme nate per lo sviluppo di applicazioni desktop e server capaci di eseguire su architetture differenti (come x86 e ARM) diventano molto interessanti ora che possono essere utilizzate per lo sviluppo e la gestione di microcontrollori come Raspberry PI.

microcontrollori
Raspberry PI 4

La piattaforma .NET per programmare i microcontrollori

Una piattaforma molto interessante in questo contesto è la piattaforma .NET, originariamente di Microsoft e proprietaria, che recentemente è stata aperta e resa interamente multipiattaforma; transizione sancita dal passaggio alla versione .NET 5.0 che è interamente portabile e open source (in precedenza la versione 4 era solo per Windows e la versione open source era chiamata .NET core). In particolare, lo strumento .NET interactive, anch’esso open source, offre un nuovo modo di sviluppare software e imparare a programmare questi controllori che sono spesso inseriti in apparati di controllo per leggere sensori e pilotare attuatori.

Notebook e .NET Interactive

Il literate programming è un vecchio sogno nel cassetto di scienziati che immaginano articoli “eseguibili” dove al testo che descrive un certo argomento viene affiancato il codice per esemplificare e che possa essere eseguito direttamente all’interno dell’articolo. Le applicazioni sono evidenti sia in ambito scientifico che didattico, ma offrono spunti di riflessione anche nel mondo IoT, offrendo la possibilità di interagire con il codice eseguito da un microcontrollore interattivamente e a distanza, senza complesse procedure per connettersi e ispezionare lo stato del dispositivo.

Il progetto Jupyter ha reso nuovamente popolare questo approccio consentendo di scrivere testo in formato markdown e codice in vari linguaggi attraverso un’interfaccia Web. Sul server uno o più kernel sono responsabili per eseguire il codice scritto nelle celle del notebook.

Figura 2. L’interfaccia web di Jupyter (sopra) e un notebook con testo e codice (sotto)

Un notebook è formato da una successione di celle, ciascuna contenente un tipo diverso di informazione: testo in formato markdown, oppure in uno o più linguaggi di programmazione per cui è disponibile un kernel nel sistema, ovverosia un modulo capace di eseguire i frammenti di codice. È possibile non solo eseguire codice ma anche visualizzare elementi grafici come, ad esempio, visualizzazione di dati interattive.

.NET Interactive introduce l’approccio interattivo basato su notebook per la piattaforma .NET e in particolare per i linguaggi C#, F# e PowerShell (core). I kernel di .NET interactive possono essere eseguiti sia in un server Jupyter che all’interno di Visual Studio Code che della piattaforma nteract.

La piattaforma .NET interactive può essere installata insieme a Jupyter su Raspberry PI aprendo interessanti scenari in cui è possibile eseguire interattivamente su un dispositivo IoT.

Installare .NET interactive su Raspberry PI

Dopo aver installato l’ultima versione di Raspberry PI OS utilizzando il Raspberry PI Imager, e aver collegato il sistema alla rete, è sufficiente eseguire il seguente comando per installare .NET sul Raspberry PI:

curl -L https://raw.githubusercontent.com/dotnet/interactive/master/tools/setup-raspbian.sh | bash -e

è poi necessario installare Jupyter utilizzando il seguente comando:

curl -L https://raw.githubusercontent.com/dotnet/interactive/master/tools/setup-raspbian-jupyter.sh | bash -e

Una volta finita l’installazione è sufficiente eseguire i seguenti comandi per avviare il server Jupyter:

pi@raspberrypi:~ $ source ~/.jupyter_venv/bin/activate

(.jupyter_venv) pi@raspberrypi:~ $ jupyter lab –ip 0.0.0.0

Ci si può quindi collegare con il Web browser all’indirizzo (dove x.x.x.x è l’indirizzo IP del dispositivo).

Se si apre la console di PowerShell è possibile eseguire comandi di shell come, ad esempio, ifconfig per visualizzare le schede di rete del dispositivo:

È addirittura possibile usare il tasto ‘TAB’ per completare i comandi. Come ulteriore esempio scriviamo nella casella di testo il seguente comando ed eseguiamolo con Shift+Enter:

Invoke-WebRequest https://raw.githubusercontent.com/dotnet/interactive/main/samples/notebooks/csharp/Samples/HousingML.ipynb -OutFile HousingML.ipynb

In questo modo abbiamo scaricato uno degli esempi di notebook che vedremo apparire dopo pochi secondi nel file Explorer a sinistra. Effettuando un doppio click sul file HousingML.ipynb si aprirà un notebook di esempio che mostra come costruire un modello di apprendimento automatico utilizzando come sorgente dati i prezzi delle case e come librerie Microsoft.ML e Microsoft.ML.AutoML.

Se è vero che eseguire il codice su Raspberry PI è funzionalmente equivalente a compiere azioni analoghe su un PC i tempi di esecuzione, e in particolare quelli di scrittura su MicroSD non sono paragonabili a quelli di un desktop. Per questo motivo è utile spezzettare in più celle le istruzioni di caricamento di librerie per evitare che la valutazione di una singola cella vada in timeout, come mostrato nella seguente figura:

Eseguendo le varie celle del notebook si arriva alla porzione in cui si cerca di costruire un modello predittivo che cerca di indovinare il prezzo di un immobile dati i prezzi analizzati durante la fase di addestramento. È interessante osservare come sia addirittura possibile effettuare l’addestramento di un modello di apprendimento automatico e visualizzare il grafico dell’errore per modelli differenti:

Oltre l’edge computing, microcontrollori sempre più intelligenti

Con dispositivi così potenti è possibile spostare sempre più “intelligenza” all’interno dei controllori, potendo realisticamente costruire modelli di apprendimento automatico direttamente sui controllori e ridurre i dati trasferiti verso il cloud.

Allo stesso tempo, al complicarsi del software in esecuzione su questi dispositivi diventerà di importanza fondamentale tenere sotto controllo gli aspetti di sicurezza, poiché le vulnerabilità potenziali e gli aggiornamenti software saranno sempre più importanti per poter assicurare il corretto funzionamento di questi dispositivi.

Un altro aspetto molto importante da tenere d’occhio è quello dell’aggiornamento di questi dispositivi: in un sistema disaggregato che colloquia mediante chiamate HTTP (meglio se HTTPS) diventa essenziale assicurare la coerenza di funzionamento quando le varie parti vengono aggiornate. La capacità di eseguire container di questi dispositivi offre sicuramente strumenti per semplificare la distribuzione del software ma non è sufficiente a risolvere tutti i problemi.

Conclusioni

Raspberry PI, come altri microcontrollori, è ormai in grado di eseguire Linux come sistema operativo e stack software che tradizionalmente appartengono a PC e server. La potenza di calcolo (che è associata anche a un aumento dei consumi) che questi dispositivi offrono consentono l’esecuzione di runtime come .NET interactive che consentono la ridefinizione dinamica del comportamento di un controllore, potendo in alcuni casi analizzare i dati usando direttamente la CPU del controllore, evitando quindi la necessità di inviare tutti i dati acquisiti a sistemi di elaborazione in stile fog.

La sicurezza e gli aggiornamenti rappresenteranno una sfida per un nuovo futuro dove una parte dell’elaborazione torna a essere eseguita da questi dispositivi in modo completamente distribuito. Un altro aspetto importante da tener presente sono gli aspetti di integrità dei dati che non sempre consentiranno di limitare la presenza di dati acquisiti da sensori al singolo controllore.

Resta il fatto che dopo quasi dieci anni dall’avvio del movimento IoT il panorama continua a essere molto fluido, con un continuo aumento dei processori che quotidianamente utilizziamo. Tecnologie come .NET, nate per consentire uno sviluppo di programmi capaci di eseguire in modo efficiente su architetture differenti, vivranno una nuova primavera poiché la potenza di calcolo disponibile è tale da non consentire sempre l’uso di cicli macchina per un interprete come avviene nel caso di Python. Java e .NET fanno uso di tecnologia Just in time compiler, che compila il bytecode al volo riducendo l’overhead per l’esecuzione su piattaforme comunque sempre limitate nella capacità computazionale.

Una cosa è certa: viviamo ormai nell’era in cui non è la funzionalità a caratterizzare controllori, PC e server, bensì la capacità computazionale e le caratteristiche specifiche dei dispositivi.

Valuta la qualità di questo articolo

La tua opinione è importante per noi!

Articoli correlati

Articolo 1 di 4