INVIO AUDIO E COMANDO TRAMITE  SERIALE CON ARDUINO



INTRODUZIONE
Con questo progetto si puo' inviare, tramite seriale da un Arduino Uno ad un Arduino Mega, sia un byte singolo (di comando) che un segnale audio digitalizzato mediante due  tasti individuali. La natura del sistema che propongo e' del tutto didattica e serve solo a dimostrare come sia possibile, su un unica linea, mandare un dato che potrebbe, ad esempio, essere usato per attivare o disattivare una funzione sull'Arduino ricevitore e un audio da ascoltare in altoparlante. Ciò non toglie che questo sistema, se opportunamente arricchito, potrebbe essere usato come interfonico digitale aggiungendo una linea RX-TX (oppure utilizzarne solo una con lo standard RS485), dei microfoni ed degli altoparlanti, usando un tasto come "parla ascolta" e l'altro per far suonare un cicalino sull'interfonico remoto per la chiamata e modificando un po' i programmi creandone uno identico per le due postazioni. Nel caso vi cimenterete in tale lavoro vi converra'  sostituire l'Arduino Uno con un Arduino Mega perche' quest'ultimo dispone di porte a 8 bit mentre il primo  non le ha, esse sono  necessarie per inviare un byte al convertitore DAC con una sola istruzione senza usare due porte di tipo diverso e relativi  spostamenti dei singoli  bit.
Nella figura seguente e'  rappresentato lo schema a blocchi del sistema.

BUFFER D'INGRESSO


Gli scopi del buffer d'ingresso sono 3:

1) Presentare all'ingresso analogico A0 una resistenza ed una capacita' basse.
2) Fornire, assieme al segnale, un bias opportuno.
3) Limitare la banda per attenuare l'aliasing in uscita del DAC.

1) Il primo scopo viene raggiunto dalla natura stessa dell'operazionale, gli operazionali  presentano, mediamente, in uscita resistenze dell'ordine dell'ohm e capacita' dell'ordine del pF.
2) Il bias deve avere un valore opportuno per poter far lavorare l'ADC in maniera simmetrica per le due semionde del segnale audio. Anche se Arduino usa 10 bit per convertire un segnale analogico in uno digitale, in     questo progetto ne uso solo 8 per rendere il tutto piu' facilmente e velocemente gestibile. Si vedra' dopo che il DAC funziona  anche lui con 8 bit e che il fondo scala raggiungibile da esso e' 5V con un valore di        byte     pari a 255 e 0V con un valore di byte pari a 0V. Questo ci fa intendere che il punto di riposo, in assenza di segnale, deve stare a meta' tra questi due valori, ovvero  deve essere  a 2.5V. Questo e' il valore     di bias che     deve fornire il buffer d'ingresso. Per portare l'uscita dell'operazionale del DAC a quel valore  in modo preciso ho usato un potenziometro che dovrete regolare nella fase preliminare del collaudo usando un             tester.
3) La banda deve essere limitata a frequenze leggermente superiori a quella piu' alta della voce che e' pari a 3400Hz, per non attenuare troppo le armoniche contenute nella voce  e al contempo attenuare l'aliasing, ho     deciso di scegliere una frequenza di taglio di 10KHz, un buon  compromesso.
Nella figura seguente lo schema elettrico del buffer d'ingresso.

Il condensatore C1 deve essere del tipo non polarizzato, se avete difficolta' a reperirlo potete sostituirlo con due condensatori da 22uF collegati in serie  in controfase.

ARDUINO UNO
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.

DAC



Sul 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 sorgente
Fabio