chipKIT™ UNO32 – Un rivale di Arduino, ma con un PIC a 32bit semplice da programmare

Sono molto orgoglioso di presentarvi, con la collaborazione della Digilent che ha fornito gratuitamente allo staff di Settorezero.com una scheda chipKIT™ UNO32 (ne approfitto per ringraziare pubblicamente gli ingegneri A. Wong e J. Harris che si sono dimostrati davvero cordiali e in gamba), questa nuova piattaforma di sviluppo Arduino-compatibile ma basata su PICMicro… E che Picmicro!

A bordo del chipKIT™ UNO32, difatti, non è montato il classico ATMega328 a cui siamo abituati, ma un super-performante PIC32MX320F128H. Avete letto bene. Abbiamo a bordo di questa scheda un PIC a 32bit dalle potenzialità enormi (gira ad 80MHz e la CPU ha una velocità di 32MIPS, 128K memoria Flash e 16K memoria RAM) ma programmabile con la stessa facilità con cui si programma Arduino.

Chipkit™ UNO32 (la scheda rossa a sinistra) Vs Arduino™ Duemilanove. Le schede hanno lo stesso form-factor. Le prime differenze che saltano all’occhio (oltre, ovviamente alla MCU!) sono il numero di pin superiore e l’adozione di un connettore USB mini tipo B

La compatibilità con Arduino di tale scheda, difatti, non è limitata esclusivamente al form-factor, che tra l’altro rende utilizzabile sul chipKIT™ UNO32 anche la maggior parte degli Shield aggiuntivi esistenti per Arduino. Il vero punto di forza, a mio parere, sta nell’IDE. Gli ingegneri della Digilent hanno difatti rielaborato l’IDE di Arduino per poterlo utilizzare con il PIC32 montato sul chipKIT™ UNO32.

Chi vuole passare da Arduino ad una piattaforma di sviluppo più evoluta si trova difatti ad eseguire una transizione senza intoppi dal momento che l’ambiente è già familiare e il modo di programmare le schede è praticamente identico: non si necessita di imparare nulla di nuovo ed è possibile utilizzare lo stesso codice già scritto per Arduino. Il risultato di questo lavoro si chiama MPIDE. Non è semplicemente l’IDE di Arduino riadattato per il chipKIT™ UNO32 ma è un IDE capace di lavorare anche con Arduino stesso!

L’IDE del chipKIT™ UNO32 – MPIDE

Una volta scaricato l’IDE, non dobbiamo fare altro che estrarre il file ZIP e ci troveremo di fronte alla stessa, identica cosa che abbiamo con Arduino (quindi: nessuna installazione), a parte il fatto che il nome dell’eseguibile è differente…

…così come  lo Splash-screen

Sappiamo bene che con Arduino, prima di iniziare a programmare, dobbiamo selezionare il tipo di scheda dato che di “Arduini” ne esistono varie versioni. Bene, andiamo nel menù Tools -> Board e scopriamo la sorpresa:

Ebbene sì! Come anticipato, MPIDE può continuare a lavorare tranquillamente anche con le varie versioni di Arduino oltre che con il chipKIT UNO32™  (e quindi con il suo fratello maggiore chipKIT MAX32™) e con altre schede di sviluppo della Microchip e della Digilent basate su PIC32.

Colleghiamo il chipKIT UNO32™ al PC tramite un connettore USB dotato di connettore USB mini tipo B (quindi il cavetto che usate con Arduino non va bene! Ce ne vuole uno col connettore usb “più piccolo” !).

Sulla griglia di partenza

Il PC riconoscerà un adattatore Seriale come già avveniva per Arduino Duemilanove. Sul chipKIT UNO32™ è difatti montato un chip FTDI FT232RQ per il quale i driver sono già inclusi nella cartella “drivers” di MPIDE (insieme ai driver dei nuovi Arduino UNO che non montano l’FTDI ma un ATMega aggiuntivo per la gestione della comunicazione su USB).

Prima di cominciare non dimentichiamo, ovviamente, di selezionare la nuova porta seriale creata dall’installazione dei drivers del chip FTDI andando nel menù Tools -> Serial Port.

Ho fatto una prova rapida caricando lo sketch di esempio del led che lampeggia:

Compiliamolo e carichiamolo in un sol colpo premendo il pulsante Upload:

Attendiamo un po’: dopo qualche secondo di pausa apparente, i due led dell’FTDI cominciano a lampeggiare ad indicare il trasferimento dati e alla fine  nella finestra terminale appare il messaggio di caricamento completato:

Fila tutto liscio: il led lampeggia!

Dove lo state cercando il led? Sta in alto a destra!

Dal momento che sono cattivo, decido di fare una cosa: collego Arduino Duemilanove insieme al  Chipkit UNO32™ su un’altra porta USB. Tenendo aperto lo stesso sketch cambio soltanto le impostazioni per la scheda e quindi della porta seriale. Eseguo quindi il caricamento su Arduino Duemilanove:

Su Arduino lo stesso sketch preso ad esempio occupa meno spazio. E’ facile notare l’enorme differenza con il quantitativo di memoria a disposizione

Funziona tutto! MPIDE quindi funziona davvero anche con Arduino! Ma d’altronde non avevo dubbi. Stiamo parlando della Digilent, mica di chicchessia!

Voglio fare un’altra prova con il programma di esempio “ASCII table” che sfrutta la UART per stampare una tabella ASCII. Provo con il chipKIT UNO32™ :

Funziona tutto correttamente. Apro il Serial monitor per guardare il risultato, tutto liscio:

Faccio quindi la stessa cosa con Arduino:

Anche qui funziona tutto correttamente tenendo collegate entrambe le schede con lo stesso IDE! Fantastico!

Vi prego di non fare caso al fatto che lo stesso programma sul chipKIT UNO32™ occupa “qualcosa di più”: questo difatti è un paragone da non fare assolutamente, perchè? Ci troviamo innanzitutto di fronte a due piattaforme completamente differenti, e poi comunque mi sono limitato a fare due prove molto semplici.

E’ chiaro che se usiamo un PIC32 come un Arduino, un po’ lo stiamo penalizzando in quanto ad hardware assolutamente non c’è paragone: il Chipkit è più performante su numerosi punti: memoria a disposizione, velocità di elaborazione e periferiche/IO, e poi stiamo parlando di un’architettura a 32bit contro un’architettura ad 8 bit. Ricordo poi che MPIDE continua ad utilizzare Avrdude per l’interfacciamento e suppongo ci siano ancora delle ottimizzazioni da fare. In ogni caso la Digilent è molto attiva ed aggiorna di continuo l’IDE: la nuova versione che ho provato io è stata rilasciata appena l’altro ieri.

Se si vanno a fare dei test sulla velocità di esecuzione e di calcolo, il Chipkit UNO32™ non ha paragoni, è possibile leggere i risultati dei test di benchmark eseguiti dai ragazzi di HackaDay in questo link. Si evince chiaramente che fare un paragone è quantomeno assurdo: il PIC32 stravince in tutti i campi arrivando ad avere una velocità fino a 130 volte superiore su alcune particolari applicazioni. In aggiunta abbiamo un quantitativo di memoria programma che ci permette di fare delle cose davvero complesse. In ogni caso se davvero volete sfruttare al massimo le potenzialità del PIC32… :

Oltre MPIDE

Avere un IDE arduino-compatibile è sicuramente molto comodo: anche chi non ha mai programmato in vita sua può avere a disposizione una piattaforma di sviluppo estremamente potente (ragà! Stiamo parlando di una MCU a 32 bit! Mica fagioli e cotiche!) ma programmabile con la stessa semplicità di Arduino. La semplicità si riflette anche nella questione di avere numerosi esempi di programmazione a disposizione, tanti dei quali sono già integrati nell’IDE, e dai quali possiamo partire per sviluppare le nostre nuove applicazioni e quindi imparare.

Ovviamente si tratta sempre di un PICMicro, quindi anche gli esperti potranno utilizzare questa piattaforma al massimo delle prestazioni utilizzando MPLAB IDE (o il nuovo nato MPLAb X) insieme ad MPLAB C32, sfruttando gli esempi di programmazione in C32 offerti dalla microchip e caricando i programmi compilati tramite ICSP.

Il chipKIT UNO32™ ha difatti le piazzole su cui poter saldare o appoggiare momentaneamente il nostro amato connettore ICSP:

Le piazzole del connettore ICSP sono sfalsate per poter tener fermo il connettore. Per cui non è necessario saldarlo: uno strip maschio da 6 pin rimane fermo in maniera solida

Ho fatto quindi una prova che potete fare anche voi: prendete uno spezzone di strip maschio da 6 pin (non fornito in dotazione) e infilatelo nelle piazzole dell’ICSP: non è necessario saldare, per questo motivo le piazzole hanno quella disposizione a zig zag:

Il connettore si incastra perfettamente e fa contatto in maniera corretta, senza giochi

Ci collego quindi il Pickit2:

Caro, vecchio Pickit2… non finirai mai di stupirmi!

Sorpresa! Potete programmare il chipKIT UNO32™ anche con il Pickit2!

Adesso mi aspetto il solito troll di turno che fa la domanda: “e con il pickit 3?”

Pin aggiuntivi rispetto ad Arduino e corrispondenze

Avete visto dalle foto che il chipKIT UNO32™ ha dei connettori aggiuntivi che permettono di avere ben 22 I/O in più rispetto ad Arduino. Questi connettori sono posti verso l’interno e quindi non interferiscono con gli Shield di Arduino, che usano i connettori posti verso l’esterno. In ogni caso è ovvio che i pin aggiuntivi non possono essere utilizzati con i normali Shield di Arduino.

Il connettore J7 riporta i pin da utilizzare come ingressi analogici (e come I2C). Sul chipKIT UNO32™ abbiamo 6 pin analogici in più numerati da A6 ad A11:

A4 e A5 sono riportati in un riquadro per indicare che sono utilizzati anche dalla periferica I2C. Il loro funzionamento come porte Analogiche o come pin I2C si imposta tramite i due jumper visibili sulla destra

Gli esempi di arduino per identificare i pin analogici utilizzano i simboli “A0″,”A1” ecc.:

sensorValue = analogRead(A0); // leggo il canale A0

Questo funziona anche con il chipKIT UNO32 fino ad A5. Se però provate ad utilizzare un canale aggiuntivo (A6, A7 ecc), il programma non viene compilato e genera errore (almeno con la versione di MPIDE all’atto della scrittura di questo articolo), per usare i pin in più dovete scrivere il numero senza la lettera A davanti:

sensorValue = analogRead(11); // leggo il canale A11 sul Chipkit UNO

Diamo quindi uno sguardo anche ai pin digitali:

I pin utilizzabili come PWM sono quelli che riportano il numero sottolineato. Fate attenzione : il pin n°11 non ha il PWM presente invece su Arduino, per cui un eventuale shield che fa uso del PWM sul pin n°11, qui non funzionerà. Per ora l’unico shield segnalato che fa uso del PWM su 11 è un driver motori prodotto dalla RuggedCircuits.com

I pin fino al n°13 sono presenti anche su Arduino. Al pin 13 seguono la massa (G) ed il riferimento esterno per il modulo A/D (A). Affianco ai pin normalmente presenti anche su Arduino abbiamo una fila aggiuntiva numerata da 26 a 41, quindi altri 16 I/O in più. Anche in questo caso le librerie funzionano correttamente se proviamo ad impostare come I/O uno di questi pin aggiuntivi. Per cui le ‘istruzioni:

pinMode(39, OUTPUT); // imposto il pin 39 come uscita
digitalWrite(39, HIGH); // imposto il pin 39 a livello alto

funzionano correttamente senza problemi, con la sola differenza che i livelli di tensione in uscita sono più bassi di Arduino dal momento che il PIC32 funziona a 3.3V. Ma questo non è un problema in quanto nell’interfacciamento con le logiche TTL, 3.3V viene comunque visto come livello logico alto. Il problema sarebbe il contrario: interfacciare una logica che invia segnali a 5V, ma è stato pensato anche a questo come vi illustro di seguito.

Una corrispondenza tra i pin del PIC32 montato a bordo ei pin della scheda può essere trovata qui.

Sulla scheda vi è anche una chicca da smanettone che vi svelo con questa immagine:

Si: c’è l’alloggiamento per il quarzo secondario (X2), i due condensatori per metterlo in oscillazione sono già montati. A cosa serve il quarzo secondario? A sfruttare l’RTCC interno, cosa che Arduino non ha. Il che vuol dire che non c’è bisogno di utilizzare RTCC esterni come il DS1307 per avere una data/orario a disposizione. Ovviamente questa caratteristica è fruibile (per ora) solo utilizzando MPLAB C32. Il quarzo secondario si collega ai pin del pic SOSCI (RC13) e SOSCO (RC14) che non sono riportati sui connettori esterni.

Così ho risposto in anticipo, seppur in parte, a tutti quelli che avrebbero detto: ma il PIC32 usato ha 53 I/O, come mai non li hanno implementati tutti?

Compatibilità shields e librerie

Come detto, il form factor del chipKIT UNO32™ è lo stesso di Arduino Duemilanove/Arduino UNO, fori di fissaggio compresi, per cui è possibile montare sul chipKIT UNO32™ la maggior parte degli Shield che usate con Arduino. Ovviamente dico la maggior parte perchè potrebbe capitare che alcuni shield particolari non funzionano. Se avete dei dubbi potete chiedere sul Forum riservato agli utilizzatori del chipKIT UNO32™. C’è un Thread apposito dove siete invitati a lasciare un post per dire “questo shield funziona, l’ho provato” oppure “questo shield non può essere utilizzato perchè blablabla”. Il thread in questione si trova a questo indirizzo.

Riguardo alla questione relativa alla compatibiltà delle librerie: possono essere utilizzate direttamente tutte le librerie di Arduino che non eseguono un referenziamento diretto ai registri o a periferiche specifiche dell’ATMega. Un esempio è la libreria relativa all’Ethernet Shield che esegue dei referenziamenti diretti e sulla quale si sta lavorando: leggi thread sul forum. Le librerie wire (usate per la comunicazione I2C) invece sono state riscritte per cui funzionano correttamente con il Chipkit UNO32™.

I più attenti sanno che Arduino funziona normalmente a 5V mentre il PIC32 gira a 3.3V per cui accadrebbe un bel pasticcio interfacciando shield funzionanti a 5V con gli I/O del PIC32 che non possono accettare più di 3.3V! Ebbene si può fare: sul chipKIT UNO32™ sono stati adottati degli accorgimenti, utilizzando dei diodi, per poter interfacciare i pin che non sono 5V-tolerant con le logiche a 5V. Alcune delle teniche utilizzate sono descritte su questo documento Microchip. I pin che sono 5V-tolerant ovviamente non hanno bisogno di accorgimenti e quindi non hanno i diodi.

Impostazione dei jumpers

Sul chipKIT UNO32™ ci sono alcuni jumpers non presenti su Arduino e che consentono di avere delle caratteristiche aggiuntive. La descrizione dettagliata di come operano le selezioni eseguite con i jumpers è possibile leggerla dal documento ufficiale linkato nel penultimo paragrafo di questo articolo. Qui mi limito a dare una spiegazione rapida in italiano:

  • JP2: consente di abilitare o disabilitare il regolatore a 5V onboard. Di default si trova connesso in posizione “REG”, il che consente di inviare la tensione di alimentazione, da applicare al jack, verso il regolatore a 5V. Questa è l’opzione da tenere selezionata se si è in dubbio. In ogni caso il regolatore a 3.3V (tensione di funzionamento del PIC32 on-board) è sempre attivo.
  • JP4: configura il pin n°10 (quello sul connettore esterno, non il pin del pic!) come PWM o come semplice I/O digitale. In pratica collega sul pin 10 il pin RG9 del pic (funzionamento come I/O digitale) o il pin RD4 (PWM)
  • JP5 e JP7: configurano il funzionamento della modalità SPI come master o come Slave
  • JP6 e JP8: configurano A4 e A5 (pin sul connettore esterno, normalmente utilizzati da Arduino come ingressi analogici o come pin per la comunicazione I2C) come normali pin analogici o come SDA(A4) e SCL(A5) per usare l’I2C

In Italia i prodotti della Digilent vengono distribuiti da Mirifica, e il mio consiglio è di andare sul loro sito per l’acquisto del chipKIT™ UNO32.

Documentazione e Downloads

Galleria fotografica chipKIT UNO32™

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)