Innehållsförteckning:

Spela ljudfiler (Wav) med en Arduino och en DAC: 9 steg
Spela ljudfiler (Wav) med en Arduino och en DAC: 9 steg

Video: Spela ljudfiler (Wav) med en Arduino och en DAC: 9 steg

Video: Spela ljudfiler (Wav) med en Arduino och en DAC: 9 steg
Video: Инструкция: Как записать интервью с диктофонами Olympus LS-P1 / LS-P4 2024, November
Anonim
Spela ljudfiler (Wav) med en Arduino och en DAC
Spela ljudfiler (Wav) med en Arduino och en DAC
Spela ljudfiler (Wav) med en Arduino och en DAC
Spela ljudfiler (Wav) med en Arduino och en DAC
Spela ljudfiler (Wav) med en Arduino och en DAC
Spela ljudfiler (Wav) med en Arduino och en DAC

Spela wav -fil Ljud från ditt Audino SD -kort. Denna instruktionsbok visar dig hur en wav -fil på ditt SdCard kan spelas upp via en enkel krets till en högtalare.

WAV -filen måste vara 8 bitars mono. Jag har inte haft några problem med att spela 44 KHz -filer.

Även om det inte är hi-fidelity är ljudkvaliteten mycket tillfredsställande.

Den seriella bildskärmen används för att välja filen. Filerna måste finnas i en mapp som heter adlog.

Detta instruerbara följer av ett tidigare projekt där jag sparade wav-inspelningar på SdCard:

Kretsen använder en billig 8 -bitars digital till analog omvandlare (DAC) och en enda chip -ljudförstärkare.

Viktiga avsnitt för att ställa in avbrott togs från den utmärkta artikeln av Amanda Ghassaei:

Steg 1: Krav

Krav
Krav
Krav
Krav

Arduino- Jag använder Mega, men det finns ingen anledning till att Uno inte fungerar.

SdCard-läsare-programmet är konfigurerat för: MicroSD Breakout Board Regulated with Logic Conversion V2

Se den här instruktionsboken för SdCard-installationsinformation:

DAC0832 LCN- en utmärkt 8-bitars digital till analog omvandlare- Några pund.

LM386 N-1 Op amp- billig som chips

20 -vägs chiputtag

8 -vägs chiputtag

9 volts strömförsörjning- ett batteri räcker.

LM336 2,5 V spänningsreferens

10uF kondensator * 3 (spänning över 9V)

10 ohm motstånd

50nF kondensator- (Eller någonstans nära-47nF, 56nf, 68nf- kommer att göra)

220uF kondensator

64 ohm högtalare

10K linjär potentiometer

Kabel för att länka de 8 datalinjerna mellan Arduino och kretsen

På Uno är de 8 anslutningarna i linje, på Mega är de i par.

På Mega använde jag 10 -vägs bandkabel med en 10 -vägs IDC -rubrik. (2 ledningar är lediga)

Uttag för 0V, 9V och DAC ut

Kopparremsa, löd, tråd, skärare etc.

Steg 2: Specifikationerna

Specifikationerna
Specifikationerna

Seriellt inställt på 115200 baud.

Support finns för Hobbytronics MicroSD Breakout Board med en Mega. Chip select och andra portar ändras mellan Mega och Uno.

Wav-filerna måste finnas i en katalog som heter adlog- Ge det gärna något annat och ordna om nödvändig kodning.

WAV -filen måste vara 8 bitars mono. Jag har testat upp till 44KHz.

Seriell bildskärm visar wav -filer i adlog -mappen. Filnamn skickas från bildskärmens utgående linje.

Filstorleken begränsas endast av SdCard -storleken.

Steg 3: Komma igång

Komma igång
Komma igång

Anslut SD -kortläsaren. Det här är anslutningarna för Mega.

0, 5V

CLK till stift 52

D0 till stift 50

D1 till stift 51

CS till stift 53

