Dac a due canali per Arduino uno
Convertitore Digitale Analogico a 12 bit, a due canali, per Arduino
Com'è noto, Arduino è un completo microcontroller su scheda singola estremamente versatile. Dispone infatti di numerosi pin di input-output digitali e analogici, di porte seriali ecc.
Quello che però manca, almeno nelle versioni base, ad esempio l'arduino UNO, è un DAC, cioè un'uscita analogica.
A cosa potrebbe servire? Ad esempio a fornire delle precise tensioni per il pilotaggio di dispositivi esterni.
Per lo sviluppo di un progetto particolare mi serviva assolutamente di disporre di almeno una coppia di segnali analogici controllati dal microprocessore. Allora mi sono messo all'opera ed ho progettato uno "shield" per tale scopo.
Dopo aver analizzato alcuni dei chip disponibili sul mercato ho scelto il MCP4725, reperibile sulla "baia" per circa 3 euro. Datasheet: http://www.adafruit.com/datasheets/mcp4725.pdf
Si tratta di un convertitore Digitale-Analogico a 12 bit, dunque può fornire 4096 livelli di tensione da 0 a 5 volt, sufficienti per il mio uso. E' interfacciabile via I2C, è dotato di una EEPROM che memorizza la configurazione, ha un tempo di risposta di 100,400 o 3400 kbps, lavora con alimentazioni da 2,7 a 5,5V, è impostabile tramite ponticello hardware su due diversi indirizzi. In sostanza con due chip c'e' la possibilità di gestire due canali contemporaneamente.
A proposito di questo: devo avvisare che gli indirizzi di default possono essere diversi per i vari produttori. I miei ad esempio erano configurati 0x60 con il pin 6 a massa e 0x61 con lo stesso pin a +5V. In altri modelli ho riscontrato che i rispettivi indirizzi erano 0x62 e 0x63, dunque si devono provare le varie combinazioni.
L'unico problema è che il pakage SOT23-6 ha le dimensioni di una formica.
Si tratta di un componente SMD, perciò non zoccolabile, richiede dunque la costruzione di un'apposito stampato.
Il circuito è piuttosto semplice, richiede solo due resistori di PULL-UP da 4,7K e la cablatura delle linee SDA e SCL per la connessione al micro.
Si può trovare anche una schedina già pronta, commercializzata da Adafruit, ma ho preferito arrangiarmi da solo anche perchè è progettata per un singolo canale: http://www.adafruit.com/products/935
Lo schema, ricavabile dai datasheet è il seguente:
Questa è invece la piedinatura:
Il mio schema è sostanzialmente lo stesso, solo che è duplicato per ognuno dei due DAC e prevede la connessione del pin 6 a massa per il primo e ai +5V per il secondo. Le linee in entrata sono connesse in parallelo.
La stessa Adafruit fornisce uno sketch demo per questo DAC ma dopo averlo provato non mi ha convinto del tutto.
A me serviva qualcosa di più snello e versatile, dunque mi sono messo a saccheggiare tutto lo scibile su questo componente. E' così nato il seguente programma, che gestisce contemporaneamente due canali in uscita:
// Digital analog converter con chip MCP4725 by Spectrum Engineering - Eugenio Cosolo
// www.missilistica.it
// Programma di test per il chip MCP472 Genera due segnali di valore crescente/decrescente
#include <Wire.h>
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac1; Adafruit_MCP4725 dac2;
void setup(void) {
dac1.begin(0x60); // indirizzo dac 1
dac2.begin(0x61); // indirizzo dac 2
}
void loop(void) {
dac1.setVoltage(0, false); dac2.setVoltage(4000, false); delay(100);
dac1.setVoltage(200, false); dac2.setVoltage(3800, false); delay(100);
dac1.setVoltage(400, false); dac2.setVoltage(3600, false); delay(100);
dac1.setVoltage(600, false); dac2.setVoltage(3400, false); delay(100);
dac1.setVoltage(800, false); dac2.setVoltage(3200, false); delay(100);
dac1.setVoltage(1000, false); dac2.setVoltage(3000, false); delay(100);
dac1.setVoltage(1200, false); dac2.setVoltage(2800, false); delay(100);
dac1.setVoltage(1400, false); dac2.setVoltage(2600, false); delay(100);
dac1.setVoltage(1600, false); dac2.setVoltage(2400, false); delay(100);
dac1.setVoltage(1800, false); dac2.setVoltage(2200, false); delay(100);
dac1.setVoltage(2000, false); dac2.setVoltage(2000, false); delay(100);
dac1.setVoltage(2200, false); dac2.setVoltage(1800, false); delay(100);
dac1.setVoltage(2400, false); dac2.setVoltage(1600, false); delay(100);
dac1.setVoltage(2600, false); dac2.setVoltage(1400, false); delay(100);
dac1.setVoltage(2800, false); dac2.setVoltage(1200, false); delay(100);
dac1.setVoltage(3000, false); dac2.setVoltage(1000, false); delay(100);
dac1.setVoltage(3200, false); dac2.setVoltage(800, false); delay(100);
dac1.setVoltage(3400, false); dac2.setVoltage(600, false); delay(100);
dac1.setVoltage(3600, false); dac2.setVoltage(400, false); delay(100);
dac1.setVoltage(3800, false); dac2.setVoltage(200, false); delay(100);
dac1.setVoltage(4000, false); dac2.setVoltage(0, false); delay(100);
dac1.setVoltage(4095, false); dac2.setVoltage(0, false); delay(100);
}
Scarica il codice e le librerie qui: UserFiles/laserist/File/testDAC1.zip
A cosa può servire:
- generatore di forme d'onda regolabili con precisione e frequenza.
- pilotaggio di VCA, VCO, VCF per sintetizzatori.
- generazione di tensioni di controllo per automazioni
- riferimenti di tensione campione variabili nel tempo
- generatori di inviluppo con forme d'onda particolari
- pilotaggio dei galvanometri per i laser show con possibilità di fare scritte e disegni personalizzati.
- Interfaccia per il controllo di un'ARPA LASER FRAMELESS (progetto in fase di sviluppo prossimamente su questo schermo)
Il circuito stampato:
Per questioni di tempo e semplicità ho optato per un singola faccia, anche se necessitano alcuni ponticelli.
Avendo tempo, per questioni d'estetica sarebbe stato meglio un doppia faccia ma il risultato è lo stesso.
File in formato Eagle: UserFiles/laserist/File/DAC.zip
La schedina va agganciata direttamente alla scheda Arduino UNO, senza necessità di filature ausiliarie.
La saldatura dei microscopici chip può creare qualche difficoltà per i non troppo esperti. Consiglio di usare un saldatore a punta sottile, una lente di ingrandimento, un buon flussante e pochissimo stagno.
Mi raccomando, prima di saldare, di identificare con sicurezza il pin 1, contrassegnato da un praticamente invisibile puntino sul case.
Il connettore a tre poli è l'uscita dei due canali. La filatura rosso-nero-giallo serve per alimentare un accessorio esterno, che non fa parte del progetto.