Arduino Due Tutorial: presentazione e confronto con Arduino Uno

Tutorial su Arduino Due - ARM Cortex M3

Dal 2009 ad oggi la Maker’s Revolution si è imposta, è nato Arduino, che ha cambiato il nostro modo di pensare ed oggi, quasi quattro anni dopo, Arduino si evolve, diventa più grande e più performante e si prepara ad offrire ancora una volta uno spettacolo entusiasmante. Una nuova e stimolante fase dell’elettronica sta per cominciare ed oggi iniziamo a vedere com’è fatto e cosa c’è di totalmente nuovo in Arduino DUE. Siete pronti?

Siamo abituati a pensare che un’era sia un tempo lungo, quasi infinito. Tuttavia non è proprio così; in un mondo che gira veloce come il nostro un’era può durare veramente poco e allora c’è bisogno di trovare un’altra definizione. Possiamo pensare ad un’era come un’epoca caratterizzata da tratti comuni e modi di fare simili tra loro. Bene l’era di Arduino è iniziata quasi dal niente ma grazie ad una scheda elettronica noi abbiamo completamente cambiato il nostro modo di vivere, di pensare ma anche di fare Open Source. Ecco, questa potenza oggi è ancora di più al nostro servizio.

La scheda Arduino DUE è la nuova arrivata della famiglia Arduino e della prima che utilizza un processore ARM a 32 bit, l’Atmel SAM3X8E AMR Cortex-M3, del quale approfondiremo qualche aspetto più avanti. Questo nuovo processore migliora tutte le funzionalità delle quali Arduino già disponeva e ne aggiunge di nuove che saranno davvero interessanti.

La nuova scheda offre 54 diversi pin di input/output (che già possiamo confrontare con i sei analogici e 13 digitali della versione UNO!) dei quali 12 possono essere utilizzati come output PWM con risoluzione selezionabile, 12 saranno per input analogici con risoluzione a 12 bit, ci sono due uscite di tipo DAC e 4 UART (porte seriali hardware), un oscillatore ad 84 MHz, due connessioni USB (delle quali, come vedremo, una sarà dedicata per la programmazione), un header ICSP ed uno JTAG ed anche un pulsante di reset (che comunque era già presente anche nella versione Uno).

Sottolineiamo subito, in partenza, una delle più grandi differenze tra questa versione e la precedente: questa volta la massima tensione che potrà essere tollerata ai pin sarà di 3.3V ed anche sul sito ufficiale di Arduino gli utenti vengono messi in guardia immediatamente: fornire i 5 V in ingresso sui pin causerà la rottura della scheda. Tenete a mente, dunque, questa grandissima differenza, o limitazione se preferite.

Dicevamo degli ingressi USB, la scheda ne ha due: il primo, micro-USB AB, è un connettore nativo che agisce come host USB, il che significa che si può connettere una qualunque periferica esterna alla scheda, come un mouse piuttosto che una tastiera e perché no anche uno smartphone, che sarà supportato ampiamente come una fotocamera o un lettore mp3, visto che si tratta di un’uscita USB 2.0 a 480 Mbps. L’altra delle due, invece, viene utilizzata per effettuare debug.

La versione DUE segue un pinout così fatto: SDA e SCL sono vicini al pin AREF, IOREF, il quale permette l’utilizzo di uno shield connesso, e consente allo stesso la compatibilità con la scheda che funziona a 3.3 V, nonchè ai modelli basati su AVR che lavorano a 5 V. Infine c’è un pin non connesso che può essere utilizzato per usi futuri (previsti dall’utente).

Tra le caratteristiche vincenti del progetto c’è sempre stata anche la connotazione economica, ovvero la capacità della scheda di portare tante potenzialità in casa delle persone con costi davvero contenuti. La scelta, anche questa volta, è stata quella di inseguire e perseguire questa filosofia e pertanto Arduino DUE avrà un prezzo, tutto sommato, abbastanza contenuto sebbene poco meno che raddoppiato, che si attesterà su 39 €, escluse le spese di spedizione. La scheda è stata disponibile per breve tempo ed è subito esaurita. Stiamo, insomma, tutti aspettando il nuovo approvvigionamento che, tuttavia, non dovrebbe tardare ad arrivare.

