convertitore Digitale-Analogico per suono

oggi a scuola abbiamo fatto un convertitore Digitale-Analogico non avendo trovato materiale nel web l'ho ridisegnato a computer spero che si capisce è la prima volta che uso un nuovo programma per il disegno ci ho messo un po di tempo a farlo ed è venuto anche un po male :)

NON SONO RIUSCITO AD AGGIUNGERE che R4,5,6,7,8 è il DOPPIO di R1,2,3 è indifferente poi quanto vale R

spero che lo conoscete già la mia idea è quella di salvare a 4 bit di 3 sec (per prova) di una canzone in arduino e continuare a ripeterla sapete come aiutarmi? i miei dubbi sono quale è l'istruzione per salvare bit puri?? come leggere poi i bit per eseguire il ciclo? come eseguire poi il suono?? sono sicuro di non avere bene le idee chiare ma non importa voglio almeno provarci :)

Se non ricordo male è un R2R :grin:

si esatto con quello vorrei fare un piccolo progetto con arduino in modo di unire quello che imparo a scuola alle mie solite ide strane :)

dimenticavo come devo estrarre da una canzone le note che dovrà riprodurre arduino??

Quel convertitore D/A ha 1 problema: Ti servono dei scambiatori e non semplici contatti che si chiudono. Contatti che si chudono verso massa puoi realizzare con semplici transistori. Per fare uno scambiatore Ti servono 3 transistori. Per i dati da mettere sul convertitore D/A serve convertire il brano in segnali digitli con un convertitore A/D. Ciao Uwe

ok grazie comunque non è il circuito finale anche perché così non potrei nemmeno attaccarlo ad arduino a meno che le leve dei interruttori non li muovo con un motore ma a non sono ancora arrivato a quei livelli di mente malata :) sono ancora un po sano

ilmandorlone: ok grazie comunque non è il circuito finale anche perché così non potrei nemmeno attaccarlo ad arduino a meno che le leve dei interruttori non li muovo con un motore ma a non sono ancora arrivato a quei livelli di mente malata :) sono ancora un po sano

Il ladder R/2R è il più semplice DAC posssibile, lo puoi pilotare direttamente da un micro, Arduino incluso, basta che colleghi dei GPIO al posto degli interruttori, però al massimo ottieni una tensione pari a quella del uno logico, quasi 5V nel caso di Arduino, ed esclusivamente positiva. Però il segnale ottenuto dal DAC non puoi usarlo direttamente perché ha una elevata impedenza d'uscita dipesa della resistenze utilizzate e basta che lo carichi anche con una impedenza d'ingresso elevata, p.e. 100 kohm, per alterarlo, devi farlo passare attraverso un opamp in configurazione voltage follower, se ti bastano i 5V, oppure come amplificatore non invertente se ti serve una tensione maggiore, e a questo punto puoi farci quello che vuoi con la tua tensione analogica. Eventualmente tramite l'opamp puoi anche spostare il riferimento del segnale verso il basso ottenendo una tensione alternata a tutti gli effetti.

grazie comunque il mio dubbio non era quello non riesco a capire come scopiazzare i bit della canzone e metterli nella poca memoria di arduino e riprodurli con il R2R il mio prof lo ha fatto con un normale Eprom io vorrei riuscirci con arduino :)

con una sola EPROM sei sicuro ? non c'era nemmeno un micro di mezzo a leggerla ? :relaxed:

ratto93:
con una sola EPROM sei sicuro ? non c’era nemmeno un micro di mezzo a leggerla ? :relaxed:

Possibilissimo se usi una EEPROM con bus parallelo con tutti i bit, sia data che address, disponibili su i vari pin, basta un banale counter con relativo clock per scansionare una per una le varie celle di memoria, applicando i bit di uscita ad un ladder a 8 bit ottieni il tuo segnale analogico che segue fedelmente il contenuto della EEPROM.
Poi quanto sia la qualità del suono dipende da come è stato campionato il brano originale e con che velocità di sampling viene riprodotto, comunque nei 32k di flash di un atmega 328 ci metti pochi secondi di suono anche se campionato a pochi kHz visto che è obbligatorio il formato raw.

Se può essere d'aiuto per approfondire il concetto D/A con Arduino: http://www.gioblu.com/tutorials/audio/314-arduino-player-solo-software ;)

astrobeed:

ratto93: con una sola EPROM sei sicuro ? non c'era nemmeno un micro di mezzo a leggerla ? :relaxed:

Possibilissimo se usi una EEPROM con bus parallelo con tutti i bit, sia data che address, disponibili su i vari pin, basta un banale counter con relativo clock per scansionare una per una le varie celle di memoria, applicando i bit di uscita ad un ladder a 8 bit ottieni il tuo segnale analogico che segue fedelmente il contenuto della EEPROM. Poi quanto sia la qualità del suono dipende da come è stato campionato il brano originale e con che velocità di sampling viene riprodotto, comunque nei 32k di flash di un atmega 328 ci metti pochi secondi di suono anche se campionato a pochi kHz visto che è obbligatorio il formato raw.