(Se leverantörens webbplats för Uno -portanslutning)

Du kommer att vilja testa att ditt kort fungerar i detta skede- använd skript som leverantören tillhandahåller.

Vi måste göra en liten krets

Vi kommer att skicka en ström av ljudbyte från Arduino.

Dessa siffror ligger mellan 0 och 255. De representerar spänningen.

Tystnad är 127-128.

255 är högtalarkon på ett sätt.

0 är högtalarkon hårt på andra sättet.

Så ljud spelas in som sparade nummer, vilket skapar varierande spänningar, vilket skapar rörliga högtalarkoner.

Vi kan skicka numren från 8 rader på Arduino samtidigt, med hjälp av en "port".

Om vi matar de 8 linjerna till en digital till analog omvandlare, gör den vad den säger på tennet och producerar en analog spänning som är proportionell mot det digitala talet.

Allt vi behöver göra är att packa av spänningen till en liten operationsförstärkare och sedan till en högtalare.

Steg 4: Den lilla kretsen

Den lilla kretsen
Den lilla kretsen
Den lilla kretsen
Den lilla kretsen
Den lilla kretsen
Den lilla kretsen
Den lilla kretsen
Den lilla kretsen

DAC0832 LCN

Detta är en superb, billig 8 -bitars digital till analog omvandlare. (DAC)

Det kan kontrolleras fullt ut med en rad datahållare, dataprovlinjer.

Eller så kan det ställas in för att göra allt automatiskt i "Flow through operation".

För att citera manualen:

Genom att helt enkelt jorda CS, WR1, WR2 och XFER och knyta ILE hög kan båda interna registren följa de tillämpade digitala ingångarna (genomströmning) och direkt påverka den analoga DAC-utgången.

OK, det vill säga fyra anslutningar till chipset lågt och ett set till 9V - enkelt.

Vi vill inte ha några negativa spänningar så handboken säger att vi ska använda "spänningsläge" och de tillhandahåller diagrammet.

Allt vi behöver göra är att byta ut en liten ljudförstärkare istället för den som de föreslår.

LM386-N ljudförstärkare

Amp-handboken ger ett minimidelsdiagram- ger en förstärkning på 20 (alldeles för mycket för oss- men den har en volymkontroll).

Allt vi behöver göra är att lägga till en kondensator mellan DAC och förstärkaren så att vi bara förstärker växelsignaler.

Vi måste också lägga till ett par kondensatorer nära matningsstiftet för var och en av våra chips annars får vi nyn från vår 9V -strömförsörjning.

Steg 5: Ta ut lödkolven

Ta ut lödkolven
Ta ut lödkolven
Ta ut lödkolven
Ta ut lödkolven
Ta ut lödkolven
Ta ut lödkolven

Eftersom kretsen är enkel tänker jag inte ge ett slag för slag -konto.

Här är några tips:

  • Förbered en bit kopparbandskiva minst 28 gånger 28 hål. (Ja jag vet att hjärnkirurger kan göra det mindre)
  • Om du tänker montera den med skruvar, tillåt dem i början!
  • Montera chipsen på uttag. Sätt i chipsen först när allt har kontrollerats.
  • Håll ingångskablarna borta från utgången.
  • Observera korrekt polaritet för kondensatorerna.
  • Se diagrammet för basvy av LM336 -spänningsreferensen. Justeringsbenet används inte och kan skäras.
  • Observera den direkta anslutningen till stift 8 på DAC- Det är mycket användbart för testning.
  • Jag anslöt till Audino med bandkabel och en 10 -vägs IDC -anslutning.
  • På Uno är anslutningarna i en rak linje - du kan upptäcka att genom att ordna de 8 ingångsanslutningarna i en enda rak linje kan du länka till Arduino med en köpt, färdig 8 -vägs anslutning,

När det är klart- kontrollera lödningen och kontrollera luckorna mellan kopparspåren.