Inoltre, il processore ARM offre un basso consumo energetico, permettendo quindi, un’ottima autonomia.

Nuovo core, nuove chance

Sì, è proprio così: la vera novità di questa scheda è nel microprocessore che non ha soltanto 32 bit, che sarebbero semplicemente 4 volte quelli di Arduino uno (per maggiori informazioni, date uno sguardo alla pagina int type) ma una serie di altre caratteristiche che la rendono davvero molto accattivante. Alcune le abbiamo viste, altre le rivediamo meglio e più approfonditamente qui.
Il clock della CPU è ad 84 MHz e la dotazione di memoria risulta molto interessante dato che l’ammontare di RAM a bordo è pari a 96 kB (64 + 32) mentre quello di memoria flash è pari a 512 kB.
La scelta più intelligente e coraggiosa fatta da Banzi & Co. è stata quella di aprirsi alla famiglia dei processori a 32 bit per garantire alla scheda la possibilità di eseguire applicazioni real time sviluppate specificatamente per creare piattaforme ad alte prestazioni, mantenendo bassissimi, o contenuti, i costi. Il processore permette di effettuare calcoli con performance davvero interessanti, garantendo anche tante nuove features.
Perché scegliere il Cortex-M3? Beh, questo è un microcontrollore, introdotto nel 2004, che è stato recentemente aggiornato con nuove tecnologie ed opzioni di configurabilità ed è il vero e proprio mainstream tra i processori ARM.

Uno degli aspetti più interessanti di questo “micro” è rappresentato dal bassissimo consumo di potenza in regime dinamico (scusate l’apparente contraddizione ma non c’è modo migliore per descriverlo, in realtà!), e, senza rimanere nel vago, stiamo parlando di 12.5 DMIPS/mW.
Il processore esegue il set di istruzioni brevettato Thumb®-2 che permette un alto livello di prestazioni ottimizzato anche in relazione alla lunghezza del codice; alcune delle sue caratteristiche principali includono hardware division, single cycle multiply e bit-field manipulation. La grande configurabilità del sistema permette fino a 240 operazioni di interrupt per il sistema con un meccanismo di priorità individuale selezionabile e riprogrammabile. Il tutto gestito attraverso un clock di sistema integrato.

Anche dal punto di vista della connettività il sistema risulta piuttosto ricco e ben dotato. La combinazione tra le caratteristiche e le performance rende i dispositivi basati su Cortex-M3 molto efficienti specie nella gestione di canali di I/O multipli e protocolli standard come l’USB OTG (che non è altro che l’acronimo di On-The-Go).
Vediamo di entrare nel vivo della caratterizzazione del microcontrollori con le specifiche dello stesso:

Features di un ARM Cortex-M3

ISA Support Thumb® / Thumb-2
Pipeline 3-stadi
Performance Efficiency 2.17 CoreMark/MHz – 1.25 DMIPS/MHz
Memory Protection MPU ad “8 region” con “sub” e “background region”
Interrupts Non-Maskable Interrupt (NMI) + da 1 a 240 interrupts fisicali
Interrupt Priority Levels da 8 a 256 livelli di priorità
Wake-up Interrupt Controller Fino a 240 Wake-up Interrupts
Sleep Modes “Integrated WFI and WFE Instructions and Sleep On Exit capability.
Sleep & Deep Sleep Signals.”
“Optional Retention Mode with ARM Power Management Kit”
Bit Manipulation “Integrated Instructions & Bit Banding”
Enhanced Instructions “Hardware Divide” (2-12 cicli), “Single-Cycle” (32×32) “Multiply, Saturated Math Support”.
Debug “Optional JTAG & Serial-Wire Debug Ports”. Fino ad 8 Breakpoints e 4 Watchpoints.
Trace “Optional Instruction Trace (ETM), Data Trace (DWT) e Instrumentation Trace (ITM)”

Io vengo dagli 8 bit…

Sulle difficoltà e le caratteristiche, ma anche le prospettive, che il passaggio da un’architettura ad 8 bit, o magari a 16, verso quella a 32 abbiamo già letto, non troppo tempo fa, su queste pagine, qualcosa. Vediamo, tuttavia, di analizzare la questione più nello specifico.

