Recensione Arduino2009

Recensione Arduino2009

Arduino2009 è un dei sistemi di sviluppo hardware/software open source più noti e utilizzati da studenti, hobbisti, designer o da chi vuole affacciarsi, in maniera non eccessivamente complicata, ad un mondo che permette di rendere concrete dell’idee che spaziano su una vasta gamma di applicazioni.

Il sistema, nel suo complesso, è basato su una semplicissima scheda di I/O e su un ambiente di sviluppo che usa una libreria Wiring (funzioni precompilate e semplici da richiamare e annidare) per semplificare la stesura dei firmware in C/C++ like da far eseguire sulla scheda.

Wiring è un ambiente di programmazione open source utilizzato per impieghi su schede elettroniche, pensato per una facile applicazione: si tratta di un progetto italiano nato ad Ivrea e successivamente sviluppato all’università Los Andes in Colombia. Tra i tantissimi utilizzi Arduino2009, e ancor prima Arduino10000 suo predecessore, può essere utilizzato per lo sviluppo di oggetti interattivi stand alone, ma può anche interagire con software residenti su computer.

Una scheda Arduino consiste di un microcontrollore a 8-bit AVR, con l’aggiunta di pochi componenti di contorno che ne facilitano l’utilizzo con altri circuiti. Le schede ufficiali, e con queste anche Arduino2009, usano i chip della serie ATmegaAVR e nello specifico, prima del marzo 2009, Arduino2009 era supportato dal chip ATmega168 per poi essere sostituito con un ATmega328.

Essendo un progetto open source di cui sono disponibili in rete sia la descrizione hardware dettagliata e corredata di schematici che il source code dell’ambiente di sviluppo Wiring, si trovano in giro dei cloni della scheda (o delle schede facenti parte di questa linea di prodotti) che utilizzano altri microcontrollori pin-compatibili come il PIC18F2550 prodotto dalla Microchip.

Arduino 2009: Descrizione hardware

Come già detto nell’introduzione, Arduino2009 rappresenta la normale evoluzione della scheda Arduino10000. Si distingue dalla 10000 per l’avere la selezione automatica dell’alimentazione (può essere alimentato sia da porta USB che esternamente tramite un wall power supply o una batteria con tensione compresa tra 7V e 12V), cosa che prima avveniva manualmente tramite un dip switch. La scheda basa il suo funzionamento e la sua capacità di calcolo sul microcontrollore ATmeg328 che conferisce all’hardware le seguenti caratteristiche:

    – Tensione di lavoro del microcontrollore: 5V;
    – Tensione d’ingresso (consigliata): 7-12V;
    – Pin digitali di I/O: 14 (6 dei quali possono generare nativamente dei segnali PWM);
    – Pin analogici: 6;
    – Memoria programma: 32 KB (ATmega328) di cui 2KB sono utilizzati per il bootloader;
    – SRAM: 2 KB (ATmega328);
    – EEPROM: 1 KB (ATmega328);
    – Clock Speed: 16 MHz.

Lo schema elettrico della board, direttamente scaricabile dal sito internet http://www.arduino.cc/, può essere diviso e analizzato in almeno tre macroblocchi funzionali ovvero alimentazione, blocco per la comunicazione usb e blocco microcontrollore.

Il blocco di alimentazione provvede a regolare la tensione applicata esternamente tramite l’apposito connettore e portarla ad un valore di 5V stabilizzati attraverso l’ausilio del regolatore lineare MC33269D. Visto che la scheda può anche essere alimentata direttamente dalla porta USB, la selezione automatica della sorgente di alimentazione viene realizzata attraverso un n-mosfet a svuotamento che interrompe l’alimentazione da USB nel momento in cui riceve sul suo terminale di gate una tensione atta a svuotare il canale preformato. Si comporta cioè da interruttore normalmente chiuso che si apre a seguito di un segnale che lo fa aprire interrompendo la linea che porta l’alimentazione alla scheda tramite la USB.

