Convertitore A/D scheda microcontrollore Arduino Arduino è una piattaforma hardware low-cost programmabile, con cui è possibile creare circuiti "quasi" di ogni tipo per molte applicazioni, soprattutto in ambito di robotica ed automazione. Si basa su un Microcontrollore della ATMEL, l'ATMega168/328: per esempio l'Arduino Uno monta un ATMega328. Nasce a Ivrea, nel 2005, da un'idea di un professore universitario, un Ingegnere Elettronico, Massimo Banzi, che decise di creare una piattaforma per i propri studenti, così da facilitarli nello studio dei microcontrollori. Fu un completo successo, a tal punto da spingere l'ingegnere a rendere questa piattaforma, Open Source (in realtà è Open Hardware) cioè è possibile trovare sul sito ufficiale www.arduino.cc, i circuiti, i componenti e addirittura le istruzioni per realizzarla da soli. Ciò che dovrebbe interessare in realtà sono gli schemi circuitali: essendo Open, e quindi visionabili da tutti, possono essere continuamente migliorati dalla comunità e grazie ad essi sono state sviluppate un numero incredibile di librerie software che rendono davvero semplice l'interfaccia con periferiche di qualsiasi tipo. Arduino è studiato per artisti, designers, hobbiesti e chiunque sia interessato a creare oggetti interattivi. La scheda Arduino è in grado di interagire con l'ambiente in cui si trova ricevendo informazioni da una grande varietà di sensori. Ma non si parla solo di sensori, Arduino può comandare luci, LED, motori e altri attuatori. Il linguaggio di programmazione è basato su linguaggio C e C++. I progetti basati su arduino possono essere indipendenti oppure essere interfacciati con altri software come Processing, MaxMSP, Flash e altri. Il design (EAGLE) e la schematica (CAD), sono liberi, scaricabili e possono essere modificati a piacimento. Circuito di prova dell’Ingresso Analogico Il circuito è costituito da un potenziometro: una semplice manopola che fornisce una resistenza variabile, che potete leggere nella scheda Arduino come un valore analogico. In questo esempio, si collega un potenziometro ad uno degli ingressi analogici di Arduino per controllare la velocità con cui il LED sul pin 13 , già presente sulla scheda, lampeggia. Hardware richiesto Arduino Potenziometro LED sul pin 13, già presente sullo stampato della scheda Circuito Collegare tre cavi alla scheda Arduino. Il primo va a terra da uno dei perni esterni del potenziometro. Il secondo va da 5 volt all'altro perno esterno del potenziometro. Il terzo va da 0 ingresso analogico al pin centrale del potenziometro. Per questo esempio, è possibile utilizzare sulla scheda Arduino il LED collegato al pin 13. Per utilizzare un ulteriore LED, si può collegare il suo pin più lungo (pin positivo, o anodo), al pin digitale 13, ed è più corto (pin negativo, o catodo) alla massa (GND) Pin accanto al pin 13. Grazie alla bassa quantità di corrente proveniente dal pin digitale 13, non è necessario utilizzare un resistore limitatore di corrente in questo. SCHEMA CONVERTIROE AD Il convertitore A/D ha il compito di: trasformare il segnale analogico presente al suo ingresso in un segnale digitale a n bit. Con un convertitore A/D si effettua quindi la quantizzazione di un segnale analogico, ovvero la trasformazione di un determinato valore analogico dei segnale in un codice binario. Ogni convertitore ha un proprio range per la tensione analogica d'ingresso che deve essere rispettato. Si hanno convertitori per i quali sono ammissibili valori delle tensioni d'ingresso sia positivi che negativi, mentre altri accettano solo segnali positivi. Il valore massimo della tensione d'ingresso, che non deve mai essere superato, è definito anche tensione di fondo scala (VFS). Perché un convertitore funzioni correttamente deve essere applicato ad esso, oltre che il segnale da convertire, anche una tensione continua e costante definita tensione di riferimento (V REF). Il valore massimo della VREF che può essere applicato ad un convertitore dipende dalle caratteristiche costruttive dei dispositivo e coincide generalmente con la tensione di fondo scala (VFS). La relazione che intercorre tra il valore analogico Vi, posto sull'ingresso di un convertitore A/D, ed il corrispondente valore digitale dei dato convertito, è dato dalla relazione: dove N rappresenta il valore digitale (espresso in formato decimale) del dato convertito, n è il numero di bit del convertitore e VREF la tensione di riferimento. Dalla relazione precedente può ricavarsi il valore di Vi se si conosce quello di Vi: Programma con compilatore Arduino All'inizio di questo programma, il sensorPin variabile è impostata su analogico pin 0, dove è collegato il potenziometro, e ledPin è impostato al pin digitale 13. Potrai anche creare un'altra variabile, SensorValue i per memorizzare i valori letti dal sensore. Il comando analogRead () converte la tensione di ingresso, 0 a 5 volt, in un valore digitale tra 0 e 1023. Questo è fatto da un circuito convertitore A/D all'interno Arduino. I controllori ATmega utilizzati per le schede Arduino possono contenere a bordo fino a 6 canali analogico-digitale (A / D). Il convertitore dispone di risoluzione a 10 bit, quindi la quantizzazione è sui numeri interi da 0 a 1023. Mentre la funzione principale dei piedini analogici per la maggior parte degli utilizzatori di Arduino è leggere sensori analogici, i piedini analogici hanno anche tutte le funzionalità dei piedini di input output, infatti, gli stessi piedini di input analogico possono essere usati per input/output digitale indirizzati come piedini n° 14-19. Ruotando l'albero del potenziometro, si modifica la quantità di resistenza su entrambi i lati del perno centrale (o spazzola) del potenziometro. Questo cambia le resistenze relativi tra il piedino centrale e i due piedini esterni, dando una tensione diversa all'ingresso analogico. Quando l'albero viene girato completamente in una direzione, non c'è resistenza tra il perno centrale e il perno collegato a terra. La tensione al pin centrale è quindi 0 volt, e analogRead () restituisce 0. Quando l'albero viene girato completamente in direzione opposta, non c'è resistenza tra il perno centrale e il perno collegato a 5 volt. La tensione al pin centrale è di 5 volt, e analogRead () restituisce 1023. Nel mezzo, analogRead () restituisce un numero compreso tra 0 e 1023 che è proporzionale alla quantità di tensione applicata al perno. Tale valore, memorizzata in SensorValue, consente di impostare un ritardo () per il ciclo di lampeggio. Maggiore è il valore, più lungo è il ciclo, minore è il valore, più breve è il ciclo. /* Analog Input Viene illustrato l'ingresso analogico per la lettura di un sensore analogico sul 0 pin analogico e si procede ad accendere e spegnere un diodo emettitore di luce (LED) collegato al pin digitale 13. La quantità di tempo che il LED si accende dipende di dal valore ottenuto analogRead (). Il circuito: * Il potenziometro collegato all' ingresso analogico 0 * tramite il Pin centrale del potenziometro * Un piedino laterale (uno dei due) a terra * l'altro collegato a +5 V Anodo * LED (piedino lung0) collegato all'uscita digitale 13 * Catodo LED (piedino corto) collegato a terra * Nota: poichè la maggior parte degli Arduino ha un LED già collegato al pin 13 della scheda, il LED è opzionale. */ int sensorPin = A0; // Seleziono il pin di Arduino dove è collegato il centrale del potenziometro int ledPin = 13; // seleziono il pin dove è collegato il LED int sensorValue = 0; // variabile dove memorizzo il valore letto dal conv. A/D void setup() { // dichiariamo che il piedino 13 è un output digitale pinMode(ledPin, OUTPUT); Serial.begin(9600);//Inizializzo la seriale } void loop() { // leggiamo il valore del nostro sensore sensorValue = analogRead(sensorPin); Serial.print(sensorValue,DEC);//Invio il valore letto dal convAD alla seriale in decimale Serial.print(" "); Serial.print(sensorValue,BIN);//Invio il valore letto dal convAD alla seriale in binario Serial.println(" "); // accendiamo il LED digitalWrite(ledPin, HIGH); // aspettiamo per un tempo pari a <sensorValue> milliseconds: delay(sensorValue); // spegniamo il LED digitalWrite(ledPin, LOW); // aspettiamo per un tempo pari a <sensorValue> milliseconds: delay(sensorValue); }