I processor ARM Cortex-M offre diversi vantaggi, come stavamo dicendo, tra cui la maggiore densità del codice rispetto a quanto accade nelle architetture ad 8 o a 16 bit. Questo propone  vantaggi significativi soprattutto in termini di riduzione dei requisiti di memoria e migliore utilizzo della memoria Flash a bordo.

Per quanto concerne la lunghezza delle istruzioni, e concezione comune che i microcontrollori ad 8 bit utilizzino istruzioni ad 8 bit mentre i microcontrollori basati su processori ARM Cortex-M utilizzino istruzioni a 32 bit. In realtà, per esempio, per quanto riguarda i PIC18 ed i PIC16, la dimensione delle istruzioni sono, rispettivamente, a 16 ed a 14 bit. Nel caso di architetture 8051, invece, sebbene alcune istruzioni siano lunghe solo un 1 byte, molte altre risultano lunghe 2 o 3 byte. Stesso discorso si può fare per le architetture a 16 bit, alcune delle quali hanno istruzioni che possono anche essere lunghe 6 byte, se non di più.

Abbiamo accennato prima, utilizzando la tabella, alla tecnologia Thumb-2. Questa è in uso sui processori Cortex-M e ciò permette loro una grande densità di codice. Questa tecnologia permette ai processori di operare con istruzioni del tipo 16-bit Thumb, ovviamente adattate ed estese per supportare le istruzioni a 32 bit che sono certamente più “potenti”. In molti casi un compilatore C utilizzerà la versione delle istruzioni a 16 bit fin tanto che l’operazione può essere eseguita in maniera più efficiente rispetto alla stessa espressione scritta, però, nella sua analoga versione a 32.

E, visto che stiamo parlando di efficienza delle istruzioni, non possiamo delineare un quadro completo se non consideriamo anche il fatto che le istruzioni su questi processori sono certamente molto più potenti, come dicevamo prima. Ci sono molti casi in cui una singola istruzione Thumb è del tutto equivalente ad una istruzione su microcontrollori da 8 o 16 bit. Questo vuol dire che i dispositivi con Cortex-M hanno sostanzialmente codice più piccolo, e snello, che permette però di realizzare le stesse operazioni. Tutto questo può essere ben spiegato con la tabella che segue.

Esempi a 8-bit

Esempi a 16-bit

Su ARM Cortex-M

MOV A, XL ; 2 bytes

MOV B, YL ; 3 bytes

MUL AB; 1 byte

MOV R0, A; 1 byte

MOV R1, B; 3 bytes

MOV A, XL ; 2 bytes

MOV B, YH ; 3 bytes

MUL AB; 1 byte

ADD A, R1; 1 byte

MOV R1, A; 1 byte

MOV A, B ; 2 bytes

ADDC A, #0 ; 2 bytes

MOV R2, A; 1 byte

MOV A, XH ; 2 bytes

MOV B, YL ; 3 bytes

MUL AB; 1 byte

ADD A, R1; 1 byte

MOV R1, A; 1 byte

MOV A, B ; 2 bytes

ADDC A, R2 ; 1 bytes

MOV R2, A; 1 byte

MOV A, XH ; 2 bytes

MOV B, YH ; 3 bytes

MUL AB; 1 byte

ADD A, R2; 1 byte

MOV R2, A; 1 byte

MOV A, B ; 2 bytes

ADDC A, #0 ; 2 bytes

MOV R3, A; 1 byte

MOV R4,&0130h

MOV R5,&0138h

MOV SumLo,R6

MOV SumHi,R7

MULS r0,r1,r0

Altra cosa che è importante notare è che questo tipo di processori supportano il trasferimento dei dati su architetture da 8 e 16 bit, garantendo comunque un ottimo utilizzo della memoria. Questo vuol dire che i programmatori potranno continuare ad utilizzare gli stessi tipi di dati che hanno utilizzato sulle precedenti architetture.