Il suddetto segnale viene generato attraverso il doppio amplificatore operazionale LM358 del quale uno stadio amplificatore viene utilizzato in catena aperta come comparatore di tensione che confronta la tensione di 3V prelevata da un opportuno pin dell’integrato FTDI (preposto alla comunicazione USB) con metà della tensione di alimentazione proveniente dal connettore esterno, generando un segnale positivo prossimo alla tensione di alimentazione dell’operazionale quando la Vin/2 supera 3V. Se ci si mantiene al di sopra del limite inferiore dei 7V per la tensione Vin esterna, l’uscita 1 dell’operazionale subirà sicuramente la commutazione generando quella tensione positiva che può far spegnere il mosfet e con esso interrompere i 5V provenienti dalla porta USB. Il secondo blocco operazionale presente nel package del LM358 viene utilizzato come buffer posto tra l’uscita del comparatore e il gate del mosfet.

La comunicazione USB tra il PC e la board è implementata utilizzando un circuito integrato della linea FTDI che svolge la funzione di convertire una comunicazione seriale con protocollo RS232 in una comunicazione USB 2.0. Oltre che per l’upload del firmware nella board, questa seriale virtuale che viene a crearsi una volta connesso Arduino2009 alla USB del computer serve per la comunicazione della board con degli applicativi realizzati adhoc dal progettista per interagire con la scheda tramite PC. Esiste una piattaforma software java-based chiamata Processing che se supportata con le librerie specifiche di Arduino permette di realizzare delle applicazioni standalone per potersi interfacciare alla board tramite PC.

Le potenzialità di tale ambiente non si limitano esclusivamente a questo, ma potendo esportare l’applicazione in formato java-applet, è possibile interagire con la board anche da un sito internet o uno smartphone. Inoltre, la ricchezza sul mercato mondiale di linguaggi di programmazione easy-used come Python e l’eccessiva quantità di documentazione ed esempi da cui partire, hanno fatto si che le community concentrate attorno ad Arduino abbiano creato un supporto per l’interazione con la scheda evidentemente alla portata di tutti, anche di coloro che magari si intendono di elettronica ma sanno il minimo sulla programmazione delle interfacce grafiche, qualunque sia la piattaforma o il sistema operativo su cui far girare l’applicazione.

Ultimo dettaglio sul chip FTDI riguarda la generazione di una tensione di riferimento da 3.3V che viene utilizzata sia per la commutazione automatica tra le sorgenti di alimentazione (USB/esterna), sia per poter fornire tale valore di tensione a moduli esterni (shield) che operano in modalità low voltage come potrebbe essere un modulo XBee oppure lo stesso ENC28j60 della Microchip o ancora una SDcard su cui salvare o andare a richiamare informazioni e dati che richiedono capienza e non-volatilità.

Il terzo blocco, ma non terzo per importanza, è quello facente capo al microcontrollore ATmega328, il cuore della scheda. Ogni Pin del microcontrollore è riportato all’esterno della board tramite i connettori strip femmina disposti lungo il perimetro della board.

Arduino2009: Comunicazione

La Arduino2009 ha una serie di periferiche e funzioni speciali che le permettono di comunicare con il computer ma anche interfacciarsi con un’altra scheda Arduino. Infatti la scheda può lavorare come applicazione stand alone ma anche come mattone elementare di una rete più complessa in cui le funzioni e la complessità computazionale possono essere ripartite tra le varie schede.

L’ATmega328 dispone di un modulo di comunicazione seriale UART TTL-compatibile (5V) accessibile dai piedini digitali 0 e 1, gli stessi che si collegano al FTDI e che inviano e ricevono i dati verso/da il serial monitor del software di sviluppo. In realtà, come anche per la modulazione PWM, non è necessario vincolarsi strettamente a questi 2 pin perché si possa instaurare una comunicazione di tipo seriale tra due schede, ma ogni pin può diventare di ricezione o di trasmissione per una comunicazione di tipo SPI attraverso delle funzioni di libreria già precompilate e pronte per poter essere richiamate e utilizzate.

