Informatica per script kiddies 6 – Arduino, Raspberry Pi e quelle cose

Eccoci di nuovo la nostra rubrica mensile preferita. Ci siamo spostati sul blog di ItalyInformatica, dove prossimamente metterò in copia gli altri articoli per avere tutto insieme. Trovate qui tutti gli articoli della rubrica.

Oggi parliamo di cose che molti percepiscono come “schede piccole con cui fare cose strane”, e nemmeno a torto, ma che vengono di solito chiamati col nome piú tecnico di “sistemi embeded”.

Sarà un’introduzione un po’ generica, forse troppo, quindi mi aspetto domande 😛

Microcontrollori, microprocessori e system-on-a-chip

La prima cosa da capire su questo tipo di oggetti è che si dividono in due grandi famiglie, con finalità molto diverse, anche se con una grande sovrapposizione a livello di “cosa ci puoi fare”: esistono le schede basate su microcontrollori, e le schede basate su microprocessori (uso la parola “microprocessore” per intendere “microprocessore a uso generico”: a rigore altrimenti i microcontrollori non sono che degli strani microprocessori).

Un microcontrollore è un circuito integrato programmabile. L’idea che generalmente abbiamo di circuito è quella di un oggetto composto di fili, che a dati input (ci attacco una pila) risponde con dati output (si accende una lampadina). I microcontrollori sono un’idea molto simile, ma la relazione tra input e output non è fissa ma è scritta su un programma memorizzato nel circuito stesso (di solito su una memoria EPROM). Da fuori si presenterà come uno scatolino con diversi piedini numerati (alcuni con funzioni specifiche), e con la possibilità di scriverci dentro dei programmi che dicano cosa succede ad alcuni dei piedini quando succede qualcosa ad altri piedini.

Generalmente – ma non è detto – un microcontrollore si mette in attesa di un evento in ingresso, fa quello che deve fare, e si rimette poi in attesa. Esegue un solo programma, comportandosi come il programma stabilisce.

Anche un microprocessore è invece un circuito integrato capace di eseguire programmi, che però non risiedono al suo interno ma gli vengono dati in pasto da una struttura esterna piú o meno complessa. In genere un microprocessore, oggi, si trova ad eseguire un software complesso, il sistema operativo, che gli fa a sua volta eseguire altri programmi in base a logiche che il microprocessore non “conosce”.

Il microprocessore, insomma, è quello che sta nei nostri PC, e che esegue una marea di programmi diversi che il sistema operativo ci fa credere siano eseguiti in contemporanea. Si presenta in maniera simile al microcontrollore, uno scatolotto con tanti piedini, ma i piedini tendono ad essere dedicati a set di funzioni specifiche e al caricamento rapidissimo di software nelle memorie interne.

Talvolta, i microprocessori sono inclusi in degli oggetti piú complessi, con tutto quello che è necessario a far girare il sistema operativo e i software, e prendono il nome di system-on-a-chip, presentandosi con una piedinatura a quel punto molto simile a quella dei microcontrollori, a cui finiscono per somigliare: oggetti completi che non hanno bisogno di molto al di fuori di sé stessi, e capaci di prendere input ed elaborarli restituendo output direttamente utilizzabili.

Schede a microcontrollori

La scheda a microcontrollori che piú o meno tutti conoscono è l’Arduino Uno, che prenderò come esempio di tutta la categoria. Si tratta di un microcontrollore ATmega328P montato su una scheda di sviluppo e con preinstallato un software che rende comodo il caricamento e l’esecuzione di software scritto con un IDE abbinato. Il microcontrollore, di suo, sarebbe perfettamente capace di fare tutto quello che gli viene fatto fare: la scheda serve solo a fornire a chi lo usa un’interfaccia un po’ piú comoda e meno fulminabile di quella che forniscono i piedini del chip.

Oggetti come l’Arduino Uno hanno moltissimi punti di forza. Prima di tutto costano pochissimo (per motivi vari l’Arduino mica tanto, ma insomma): si trovano schede di sviluppo con integrati molto piú capaci dell’ATmega328P a prezzi veramente molto bassi. Poi, per la loro natura di microcontrollori li rende molto rapidi nelle risposte e poco soggetti a bug che non siano sotto il controllo di chi li programma, non essendoci un sistema operativo. Infine, tendono a consumare decisamente poco.

Sono insomma vantaggiosi in tutti i casi in cui siano sufficienti a fare ciò che si vuole fare. Qualsiasi progetto, ad esempio, faccia elaborazione non eccessivamente complessa di dati provenienti da sensori, che è un caso d’uso classico, rende di solito conveniente l’utilizzo di oggetti di questo tipo. Considerata l’elevata disponibilità di microcontrollori che integrano il necessario per effettuare connessioni via WiFi, le potenzialità sono davvero enormi.

Schede a microprocessori

Le schede a microprocessori, come la Raspberry Pi, sono generalmente basate su un system-on-a-chip, che contiene un microprocessore che di solito ha un’architettura ARM (è insomma del tipo di quelli “dei cellulari” e non di quelli “dei computer”). Come per le schede a microcontrollori, il system-on-a-chip è di solito montato su una scheda che contiene il necessario a utilizzarlo, dalla memoria di massa ad una serie di interfacce per utilizzarlo comodamente.

Una scheda a microprocessore è sostanzialmente un PC in miniatura. Il grande vantaggio rispetto alle schede a microprocessori è la possibilità di usarla appunto come un vero e proprio computer, con un sistema operativo a cui si è abituati (Linux, Windows) e a tutti gli strumenti di sviluppo e i software che ci girano sopra.