Riguardo, poi, ai vantaggi dal punto di vista dell’efficienza energetica, e quindi del consumo, la richiesta di diminuzione degli stessi non fa che aumentare, dato l’incremento delle potenzialità che oggi si richiedono e la sofisticazione dei sensori analogici. Questo ha portato la necessità di routine di pre-process che possano snellire il codice finale ma anche diminuire il tempo di attività della macchina. La maggior parte dei dispositivi ad 8 bit non offre la possibilità di venire incontro a questa esigenza senza aumentare la frequenza di clock, e quindi il consumo di potenza. Pertanto gli sviluppatori embedded hanno, di fatto, puntato a nuove tecnologie. I dispositivi a 16 bit sono stati i primi ad essere utilizzati in questa direzione; tuttavia le prestazioni raggiunte erano, globalmente, insufficienti per effetto dell’aumento del duty-cycle. La frequenza di clock richiesta ad un microcontrollori a 16 bit rispetto a quella di uno a 32, a parità di istruzione, risulta più alta ed è per questo che l’architettura a 32 bit ottimizza anche il consumo energetico.

Per quanto riguarda lo sviluppo, i software per microcontrollori basati su processori ARM Cortex possono essere molto più semplici di quelli prodotti per microcontrollori ad 8 bit; questo non è soltanto vero perché il processore Cortex può essere interamente scritto in C ma anche perché vengono utilizzate ed implementate una serie di features orientate al debug che sono disponibili da più fonti, anche grazie al fatto che esistono diversi kit di sviluppo basati su quelle MCU.

Qualche dettagli tecnico

A guardar bene la scheda c’è davvero di che rimanere ammirati; oltre le caratteristiche riguardo il suo “cuore pulsante”, ci sono anche le nuove caratteristiche che vi, proponiamo qui di seguito in questa facile e comoda tabella. Se avete presente com’era fatta la vecchia scheda vi renderete subito conto del fatto che c’è di che essere soddisfatti.

Microcontrollore AT91SAM3X8E
Tensione di lavoro 3.3V
Tensioni di ingresso raccomandate 7-12V
Limiti massimi delle tensioni di ingresso 6-20V
Pin di I/O digitale 54 (di cui 12 per output PWM)
Pin di ingresso analogici 12
Pin di uscite analogiche 2 (DAC)
Massima corrente di uscita DC sulle linee 130 mA
Corrente DC per pin a 3.3V 800 mA
Corrente DC per pin a 5V 800 mA
Memoria Flash 512 KB disponibili
SRAM 96 KB (due banchi: 64KB e 32KB)
Frequenza di clock 84 MHz

Passiamo, adesso, ad una più dettagliata analisi di tutti i pin di cui la scheda dotata e grazie ai quali essa può essere configurata, potenziata e con la quale si può interagire. Tanto per iniziare, e qui lo vediamo molto più diffusamente, Arduino due è dotata di 54 differenti pin che ciascuno di questi può essere configurato per effettuare I/O. Le librerie che abbiamo già conosciuto ed utilizzato per la versione uno, ovvero pinMode(), digitalWrite() e digitalRead() torneranno utili anche in questa versione della scheda. Certo, alcune sono state riviste ma la sostanza è rimasta invariata. Tutti i pin, come abbiamo avuto modo di spiegare la volta scorsa e com’è giusto ricordare ancora, lavorano con una tensione massima di 3.3 V. In ingresso la scheda non sopporta più i 5V della versione precedente ed i produttori avvertono che tale valore di tensione, posto in ingresso, potrebbe portare la rottura della scheda.

Attraverso ciascun pin può scorrere una corrente compresa tra 3 e 15 mA, mentre nella modalità di sink, questo valore risulta compreso tra 6 e 9, a seconda del pin. Esiste anche un resistore di pull-up interno, che di default risulta disabilitato, del valore di 100 kOhm.

Oltre a questo, esistono anche pin specializzati differenziati, per l’appunto, per la funzione e passiamo subito alla loro descrizione.

  • Serial 0: pin 0 (RX) e pin 1 (TX);
  • Serial 1: pin 19 (RX) e pin 18 (TX);
  • Serial 2: pin 17 (RX) e pin 16 (TX);
  • Serial 3: pin 15 (RX) e pin 14 (TX).