Il microcontrollore ATmega328 supporta inoltre la comunicazione I2C utile ad esempio per interfacciare Arduino ad EEPROM esterne che tipicamente si appoggiano su questo protocollo di comunicazione. In generale, come ho potuto io stesso constatare, sia sul sito ufficiale del linguaggio Wiring che sul datasheet dell’ATmega328 è possibile recuperare tutte le informazioni necessarie per poter comprendere l’hardware che si ha sottomano e i gradi di libertà che questo concede al progettista.

Arduino2009: Approfondimenti relativi all’hardware

La scheda Arduino2009 ospita un fusibile auto-ripristinante sulla linea di alimentazione della USB per proteggere la porta del PC da eventuali sovraccarichi (oltre i 200mA) che potrebbero portare al danneggiamento irreversibile della porta stessa. In realtà, la porta USB di qualunque scheda madre moderna dovrebbe già essere equipaggiata di un sistema di protezione contro le sovracorrenti, ma l’aggiunta del fusibile direttamente sulla scheda Arduino allontana dal progettista il timore che il proprio PC, non disponendo di un tale sistema di sicurezza, possa danneggiarsi irreversibilmente.

Il clock è ottenuto tramite un quarzo da 16MHz che impone l’intervallo di tempo per l’esecuzione di un’istruzione, in quanto l’ATmega328 esegue un’istruzione ad ogni ciclo di clock, quindi la velocità di Arduino2009 di eseguire istruzioni è pari a 16MIPS.

In prossimità del connettore USB sono presenti 2 piccole piazzole stagnate cortocircuitate da un piccolissimo pezzo di metal che può essere interrotto semplicemente passandoci sopra la punta della lama di un taglierino. Questo contatto facilmente eliminabile serve ad abilitare di default l’autoreset del microcontrollore, ossia la possibilità di resettare il microcontrollore non solo tramite l’apposito tasto predisposto sulla board, ma anche durante la fase di upload del nuovo codice.

Infine, la memoria programma del microcontrollore è occupata per una quantità pari a circa 2KB dal bootloader che permette di aggiornare il codice utente senza disporre di un programmatore dedicato.

Il bootloader parte automaticamente ad ogni reset del microcontrollore e si pone in attesa di particolari comandi che ne attestano la programmazione. Se non dovesse arrivare nulla in un frangente di mezzo secondo circa, il program counter viene reindirizzato alla locazione di memoria da cui inizia il codice utente e questo viene eseguito. Al contrario, il bootloader provvederà a ricevere il codice macchina trasmesso serialmente dall’ambiente di sviluppo software e a programmare il microcontrollore.

Arduino2009: Ambiente di sviluppo software

Le board Arduino, compresa la versione Duemilanove, si programmano attraverso un IDE proprietario java-based realizzato a partire dal progetto Processing dal quale ha ereditato la struttura delle finestre e lo stile di menù e pulsanti. Si tratta di un ambiente di sviluppo con il quale si attraversano le varie fasi per l’aggiornamento del codice all’interno dell’ATmega328 e in particolare dispone di un editor di codice Wiring (C/C++ like), di un compilatore e di un’interfaccia alla COM virtuale generata dal FTD232 supportando il protocollo di programmazione STK500.

Dall’immagine si apprezza abbastanza bene l’essenzialità e la semplicità di tale ambiente di sviluppo che rende l’intero progetto Arduino competitivo rispetto ad altri sistemi. Infatti, destreggiarsi con i pochissimi ed essenziali comandi dell’ambiente rende la progettazione del codice un qualcosa di assolutamente veloce e semplice, ideale per chi non vuole perdersi nell’imparare ad utilizzare l’IDE ma vuole sin da subito vedere funzionare le proprie applicazioni. Non mi soffermo ulteriormente sulla descrizione dell’IDE visto che ci vuole davvero poco a prendere la giusta dimestichezza semplicemente facendo qualche prova di programmazione o editando qualcuno dei tanti esempi messi a disposizione per Arduino.

