Con il processore ARM da 84 MHz, Arduino Due rappresenta un punto di svolta rispetto ai modelli precedenti, incrementando notevolmente la capacità di calcolo. Tuttavia, resta comunque possibile integrare ulteriori chip per estenderne le capacità ed effettuare, per esempio, dei calcoli parallelamente al lavoro eseguito da Arduino.

In particolare, voglio prendere in esame una FPU prodotta da Micromega. Sebbene sia maggiormente utilizzata su schede come Arduino Uno, ho voluto integrare questo chip con la mia Due per poter effettuare, in modo totalmente trasparente ad Arduino, dei calcoli relativi a dei dati GPS ricevuti esternamente per poi fornire al programma principale solamente il risultato di tali operazioni. Per questioni di spazio sulla protoshield ho preferito optare per la versione a 32 bit della FPU (chiamata v3.1), anche se il produttore ha messo in commercio pure una versione a 64 bit, sicuramente più precisa nei calcoli.

Il chip può interfacciarsi ad Arduino attraverso l’interfaccia SPI o quella I2C. In questo articolo prendiamo in esame solamente la prima strada, che è quella da me utilizzata. Per realizzare il progetto, è fondamentale una breadboard o, se ti senti più sicuro, una protoshield su cui saldare direttamente i componenti. I collegamenti da effettuare sono riportati a pagina 4, e successive, del datasheet (allegato a fine articolo). L’unica questione che mi sento di sottolineare dal punto di vista hardware è la necessità di utilizzare per l’alimentazione la linea a 3.3V, al fine di evitare di ricevere i 5V sui pin di Arduino (con conseguenti danni alla scheda).

Per quanto riguarda la parte software, è possibile far eseguire alla FPU delle istruzioni inviate direttamente da Arduino o, per effettuare delle elaborazioni in parallelo, salvare delle funzioni direttamente nella memoria flash del chip e ottenere un risultato una volta elaborato. In entrambi i casi, tuttavia, ho trovato necessario modificare le librerie distribuita dal produttore al fine di adattarle alle caratteristiche di Arduino Due e garantire una completa compatibilità (ho corretto le definizioni dei pin e la velocità di comunicazione tramite SPI); le versioni aggiornate sono allegate a fine articolo assieme al datasheet.

Per quanto riguarda il primo caso, sul sito ufficiale di Arduino è riportata una spiegazione delle principali funzioni utili ad interagire con la FPU e quello che segue è uno script che restituisce come risultato il valore della radice quadrata di 2.

I parametri inseribili nel comando Fpu.write sono definiti nell’Instruction Set della FPU.

Per quanto riguarda il secondo caso del calcolo parallelo, sicuramente più utile con Arduino Due, bisogna necessariamente sfruttare l’IDE specifico per la FPU (scaricabile da qui) e il chip MAX3232 di cui avevo parlato in un precedente articolo (l’unica differenza consiste nello sfruttare i pin per la comunicazione seriale della FPU, anzichè quelli di Arduino). Nel mio caso, attraverso la stessa porta RS232 collego poi un ricevitore GPS (Garmin 17N, per la precisione) e, una volta elaborati i dati tramite apposite formule, restituisco ad Arduino solamente il valore della distanza percorsa. Tutte queste operazioni sono però totalmente trasparenti alla Due, che ogni secondo riceve solamente un valore dall’esterno.

Per capire quando un dato è disponibile al trasferimento, la FPU imposta poi il suo pin 11 (SOUT), e quindi il pin 74 di Arduino Due (MISO) a LOW. Una volta che la FPU torna ad essere occupata per l’elaborazione dei dati, il pin viene impostato ad HIGH. Nello sketch di Arduino è quindi sufficiente controllare, attraverso il loop, lo stato di questo pin e, nel caso, trasferire le informazioni.

Infine, per quanto riguarda l’alimentazione a 3.3V, è fortemente consigliato dal produttore di abbassare il clock da 29.48MHz a 14.74MHz, operazione effettuabile collegando la FPU ad un PC tramite porta RS232 e utilizzando poi la pagina di configurazione presente nell’IDE proprietario.

Datasheet: uMFPU-V3_1 Datasheet

Instruction Set: uMFPU-V3_1 Instruction Set

Librerie: Arduino-uM-FPU V3_1