Questi, come indicato tra parentesi, possono essere utilizzati per effettuare trasmissioni di dati seriali TTL con un livello 3.3 V ed, a coppie, svolgono funzioni di ricevitore e trasmettitore.

Come da tabella informativa, la scheda anche 12 pin riservati alle funzioni di PWM, in particolare quelli numerati dal 2 al 13. Gli output che possono essere forniti sono PWM ad 8 bit e per utilizzarli possiamo fare ricorso alla funzione analogWrite(), che ben conosciamo. La risoluzione di questi otto tutto può essere cambiata mediante un’altra funzione nota a chi ha già programmato sulla scheda che è analogWriteResolution().

Le comunicazioni seriali possono essere gestiti attraverso SPI Header (che su altre schede prendono il nome di ICSP); questi pin supportano le comunicazioni attraverso la libreria SPI, anche questa una vecchia conoscenza degli utenti Arduino. I pin vengono portati “all’esterno” su di un pin-header a 6 contatti che è fisicamente compatibile con la versione uno ma anche con Leonardo e Mega2560. Questo header può essere utilizzato solo per comunicare con altri dispositivi SPI e non per effettuare la programmazione del SAM3X.

Per quanto riguarda CANTX e CANRX non c’è molto da dire se non che si tratta dei pin di supporto per le protocollo di comunicazione di tipo CAN che, tuttavia, non sono ancora supportata dalle API di Arduino. Una predisposizione futura?

Anche in questa versione esiste il LED 13 (“L”); utilizzato nella versione uno come test per verificare il funzionamento, anche in questa può essere utilizzato dall’utente. È anche possibile effettuare il “dimming” del LED, dato che il pin 13 è anche un output PWM.

Le comunicazioni TWI sono supportate e gli utenti potranno utilizzare TW1 (pin 20 e 21)  e TW2 con l’ausilio della Wire library.

Per quanto riguarda gli ingressi analogici, ovvero i pin numerati da A0 ad A11, su ciascuno di questi ha una risoluzione da 12 bit, il che significa che ci sono 4096 valori possibili in ingresso. Tanti? Pochi? Dipende, ovviamente!

Di default la risoluzione delle letture viene impostata a 10 bit per garantire la compatibilità con altre schede Arduino. Con la funzione analogReadResolution(), però, a questo si può certamente porre rimedio.

AREF è un pin connesso alla riferimento analogico del SAM3X grazie ad un resistore. Questo pin può essere utilizzato tramite la funzione analogReference().

DAC1 e DAC2, invece, permettono di avere accesso ai due output analogici veri e propri che possono essere utilizzati per creare, per esempio, un’uscita audio grazie alla libreria apposita.

Come in altre schede, molto utile risulta la funzione di Reset che non manca grazie all’apposito pulsante.

Le comunicazioni

Vediamo, adesso, qualcosa di un po’ più approfondito sulle comunicazioni. Arduino DUE permette la comunicazione sia con il computer sia con altri dispositivi, così come abbiamo già detto. Il SAM3X è dotato di una UART hardware ed altre tre per le comunicazioni seriali TTL a 3.3 V.
La porta di programmazione, che, come abbiamo detto, è una delle due USB che la scheda ha, è connessa ad un ATMega16U2, e fornisce una porta virtuale COM per la connessione con il computer. Il dispositivo viene riconosciuto dal sistema operativo Windows grazie ad un file *.inf mentre su OSX e su Linux essa verrà riconosciuta automaticamente (il solito Windows!).

Il 16U2 è connesso alla UART del SAM3X; RX0 e TX0 permettono la comunicazione seriale-USB per programmare la scheda attraverso questo microcontrollori. Il software include, come vedremo più avanti, il serial monitor, che ben conosciamo, e che permette l’invio e la ricezione di semplici dati di testo. Durante l’utilizzo di questa “periferica” il LED RX e TX lampeggerà.

La porta USB nativa è connessa al microcontrollore SAM3X per permettere la comunicazione seriali CDC tramite USB. Questo permette di emulare un mouse o una tastiera USB. Questa seconda porta, tuttavia, permette anche la connessione fisica di mouse, tastiere o similari, per i quali componenti esiste una libreria specifica.