L’unica cosa che mi viene ancora da dire e che depone sicuramente a vantaggio di Arduino è la possibilità di poter scaricare dal sito internet ufficiale il codice sorgente dell’IDE essendo questo quanto la scheda rilasciato con licenza open-source. Scaricando l’IDE, nella medesima cartella vengono anche forniti i driver per il riconoscimento del transceiver USB FTD232 e nella cartella “libraries” possono essere aggiunte delle librerie che supportano funzioni specifiche ad una particolare shield prodotta e fornita da terzi o da se stessi per estendere su Arduino la capacità di interagire con il mondo esterno.

Per quanto concerne l’architettura del codice e la sintassi Wiring, in rete si trovano un sacco di tutorial ed esempi applicativi che rendono la fase di learning davvero semplice e veloce. Anche su questo non vorrei soffermarmi troppo perché le community impegnate a sostenere e a far crescere il progetto Arduino in tutto il mondo sono davvero tante e su queste si può fare affidamento per iniziare a sviluppare applicazioni, semplici o complesse che siano.

Laboratorio gestito via Ethernet
L’idea per la quale mi sono aggiudicato la scheda Arduino prevede la realizzazione di strumenti di laboratorio gestibili o monitorabili a distanza attraverso una pagina web dinamica sulla quale osservare i risultati di una misura o agire su delle slide-bar per poter variare soglie, tensioni e correnti. L’esigenza di disporre di un telecontrollo degli strumenti del mio laboratorio nasce dal fatto che molto spesso devo poter impostare dei cicli di misura su apparecchiatura elettronica di potenza e di doverne raccogliere periodicamente i risultati senza per forza dover essere sul posto nel momento della misura.

La soluzione più ovvia può essere quella di utilizzare un datalogger, ma questo non mi permetterebbe di osservare ad esempio cosa accade all’apparecchiatura se stressata con tensioni e correnti variabili. Se al contrario il datalogger venisse affiancato da un alimentatore da banco di potenza ed entrambi venissero gestiti a distanza tramite, ad esempio, una pagina web allora sarebbe molto più semplice fare tutte le prove possibili e immaginabili salvando in realtime un file di log dal quale evincere i risultati della misura (tensione, corrente, potenza, temperatura, ecc…).

Il primo strumento sulla quale ho pensato di applicare questa idea è un alimentatore da banco con tensione e corrente regolabili. Di seguito vi mostrerò quali sono gli sviluppi attuali dell’idea proposta riservandomi di pubblicare in un futuro non molto lontano codici e schemi definitivi che possano illustrare in tutta la sua interezza il progetto proposto.

Alimentatore da banco telecontrollato tramite pagina web
L’idea è quella di realizzare un alimentatore da banco a tensione variabile dal quale poter estrarre informazioni non solo sulla tensione d’uscita ma anche sulla corrente assorbita. Inoltre si deve poter regolare non solo la tensione ma anche la corrente massima oltre la quale il carico non deve essere sottoposto. Di seguito propongo un possibile schema a blocchi di principio(purtroppo per la creazione dello schema a blocchi mi sono servito della versione trial del software Edraw max e per questo le scritte in verde nello schema sono inevitabili) in cui però non è implementata la lettura della corrente di uscita.

Osservando lo schema a blocchi, la struttura dell’alimentatore è del tipo flyback off-line in cui la misura della tensione d’uscita avviene in maniera indiretta tramite un secondo secondario riferito alla massa di pilotaggio. Questo approccio permette di mantenere isolata galvanicamente l’uscita dal resto del circuito e in particolare dalla diretta tensione di rete.

La chiusura dell’anello di controllo sulla tensione d’uscita è demandata ad un circuito puramente analogico come potrebbe esserlo un amplificatore operazionale opportunamente retroazionato e contornato da pochi altri componenti passivi (resistenze e capacità) da formare un regolatore PI con all’ingresso lo stadio sottrattore necessario per calcolare l’errore tra il set-point e la tensione Vout_mis. Il segnale all’uscita dal regolatore viene posto in ingresso ad un modulatore PWM a singola modulante (generatore d’onda triangolare con a valle uno stadio squadratore) che pilota il gate del mosfet con un segnale ad onda quadra a duty-cycle variabile.