Tendono a consumare un po’ più dei microcontrollori (ma molto meno del PC medio) e riescono a coprirne il grosso dei casi d’uso, senza però la prontezza e l’affidabilità dei microcontrollori. Sono indispensabili quando è necessario far interagire software diversi tra loro, utilizzare hardware complesso (come ad esempio i monitor veri e propri), gestire interfacce grafiche complesse o utilizzare software già pronti che richiedano un sistema operativo, come i sistemi di cloud privato, o i sistemi di gestione della rete domestica.

Come si usano

Si tratta di un mondo molto vasto, e le schede a microprocessore possono essere di solito utilizzate anche come un normalissimo PC collegandoci monitor, mouse e tastiera, ma l’utilizzo avanzato è più o meno lo stesso in quasi tutti i casi.

Il GPIO

Una cosa comune a quasi tutti i kit di sviluppo è un’interfaccia chiamata GPIO. Si tratta di un insieme di pin che possono essere impostati come “pin di ingresso” o “pin di uscita” via software, e sono quindi utili a prendere in ingresso dati (da sensori, da pulsanti…) e a comunicare dati in uscita (da cose semplici come accendere lampadine o motori, a cose complesse come governare display).

Talvolta, una parte dei pin GPIO è dedicata all’input/output di dati analogici, sotto forma di tensione. Gli ingressi digitali invece possono essere o spenti (0 volt) o accesi (in genere 3.3 o 5 volt). Alcuni pin fanno da riferimento per gli zero volt, facendo quindi da “terra” e alcuni fanno da riferimento per la tensione dell’elettronica della scheda (quella che vale come “acceso”). A volte, le schede con elettronica a 3.3 volt hanno uno o più pin a 5 volt comodi per alimentare altri dispositivi (o, in ingresso, la scheda stessa).

In genere il software contenuto nella scheda – e in alcuni casi l’hardware stesso – dedicano alcuni pin a protocolli particolari, standard, utili a controllare sensori (come 1-wire) o periferiche (come SPI).

Gli shield

La diffusione di alcune famiglie di schede, tutte con interfaccia GPIO identica, ha spinto molti sviluppatori di hardware a creare delle schede, dette shield, che si possono attaccare direttamente sullo slot GPIO per aggiungere funzionalità alla scheda stessa. Ce ne sono di ogni genere, e sono spesso utilissimi ad aggiungere cose relativamente complesse e molto comuni, come display, sensori, memorie di massa, sistemi di alimentazione e quasi qualunque cosa possa venire in mente. Ovviamente, per essere poi utilizzati richiedono di studiarsi come governarli via software.

Ma quindi, cosa scegliere?

Dipende tantissimo dal progetto che si ha in mente e dalle proprie capacità. Le schede basate su microcontrollore sono solitamente programmabili con un piccolo set di linguaggi (C++ in massima parte), e richiedono quindi di conoscere il linguaggio con cui le si vuole usare, mentre per le schede a microprocessori le possibilità sono limitate solo dalla disponibilità di librerie (il linguaggio principe è Python, ma c’è di tutto). D’altra parte, però, per una buona quantità di progetti una scheda a microcontrollore è più che sufficiente, più economica (pensare di spendere 9 euro per una scheda che vai a dedicare a vita a una funzione è una cosa, pensare di spenderne 80 è un’altra) e più divertente.

Insomma va visto cosa si vuole fare e va fatta una valutazione di possibilità e praticità.

Cosa mi serve per iniziare?

Una parte delle cose dipende dal progetto: di sicuro serve la scheda, un alimentatore adatto, e tutte le periferiche che intendi utilizzare.

Altre cose, invece, sono molto generali.

Nessuno prende e si mette a saldare prima di vedere se le cose funzionano. La prima cosa che ci si trova a dover avere, quindi, sono delle schede di prototipazione (dette breadboard). Si tratta di oggetti di plastica con molti buchini. Sotto la plastica, i buchini sono collegati tra loro, di solito per mezze righe corte. In questo modo, inserire due piedini (uno del microcontrollore e uno di un led, per esempio) nella stessa mezza riga li mette in collegamento. A volte, per comodità, ad ogni lato lungo sono presenti due linee di pin collegati tra loro a cui attaccare l’alimentazione. Il mio consiglio è prendere più breadboard piccole, invece che una grande.

Per collegare parti di breadboard tra loro, così come per collegare breadboard e componenti vari tra loro, è comodo avere una buona quantità di cavetti appositi, che si chiamano jumper. Ne esistono sia di maschio-maschio, per collegare fori di breadboard (o di schede di sviluppo con GPIO femmina, come Arduino Uno), sia di maschio-femmina, per collegare la breadboard a schede con pin veri e propri (come quelli della Raspberry Pi).

Le schede pensate per essere saldate, invece che per sviluppare, tendono a non avere pin ma fori per saldatura. Se volete metterci dei pin, dovrete comprarne da saldare, si chiamano header e si vendono in strisce da ritagliare.

Quando il progetto è pronto, conviene passarlo su qualcosa di più solido di una breadboard. Si può decidere di saldarlo su una millefori, che è una scheda con tantissimi buchini rivestiti di metallo per saldarci sopra componenti. Ce ne sono sia di libere, sia di connesse per righe come le breadboard, e ce ne sono sia a faccia singola che doppia faccia (straconsiglio le seconde). Assieme alla millefori è bene comprare un bel rotolotto di filo. Esistono anche servizi per disegnare e farsi stampare veri e propri circuiti stampati, come quello offerto dal software, molto semplice, Fritzing, ma non sempre vale la pena.

Quando si decide di iniziare a saldare, servirà anche un saldatore a punta (sottile), ce ne sono per tutte le tasche e se state iniziando andateci non pianissimo ma piano, dello stagno da saldatura, un po’ di videotutorial e tanta pratica con filo e breadboard prima di andare a toccare gli integrati costosi.

Buon divertimento!