Uno degli aspetti fondamentali della scheda è la protezione da sovracorrenti. Arduino due è dotato di un fusibile resettabile che protegge la porta USB del computer da cortocircuiti o sovracorrenti; anche se la maggior parte dei computer ha il proprio sistema di protezione interna da problematiche di questo tipo, il fusibile rappresenta un ulteriore livello di protezione. Era già presente sulla scheda uno e viene riproposto in questo caso come misura utile. Il valore di corrente al di sopra del quale non si può andare e 500 mA applicati sulla porta; dovesse arrivare proprio questo valore, la connessione verrà interrotta immediatamente per evitare sovraccarichi.

Arduino: le due versioni a confronto

Che arrivasse questo momento, che proponessi un “testa a testa” era quasi scontato e probabilmente anche gli autori delle schede avranno pensato a come fronteggiare la necessità di argomentare l’introduzione di una nuova scheda con prestazioni che valessero la pena di comprarne un’altra. Ed effettivamente è così!
Le specifiche tecniche della nuova versione di Arduino le abbiamo già riportate la volta scorsa ma, questa volta, vi proponiamo quelle della versione uno sottolineando che cosa è diverso rispetto alla sua evoluzione:

Microcontroller

ATmega328 contro un SAM3X attuale

Operating Voltage

5V contro i 3.3 attuali

Input Voltage (recommended)

7-12V

Input Voltage (limits)

6-20V

Digital I/O Pins

14 (di cui 6 PWM) contro i 54 (e 12) attuali

Analog Input Pins

6 contro i 12 attuali

DC Current per I/O Pin

40 mA contro i 130 attuali

DC Current for 3.3V Pin

50 mA contro gli 800 attuali

Flash Memory

32 KB (ATmega328) dei quali 2 KB usati dal bootloader

SRAM

2 KB (ATmega328) contro i 96 attuali

EEPROM

1 KB (ATmega328)

Clock Speed

16 MHz contro gli 84 attuali

Insomma, insieme al numero di bit con i quali possiamo avere a che fare, che è passato da 8 a 32, praticamente ogni caratteristica della scheda è stata potenziata di un fattore quattro, rendendola semplicemente più performante in tutto. Unica limitazione sembrerebbe essere proprio quel valore massimo di tensione di lavoro che è passato da 5 a 3.3 V.

Tirando le somme

Insomma, da quanto abbiamo visto fino a questo momento sembra che ci siano davvero tante buone notizie che attendono tutti coloro che decideranno di acquistare la scheda di cui abbiamo parlato. Tante sorprese, molte notizie di grande rilievo, tante buone idee che sono state messe in pratica e concorrono tutte insieme a dar da fare ai progettisti, agli ingegneri, agli hobbisti ed agli studenti di oggi e di domani.

Il suo aspetto grafico, il suo prezzo assolutamente competitivo e tutto quello di cui abbiamo parlato fino a questo momento la rendono la scheda che avete sempre desiderato! Unico neo, punto dolente o nodo da sciogliere, se volete, è la disponibilità: siamo tutti in attesa ed attendiamo i rifornimenti.

La prossima volta entreremo più nel cuore della scheda per vedere che cosa c’è, fare un confronto con la vecchia e prepararci a metterci le mani sopra. Rimanete con noi allora. Alla prossima.

 

Quello che hai appena letto è un Articolo Premium reso disponibile affinché potessi valutare la qualità dei nostri contenuti!

 

Gli Articoli Tecnici Premium sono infatti riservati agli abbonati e vengono raccolti mensilmente nella nostra rivista digitale EOS-Book in PDF, ePub e mobi.
volantino eos-book1
Vorresti accedere a tutti gli altri Articoli Premium e fare il download degli EOS-Book? Allora valuta la possibilità di sottoscrivere un abbonamento a partire da € 2,95!
Scopri di più

7 Comments

  1. Emanuele Emanuele 8 gennaio 2013
  2. Boris L. 9 gennaio 2013
  3. Piero Boccadoro Piero Boccadoro 9 gennaio 2013
  4. fgiava 19 gennaio 2013
  5. fgiava 23 gennaio 2013
  6. dna54 27 marzo 2013
  7. Emanuele Emanuele 27 marzo 2013

Leave a Reply