Tutta la sezione di controllo analogico, compreso il modulatore PWM, potrebbe essere sostituita da un solo circuito integrato come il TL494, ampiamente utilizzato per la regolazione sui flyback degli alimentatori ATX per PC.
In questo progetto la funzione di Arduino è tutto sommato di contorno perché l’anello sulla tensione d’uscita viene chiuso per via analogica mentre il setpoint di tensione viene fissato dalla board Arduino attraverso un’uscita PWM opportunamente filtrata tramite un filtro passabasso passivo (LPF anche del primo ordine): si cerca di creare un convertitore D/A estraendo tramite un LPF la componente continua del segnale PWM ad onda quadra. Inoltre Arduino misura in modalità open loop la tensione equivalente d’uscita tramite un ingresso A/D per poterla restituire come variabile monitorabile sulla pagina web.

Nello schema a blocchi manca la sezione relativa alla lettura della corrente d’uscita, lettura che sicuramente andrò a realizzare tramite un sensore ad effetto Hall o un flux-gate (ancora non l’ho del tutto definita) che vigila sulla corrente d’ingresso. Infatti, sempre per cercare di limitare il più possibile l’accoppiamento galvanico con la massa dell’impianto elettrico, la strategia è quella di misurare tensioni e correnti su circuiti ausiliari (come per la tensione d’uscita) o sfruttando ad esempio la corrente di primario. Tra le varie grandezze sussiste una relazione di proporzionalità diretta dettata essenzialmente dal rapporto spire tra gli avvolgimenti del primario e del secondario. Quindi conoscendo le prime si possono stimare le seconde e viceversa.

La memoria programma dell’Atmega328 non è sufficiente a contenere l’intero firmware di controllo, lo stack TCP/IP completo e la pagina web da caricare e aggiornare dinamicamente (in realtà questa è una convinzione che ho estrapolato dalla lettura di una serie di forum che trattavano la comunicazione Ethernet implementata su Arduino ma non ho ancora avuto modo di confermarla o smentirla…) quindi ho deciso di avvalermi di una shield-board venduta dalla Sparkfun e che monta su di essa il controllore Ethernet 10/100base-T/Server Web Wz5100 con un apposito alloggio per una miniSD card in cui caricare l’intero contenuto HTML della pagina web da visualizzare. Comunica con la scheda Arduino2009 tramite bus SPI e si alimenta con una tensione di 3.3V. Per poter comunicare con Arduino, l’EthernetShield effettua una traslazione di livelli di tensione del tipo 3.3-5V.

Purtroppo per il momento più di questo non posso fornire circa il mio progetto poiché gli impegni di lavoro mi portano ad andare abbastanza a rilento. L’EthernetShield tra l’altro non è da moltissimo che mi è arrivata e devo smanettarci su un po’ prima di arrivare ad un qualche risultato decente. L’ultima precisazione: lo schema a blocchi e quindi il progetto potevano notevolmente ridursi se avessi utilizzato per il controllo in retroazione, per la modulazione PWM e per la comunicazione SPI un DSP opportunamente programmato, con l’unico dettaglio che i miei primi passi verso i microcontrollori li sto compiendo proprio tramite la scheda Arduino oggetto dell’articolo.

In un futuro, magari con l’aiuto di qualcuno più esperto di me nella programmazione dei microcontrollori, potrò pubblicare un circuito completo in cui analogica e digitale coesisteranno. Per il momento sarei più che soddisfatto se il mio alimentatore riesco a farlo funzionare così come l’ho presentato.

Repost: 28 Gen 2011

STAMPA     Tags:,

4 Comments

  1. Emanuele 30 gennaio 2011
  2. Fabrizio87 30 gennaio 2011
  3. DeST 1 febbraio 2011
  4. Maurizio S. 28 gennaio 2011

Leave a Reply