Tanto
per cominciare conviene, per avere un buona rappresentazione digitale
della voce, settare Arduino Uno per la frequenza piu' alta possibile di
campionamento, questo si fa scrivendo nel programma le seguenti righe:
A
queste impostazioni, in teoria, la frequenza di campionamento dovrebbe
essere pari a 76.8 KHz, pero' facendo delle misurazioni ho trovato che
quella reale e' 35.714 KHz corrispondente ad un tempo di
campionamento di 28 uS. Quindi, ogni 28 uS e' pronto un pacchetto di
dati da 8 bit che hanno una velocita' di:
Velocita' dei pacchetti = 8 / (20 * 10^(-6)) = 285714 bps (bit per secondo)
La
velocità della seriale deve essere, per sicurezza, maggiore di quella
dei pacchetti affinche' questi non arrivino i ritardo al ricevitore
causando distorsione del segnale campionato, una velocita'
di 500000 bps e' una buona scelta.
Il programma caricato su Arduino
Uno e' piuttosto semplice; alla pressione del pulsante collegato al pin
3 vengono spediti i byte della conversione uno dopo l'altro ad Arduino Mega,
mentre se viene premuto il pulsante collegato al pin 4 viene spedito un
solo byte che ricevuto da Arduino Mega fara' illuminare un led, ad esso collegato, per un
secondo .
Per poter discriminare il byte di
attivazione del led dagli altri della conversione (che farebbero
illuminare il led in continuazione) ho limitato il valore di
questi ultimi a 254 lasciando riservato il byte di valore 255 per l'accensione del led.
Limitare il valore dei byte della conversione a 254 serve
anche per non far degradare il segnale audio nel caso si superi il
valore 255 (per troppo segnale in ingresso), infatti la conversione superato il valore B11111111 seguita
a fornire valori maggiori che prima azzererebbero gli 8 bit bassi e poi
li incrementerebbero portando il segnale convertito dal massimo valore
a zero e successivamente da zero al valor massimo e cosi via.
Nella
figura seguente
e' visualizzata la forma d'onda del segnale spinto oltre il valore
binario 254,
come si vede, grazie al programma, oltre quel livello non puo' andare
(e sotto neppure dato che il valore non puo' scendere sotto lo zero),
si trova cioe' nella classica situazione di clipping ben conosciuta nel
campo analogico (si noti la simmetria tra la semionda negativa e quella
positiva dovuta al bias di cui abbiamo parlato a proposito del buffer
d'ingresso).
Quando
non viene premuto alcun pulsante il programma spedisce in continuazione
un byte di valore 128, questo serve per far si che in uscita del DAC
(collegato ad Arduino Mega) sia presente una continua di 2.5V anche in
assenza di segnale audio, se non fosse cosi la tensione all'uscita del
DAC sarebbe pari a zero e al momento dell'invio dei dati della
conversione salirebbe velocemente a 2.5V causando quel fastidioso "bum"
in altoparlante.
Il diagramma di flusso del programma di Arduino Uno e' raffigurato nella seguente immagine.
DACSul
convertitore DAC c'e' poco da dire se non della importanza di C1,
questo condensatore serve per arrotondare gli scalini della conversione
e diminuire l'effetto aliasing, C1 con R18 costituisce un filtro
passa basso con frequenza di taglio prossima a 4KHz.
Schema del DAC.
Nelle
figure seguenti sono rappresentate diverse forme d'onda del segnale
analogico convertito (quello in basso e' il segnale analogico in
ingresso).
1) Segnale a 3500 Hz circa senza condensatore C1 (freeze).
2) Segnale a 3500 Hz circa con condensatore C1 (freeze).
3) Segnale a 3500 Hz circa con condensatore C1 (free run).
ARDUINO MEGA
Il
programma di Arduino Mega e' continuamente in ascolto sulla seriale per
un dato in arrivo, se arriva quello con valore 255 illumina il led per
1 secondo, se no invia il dato al DAC.
Nella figura seguente il suo digramma di flusso.
COLLEGAMENTI
File sorgenteFabio