Jag tycker att ett 36 tpi junior hack sågblad är mycket användbart för att rensa skräp. Jag tar bort bladets lokaliseringsnålar och skjuter bladets spets in i spåret. Tydligen är bladet inte i en ram.

Steg 6: Testa DAC

Testar DAC
Testar DAC

Lämna anslutningen mellan kretsen och Arduino avstängd.

Ställ volymkontrollen på din krets till halvvägs.

Slå på 9V likström till din nya krets.

Kontrollera att kretsen är ok- jag kan inte ta något ansvar för din krets!

Stäng av

Anslut din krets till Arduino.

På Mega använder stiften 22-29. (PORTA) Missa inte de två 5V -stiften ovan!

På Uno använder stiften 0-7. Detta är PORTD

Anslut strömförsörjningens 0V till 0V på Arduino.

Slå på.

Öppna detta testprogram DAC_TEST

För UNO, ersätt alla referenser till PORTA till PORTD

Ersätt DDRA med DDRD- denna instruktion sätter alla 8 raderna att mata ut på en gång. Detta är datariktningsregistret.

Ställ in din seriella bildskärm på 115200.

Anslut en voltmeter mellan DAC ut och OV

Programmet kommer att ställa in utgången till 255- alla linjer på - maximal spänning.

Utgång 128- halv maximal spänning.

Utgång 0- noll spänning (Eller förmodligen nästan noll).

Det kommer då att gå bitvis: 1, 2, 4, 8, 16, 32, 64, 128

Spänningen ska öka stadigt.

Om spänningen sjunker tillbaka medan antalet ökar har du förmodligen två av de sammankopplade trådarna omvända.

Du bör också höra högtalaren tyst klicka när spänningen ändras

Steg 7: Läs Wav -rubriken

Läser Wav -rubriken
Läser Wav -rubriken

WAV -filer sparas med en viss frekvens och datastorlek.

Denna information finns i en 44 byte -rubrik i början av en wav -fil.

Även om viss programvara förlänger rubriken (efter byte 35), vilket gör platsen för datastorleken svårare att hitta.

För att läsa rubriken skapar vi en buffert och kopierar starten av filen.

Frekvensen lagras i 4 byte med början av 24 byte i filen.

// läsfrekvens specificerad i wav -filhuvud