Le ho viste ma non le ho mai usate, ora mi è più chiaro, grazie. La canzoncina di super Mario ci può stare :) http://www.youtube.com/watch?v=JE2vPwmoSlg :grin: :grin: :grin: :grin: :grin: :grin: :grin: :grin: :grin: :grin:

ratto93:
La canzoncina di super Mario ci può stare :slight_smile:

Attenzione, un conto è riprodurre dei suoni tramite PWM/PCM, e un conto è usare una serie di campioni per riprodurre il suono, col primo sistema, quello del video, devi solo memorizzare le singole note e la loro durata, ovvero in 1k ci metti anche diversi minuti di musichetta, col secondo sistema devi avere in memoria l’equivalente di un file wav che, come ben sai, sono enormi.
Un conto semplicissimo, anche ipotizzando che la riproduzione avviene a 8 bit e solo 5ksps, suono di qualità pessima, pure peggio di quello del video, abbiamo che servono 5 kByte di memoria per ogni secondo di riproduzione, quindi in 32k al massimo ci metti 6 secondi di audio se sei capace di far stare tutto il software in meno di 2k.

Astro, l'avevo immaginato era solo un esempietto ;)

ecco esatto intendo usare la prima che mi suona più semplice. come prendo la nota, la sua durata e la frequenza di campionamento, e come la salvo su arduino? in base alle note come faccio a sapere quale interruttore aprire ?? (parlo di interruttori anche se si sa che ci devo mettere i transistor) se io faccio un esempio a 4bit e uno a 8 bit quando io ho una nota esempio "la" gli interruttori aperti saranno diversi da 4 a 8

inizio ad avere le idee più chiare comunque :)

inizio ad avere le idee più chiare comunque smiley

Io credo di no, almeno non a sufficienza.

Gli interruttori nello schema B1-B4 non fanno altro che fornire Vmax o Vmin, che nel caso in figura sono rispettivamente +15V e 0V.

Come ti ha suggerito Astrobeed, se al posto degli interruttori/deviatori usi i pin di arduino ottieni lo stesso risultato. Quindi 4 pin per convertire un numero digitale in una grandezza analogica. Nota che con quattro bit ha solo 16 livelli di tensione differenti, cioè solo da 0 a 15 puoi contare. Quattro bit sono davvero pochi e fai fatica anche a ricreare una sinusoide. Io fossi in te partirei con due tensioni continue A=5 e B=3, A+B=8, A-B=2 il risultato delle operazioni le applichi ad una porta di arduino.

Il problema con le sinusoidi è che ti serviranno delle funzioni che sommano, sottraggono campioni di frequenza diversa, quindi stiamo parlando di tipi non conosciuti dal C/C++. Credo ti serva una classe per rappresentare una grandezza numerica che varia nel tempo e poi ti servono delle funzioni che operano somma e addizione.

Davvero questa è roba tosta, almeno per me che con la matematica faccio a botte da sempre e vince sempre lei.

Dopo l'esperimento con tensioni continue, mappi dei valori di una sinusoide approssimata in un array è applichi un valore di un elemento alla porta di arduino, il tempo tra una scrittura è l'altra determina la frequenza.

Se vuoi scrivere solo i primi 4 bit di una porta devi usare le maschere, più o meno così: Supponiamo che PORTB vale 160 (valore che conivolge solo i bit alti del byte) e tu vuoi impostare i 4 bit bassi a 6 dovrai scrivere così PORTB = (PORTB & 240) | 6

240 è la maschera per aggire solo sui 4 bit bassi, mentre se vuoi agire su quelli alti la maschera è 15, ovviamente dovrai fornire valori da 0 a 15 nel primo caso e da 16 a 255 nel secondo caso.

oppure se vuoi i 4 bit alti del byte fai lo shift di 4 a sinistra, però prima salva il valore da shiftare in una variabile temporanea e poi shit di 4 e poi assegni con PORTB = (PORTB & 240) | tmp_var.

Ciao.

ok capito= troppo complicato :~ :~ :~ :~ :~ :~ meglio lascar stare

ilmandorlone: ecco esatto intendo usare la prima che mi suona più semplice. come prendo la nota, la sua durata e la frequenza di campionamento, e come la salvo su arduino?

Non hai capito un piffero di tutto quello che ti abbiamo detto :grin: Come ottenere i campioni ? Semplicissimo, usi uno dei tanti programmi per pc che registrano l'audio in digitale, imposti i bit di risoluzione, il sample rate e un formato raw (senza nessun compressione), magari con uscita in file testo csv così è pure facile riportarlo nello sketch di Arduino sotto forma di array.

ilmandorlone: ok capito= troppo complicato :~ :~ :~ :~ :~ :~ meglio lascar stare

Ecco questa è la prima cosa sensata che hai detto in questo topic :D :grin: :D

Ecco questa è la prima cosa sensata che hai detto in questo topic

grazie :(

ok il mio file audio di 4 sec l'ho messo in wav a 16 bit meno non sono riuscito ora dove vedo i bit apro il file con il txt? non so proprio dove sbattere la testa