Innehållsförteckning:
- Steg 1: Krav
- Steg 2: Specifikationerna
- Steg 3: Komma igång
- Steg 4: Den lilla kretsen
- Steg 5: Ta ut lödkolven
- Steg 6: Testa DAC
- Steg 7: Läs Wav -rubriken
- Steg 8: Avbryt, avbryt…
- Steg 9: Avbrott och dubbel buffring
Video: Spela ljudfiler (Wav) med en Arduino och en DAC: 9 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:46
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
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
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
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
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
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
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
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…
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
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:
Talking Arduino - Spela en MP3 med Arduino utan någon modul - Spela upp MP3 -fil från Arduino med PCM: 6 steg
Talking Arduino | Spela en MP3 med Arduino utan någon modul | Spela MP3 -fil från Arduino Använda PCM: I denna instruktioner lär vi oss hur man spelar en mp3 -fil med arduino utan att använda någon ljudmodul, här kommer vi att använda PCM -bibliotek för Arduino som spelar 16 bitars PCM med 8 kHz -frekvens så låt oss göra detta
Spela CD -skivor utan CD -spelare, med AI och YouTube: 10 steg (med bilder)
Spela CD -skivor utan CD -spelare, använda AI och YouTube: Vill du spela dina CD -skivor men har inte mer CD -spelare? Hade du inte tid att rippa dina CD -skivor? Rippade dem men filerna är inte tillgängliga när det behövs? Inga problem. Låt AI (artificiell intelligens) identifiera din CD och YouTube spela den! Jag skrev en Android -app som gör
8 Reläkontroll med NodeMCU och IR -mottagare med WiFi och IR -fjärrkontroll och Android -app: 5 steg (med bilder)
8 Reläkontroll med NodeMCU och IR -mottagare med WiFi och IR -fjärrkontroll och Android -app: Styrning av 8 reläväxlar med nodemcu och IR -mottagare via wifi och IR -fjärrkontroll och Android -app. Fjärrkontrollen fungerar oberoende av wifi -anslutning. HÄR ÄR EN UPPDATERAD VERSIONKLICK HÄR
SPELA OCH LADDA UPP IPOD ANVÄNDNING AV GAMMEL BOOMBOX - Tips och tips: 5 steg (med bilder)
SPELA OCH LADDA UPP IPOD ANVÄNDNING AV GAMMEL BOOMBOX - Tips och tips: Betrakta detta som ett tillägg till andra iPod boombox -mods. Jag erkänner att jag lånat från andra instruktioner. För att inte ta ifrån dessa instruktioner, här är ett " rop ut " till dem som inspirerade mig att dyka in i min egen mod. Tack. Instruktivt
Spela in ljud för videor och animationer: några snabba tips och tricks: 8 steg
Spela in ljud för videor och animationer: några snabba tips och tricks: Om du är en blivande artist, eller bara ett barn som gillar att ibland göra animationer för YouTube, kan du ha ett par problem med att spela in ljudet. visuellt bra kan en video eller animering vara, om de som tittar på den kan