byte headbuf [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = headbuf [27];

retval = (retval << 8) | headbuf [26];

retval = (retval << 8) | headbuf [25];

retval = (retval << 8) | headbuf [24];

Serial.print (F ("Filfrekvens"));

Serial.print (retval);

Det bästa sättet att hitta datastorleksinformation är att söka efter ordet "data" i rubriken.

Extrahera sedan de 4 byte som följer det, som utgör det långa värdet

osignerad lång retval;

int mypos = 40;

för (int i = 36; i <60; i ++) {

if (headbuf == 'd') {

if (headbuf [i+1] == 'a') {

if (headbuf [i+2] == 't') {

if (headbuf [i+3] == 'a') {

// äntligen har vi det

mypos = i+4;

i = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = headbuf [mypos+3];

retval = (retval << 8) | headbuf [mypos+2];

retval = (retval << 8) | headbuf [mypos+1];

retval = (retval << 8) | headbuf [mypos];

OK, vi har datalängd och frekvens!

Ljuddata följer de 4 byte som utgör datalängdvärdet.

Steg 8: Avbryt, avbryt…

Avbryt, avbrott…
Avbryt, avbrott…

Vi använder frekvensinformationen för att skapa ett programavbrott vid eller nära önskad frekvens.

Avbrottet kan inte alltid ställas in exakt, men det är tillräckligt. Frekvensen som läses från filen överförs till den inställda avbrottsrutinen.

void setintrupt (float freq) {float bitval = 8; // 8 för 8 bitars timers 0 och 2, 1024 för timer 1 byte

setocroa = (16000000/(freq*bitval)) - 0,5;

// Setocroa -värdet kräver en subtraktion av -1. Dock lägger vi till 0,5 rundor till närmaste 0,5

// Upplösningen på timern är begränsad

// Slutligen bestämd av bitvalens storlek

cli (); // inaktivera avbrott // ställ in timer2 -avbrott

TCCR2A = 0; // ställ hela TCCR2A -registret till 0

TCCR2B = 0; // samma för TCCR2B

TCNT2 = 0; // initiera räknevärdet till 0

// ställ in jämför matchningsregister för frekvens (hz) steg

OCR2A = setocroa; // = (16*10^6) / (frekvens*8) - 1 (måste vara <256)

// slå på CTC -läge

TCCR2A | = (1 << WGM21); // Ställ in CS21 -bit för 8 förkalkningsmedel

TCCR2B | = (1 << CS21); // aktivera timer jämför avbrott

// TIMSK2 | = (1 << OCIE2A); // detta fungerar, liksom följande rad

sbi (TIMSK2, OCIE2A); // aktivera avbrott på timer 2

sei (); // aktivera avbrott

Vissa läsare kommer att ha upptäckt sbi (TIMSK2, OCIE2A)

Jag ställer in ett par (internetförvärvade) funktioner för inställning och rensning av registerbitar:

// Definierar för att rensa registerbitar#ifndef cbi

#define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))

#endif

// Definierar för inställning av registerbitar

#ifndef sbi

#define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))

#endif

Dessa funktioner ger ett enkelt samtal för att ställa in eller radera avbrottet.

Så avbrottet körs, vad kan vi få det att göra?

Steg 9: Avbrott och dubbel buffring

Avbrott och dubbel buffring
Avbrott och dubbel buffring
Avbrott och dubbel buffring
Avbrott och dubbel buffring

Vid 22 Khz matas en byte ljuddata ut var 0,045 ms

512 byte (buffertstorleken) läses på 2,08 ms.

Så bufferten kan inte läsas från SDCard i en skrivcykel.

Men 512 byte skrivs till porten på 23,22 ms.

Så allt vi behöver göra är att installera en ny fil som läses varje gång bufferten töms och vi har tillräckligt med tid att hämta data innan ett nytt datablock krävs … Förutsatt att vi använder två buffertar, tömmer en när vi fyller en annan.

Detta är dubbel buffring.

Filläsningen kommer att saktas ner av det upprepade avbrottet, men det kommer att bli klart.

Jag har installerat två 512 byte buffertar som kallas bufa och bufb.

Om flaggan redan är sann läser vi från porta annars läser vi från portb

När buffertpositionen (bufcount) når buffertstorleken (BUF_SIZE 512) sätter vi en flagga som heter readit till true.

Tomrumsslingan letar efter denna flagga och startar ett block som läser:

if (readit) {if (! aready) {

// initiera SDCard -block läst till bufa

tempfile.read (bufa, BUF_SIZE);

} annat {

// initiera SDCard -block läst till bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = false;

}

När den är klar rutin flaggor readit = false.

Inom avbrottsrutinen måste vi kontrollera att tomrumsslingan har slutat genom att kontrollera om readit == false.

I detta fall signalerar vi att en annan läsning krävs och växlar den färdiga flaggan för att byta buffert.

Om SD-kortet fortfarande läser måste vi spåra en avläsning (räknare--; bufcount--;) och avsluta avbrottet för att försöka igen senare. (Klick i ljudsignalen innebär att detta har inträffat.)

När all data läses avbryts avbrottet, porten återställs till mittspänningsvärdet 128 och ljudfilen stängs.

Innan du kör dac2.ino -skriptet för första gången, ställ in din volym till 50%. Detta blir för högt, men det är bättre än 100%!

Om volymkontrollen fungerar omväxlande, byt ledningar i motsatta ändar av 10K potentiometern.

Låt mig veta hur det låter.

Rekommenderad: