Il nostro primo approccio con lo sviluppo su piattaforma Arduino non è stato proprio di quelli più semplici. L’obiettivo era sviluppare un sistema in grado di registrare su una serie di nodi distribuiti le principali misure relative agli spostamenti (accelerazioni e rotazioni) di un corpo complesso. Come ulteriori requisiti è stato richiesto l’assenza di cablaggi, dimensioni dei dispositivi compatte, frequenze di acquisizione di 400 campioni al secondo e sincronizzazione dei dati. Abbiamo iniziato a valutare tutte le piattaforme open, partendo da Arduino Uno, Raspberry Pi, Beagle Bone Black, per tornare poi sull’Arduino YUN. I motivi che hanno spinto a questa scelta sono:

  1. Disponibilità di una comunità di sviluppatori Open Source molto ampia
  2. Connettività WiFi integrata (no shield)
  3. Slot SD Card già disponibile (anche se qui abbiamo avuto una sorpresa negativa)
  4. Possibilità di avere sullo stesso dispositivo un altro processore, oltre al solito microcontrollore ATmega, sul quale potesse girare Linux e scripts python

Lo YUN da http://arduino.cc

Per la sensoristica ci siamo orientati su una breakout board di Adafruit che potesse misurare la variazione di 9 Gradi di libertà: 3 x accelerazione, 3 x orientamento e 3 x inclinazione.
La Adafruit 9-DOF IMU Breakout integra due sensori prodotti da ST, LSM303 con accelerometro 3D e Magnetometro 3D e il giroscopio 3D L3GD20….9 Gradi di libertà (9DoF), volendo c’era anche la versione con il barometro, per arrivare a 10 DoF.

IMU a 9 Gradi di Libertà, da http://www.adafruit.com

Altri componenti necessari sono stati:

  • Un Real Time Clock (RTC) ultra preciso
  • Batteria Litio 1400 mAh a 3,7V
  • Power Booster, per portare a 5V la tensione della batteria
  • Carica Batterie
  • ….e tanta pazienza

L’ultimo punto è fondamentale per chi come noi non ha competenze specifiche in campo elettronico. Siamo principalmente degli hacker sul codice e non sull’hardware. Come tutti gli sviluppatori non apprezziamo molto mettere le mani sul “ferro”, ma di fornte ad una piattaforma aperta e libera come Arduino non ci potevamo tirare indietro ma ci siamo comunque dovuti armare di tanta pazienza.

Problemi affrontati e risolti:

  • Le librerie dello YUN , in particolare Bridge e Filesystem, non permettono di scrivere sulla SD in maniera performante, per cui ci siamo dovuti inventare noi un protocollo che via seriale permettesse al codice sul ATmega di Comunicare con il codice python sul AR 9331. Questa inefficienza del Bridge ci ha un po’ stupiti, e a posteriori avremmo dovuto valutare meglio le performance di IO che abbiamo dato invece per scontate. Per fortuna avevamo scelto una piattaforma con due processori, per cui l’ATmega gestisce i sensori e l’AR 9331 gestisce i dati (SD, Sincronizzazione e Comunicazione via WiFi)
  • Leggendo (con poca esperienza alle spalle) i Datasheet di un sensore sembrerebbe che si possa campionare dati a 400 Hz  senza grossi problemi! Abbiamo scoperto che la realtà è un’altra….e su questo ci starebbe un post terra terra che spiegasse ai neofiti del “ferro” come valutare un sensore
  • La sincronizzazione in un sistema distribuito non è banale, abbiamo sviluppato un protocollo UDP nel quale il Gateway è in grado di inviare in Multicast una sorta di ping che permetta poi di confrontare tra di loro i clock degli Arduino al momento della ricezione del ping. Con questo riferimento è poi possibile aggregare ed ordinare temporalmente tutti i dati acquisiti sui vari nodi.

Ancora una nota positiva su Python e Twisted: Python è senza dubbio il linguaggio di programmazione ideale per progetti agili  che richiedono interoperabilità; Twisted permette di sviluppare rapidamente in Python applicazioni di networking  molto avanzate.

arduino_yun_01arduino_yun_02

Pubblicheremo a breve alcuni dettagli del progetto, per ora la sintesi del nostro risultato è in questo diagramma:

arch