Indholdsfortegnelse:
- Trin 1: Krav
- Trin 2: Specifikationerne
- Trin 3: Kom godt i gang
- Trin 4: Det lille kredsløb
- Trin 5: Kom ud af loddejernet
- Trin 6: Test af DAC
- Trin 7: Læsning af Wav Header
- Trin 8: Afbryd, afbryd…
- Trin 9: Afbrydelser og dobbeltbuffering
Video: Afspilning af lydfiler (Wav) Med en Arduino og en DAC: 9 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:29
Afspil wav -fil Lyd fra dit Audino SD -kort. Denne instruktør viser dig, hvordan en wav -fil på dit SdCard kan afspilles gennem et simpelt kredsløb til en højttaler.
WAV -filen skal være 8 bit mono. Jeg har ikke haft problemer med at afspille 44 KHz filer.
Selvom det ikke er hi-fidelity, er lydkvaliteten meget tilfredsstillende.
Den serielle skærm bruges til at vælge filen. Filerne skal være i en mappe kaldet adlog.
Dette instruerbare følger af et tidligere projekt, hvor jeg gemte wav-optagelser på SdCard:
Kredsløbet anvender en billig 8 bit digital til analog converter (DAC) og en enkelt chip lydforstærker.
Nøglesektioner til opsætning af afbrydelser blev taget fra den fremragende artikel af Amanda Ghassaei:
Trin 1: Krav
Arduino- Jeg bruger Mega, men der er ingen grund til, at Uno ikke skal fungere.
SdCard-læser-programmet er konfigureret til: MicroSD Breakout Board reguleret med logisk konvertering V2
Se denne instruktion for oplysninger om SdCard-opsætning:
DAC0832 LCN- en fremragende 8 bit digital til analog konverter- Et par pund.
LM386 N-1 Op amp- billig som chips
20 -vejs chipsokkel
8 -vejs chip -stik
9 volt strømforsyning- et batteri vil klare.
LM336 2,5 V spændingsreference
10uF kondensator * 3 (enhver spænding mere end 9V)
10 ohm modstand
50nF kondensator- (Eller et sted i nærheden af -47nF, 56nf, 68nf- vil gøre)
220uF kondensator
64 ohm højttaler
10K lineært potentiometer
Kabel til at forbinde de 8 datalinjer mellem Arduino og kredsløbet
På Uno er de 8 forbindelser i kø, på Mega er de parvis.
På Mega brugte jeg 10 -vejs båndkabel med et 10 -vejs IDC -header. (2 ledninger er ekstra)
Stikkontakter til 0V, 9V og DAC ud
Kobberbånd, lodde, tråd, fræsere osv
Trin 2: Specifikationerne
Serielt indstillet til 115200 baud.
Der er support på plads til Hobbytronics MicroSD Breakout Board ved hjælp af en Mega. Chip select og andre porte ændres mellem Mega og Uno.
Wav-filerne skal eksistere i et bibliotek, der hedder adlog- Giv det gerne et andet navn og omarrangér den nødvendige kodning.
WAV -filen skal være 8 bit mono. Jeg har testet op til 44KHz.
Seriel skærm viser wav -filerne i adlog -mappen. Filnavne sendes fra monitorens outputlinje.
Filstørrelse er kun begrænset af SdCard -størrelse.
Trin 3: Kom godt i gang
Tilslut SD -kortlæseren. Dette er forbindelserne til Mega.
0, 5V
CLK til pin 52
D0 til pin 50
D1 til pin 51
CS til pin 53
(Se leverandørens websted for Uno -portforbindelse)
Du vil gerne teste, at dit kort fungerer på dette stadium- brug de scripts, der leveres af leverandøren.
Vi skal lave et lille kredsløb
Vi sender en strøm af lydbytes fra Arduino.
Disse tal er mellem 0 og 255. De repræsenterer spændingen.
Stilhed er 127-128.
255 er højttalerkegle hård på en måde.
0 er højttalerkegle hård den anden vej.
Så lyd optages som gemte numre, som skaber varierende spændinger, som skaber bevægelige højttalerkegler.
Vi kan sende tallene ud af 8 linjer på Arduino samtidigt ved hjælp af en "port".
Hvis vi indfører de 8 linjer til en digital til analog konverter, gør den, hvad der står på tinnen og producerer en analog spænding, der er proportional med det digitale tal.
Det eneste vi skal gøre er at pakke spændingen af til en lille operationsforstærker og derefter til en højttaler.
Trin 4: Det lille kredsløb
DAC0832 LCN
Dette er en fantastisk, billig 8 bit digital til analog konverter. (DAC)
Det kan kontrolleres fuldstændigt med en vifte af dataopbevaringslinjer.
Eller det kan konfigureres til at gøre det hele automatisk i "Gennemstrømning gennem drift".
For at citere manualen:
Simpelthen jordforbindelse til CS, WR1, WR2 og XFER og binding af ILE højt gør det muligt for begge interne registre at følge de anvendte digitale indgange (gennemstrømning) og direkte påvirke den analoge DAC-udgang.
OK, det er fire tilslutninger til chipsættet lavt og et sæt til 9V - let.
Vi vil ikke have nogen negative spændinger ud, så manualen siger, at vi skal bruge "spændingsomskiftningstilstand", og de leverer diagrammet.
Alt, hvad vi skal gøre, er at erstatte en lille lydforstærker i stedet for den, de foreslår.
LM386-N lydforstærker
Forstærkerens manual indeholder et minimumsdiagram- giver en forstærkning på 20 (alt for meget for os- men den har en volumenkontrol).
Alt vi skal gøre er at tilføje en kondensator mellem DAC og forstærkeren, så vi kun forstærker vekselstrømssignaler.
Vi skal også tilføje et par kondensatorer tæt på forsyningsnålen på hver af vores chips, ellers får vi brummen fra vores 9V -forsyning.
Trin 5: Kom ud af loddejernet
Da kredsløbet er enkelt, har jeg ikke til hensigt at give et slag for slag -konto.
Her er nogle tip:
- Forbered et stykke kobberstrimmelbræt mindst 28 gange 28 huller. (Ja, jeg ved, at hjernekirurger kan gøre det mindre)
- Hvis du vil montere den med skruer, skal du tillade dem i starten!
- Monter chipsene på stikkontakter. Indsæt først chipsene, når alt er blevet kontrolleret.
- Hold input -ledningerne væk fra output.
- Vær opmærksom på den korrekte polaritet for kondensatorerne.
- Se diagrammet for basisvisning af LM336 -spændingsreferencen. Justeringsbenet bruges ikke og kan skæres.
- Bemærk den direkte forbindelse til pin 8 på DAC- Det er meget nyttigt til test.
- Jeg sluttede til Audino med båndkabel og en 10 -vejs IDC -forbindelse.
- På Uno er forbindelserne i en lige linje - du kan opleve, at ved at arrangere de 8 inputforbindelser i en enkelt lige linje kan du linke til Arduino med en købt, færdiglavet 8 -vejs -konnektor,
Når den er færdig- kontroller lodningen og kontroller hullerne mellem kobbersporene.
Jeg finder en 36 tpi junior hack savklinge meget nyttig til rydning af snavs. Jeg fjerner bladets lokaliseringsnåle og skubber spidsen af bladet ind i sporet- Klingen er naturligvis ikke i en ramme.
Trin 6: Test af DAC
Lad forbindelsen mellem kredsløbet og Arduino være slukket.
Indstil lydstyrkekontrollen på dit kredsløb til midtvejs.
Tænd 9V DC -strømmen til dit nye kredsløb.
Kontroller, at kredsløbet er ok- jeg kan ikke påtage mig noget ansvar for dit kredsløb!
Sluk
Tilslut dit kredsløb til Arduino.
På Mega skal du bruge stifter 22-29. (PORTA) Tag ikke fejl af de to 5V ben ovenfor!
På Uno brug stifter 0-7. Dette er PORTD
Tilslut 0V på din strømforsyning til 0V på Arduino.
Opstart.
Åbn dette testprogram DAC_TEST
For UNO skal alle referencer til PORTA erstattes med PORTD
Udskift DDRA med DDRD- denne instruktion sætter alle 8 linjer til output på én gang. Dette er dataretningsregistret.
Indstil din serielle skærm til 115200.
Tilslut et voltmeter mellem DAC ud og OV
Programmet vil sætte output til 255 - alle linjer tændt - maksimal spænding.
Output 128- halv maksimal spænding.
Output 0- nul spænding (Eller sandsynligvis næsten nul).
Det vil derefter skridt bitvis: 1, 2, 4, 8, 16, 32, 64, 128
Spændingen skal stige støt.
Hvis spændingen falder tilbage, mens antallet stiger, har du sandsynligvis to af de sammenkoblede ledninger vendt.
Du bør også høre højttaleren stille klikke, når spændingen ændres
Trin 7: Læsning af Wav Header
Wav -filer gemmes med en bestemt frekvens og datastørrelse.
Disse oplysninger er indeholdt i et 44 byte header i starten af en wav -fil.
Selvom noget software forlænger headeren (efter byte 35), hvilket gør placeringen af datastørrelsen vanskeligere at lokalisere.
For at læse overskriften opretter vi en buffer og kopierer starten af filen.
Frekvensen gemmes i 4 bytes, der starter 24 bytes i filen.
// læsefrekvens angivet i wav -filoverskrift
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);
Den bedste måde at finde oplysninger om datastørrelse på er at søge efter ordet "data" i overskriften.
Udtræk derefter de 4 bytes, der følger den, der udgør den lange værdi
usigneret lang retval;
int mypos = 40;
for (int i = 36; i <60; i ++) {
hvis (headbuf == 'd') {
hvis (headbuf [i+1] == 'a') {
hvis (headbuf [i+2] == 't') {
hvis (headbuf [i+3] == 'a') {
// endelig 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ængde og frekvens!
Lyddata følger de 4 bytes, der udgør datalængdeværdien.
Trin 8: Afbryd, afbryd…
Vi bruger frekvensoplysningerne til at oprette en softwareafbrydelse ved eller i nærheden af den krævede frekvens.
Afbrydelsen kan ikke altid indstilles præcist, men det er tilstrækkeligt. Frekvensen, der læses fra filen, overføres til den indstillede afbrudte underprogram.
void setintrupt (float freq) {float bitval = 8; // 8 for 8 bit timere 0 og 2, 1024 for timer 1 byte
setocroa = (16000000/(freq*bitval)) - 0,5;
// Setocroa -værdien kræver en subtraktion på -1. Dog tilføjer 0,5 runder til nærmeste 0,5
// Timerens opløsning er begrænset
// Endelig bestemt af størrelsen af bitval
cli (); // deaktiver afbrydelser // indstil timer2 -afbrydelse
TCCR2A = 0; // sæt hele TCCR2A -registret til 0
TCCR2B = 0; // samme for TCCR2B
TCNT2 = 0; // initialiser tællerværdi til 0
// sæt sammenligne matchregister for frekvens (hz) trin
OCR2A = setocroa; // = (16*10^6) / (frekvens*8) - 1 (skal være <256)
// Tænd CTC -tilstand
TCCR2A | = (1 << WGM21); // Indstil CS21 -bit til 8 forkalkningsmaskiner
TCCR2B | = (1 << CS21); // aktiver timer sammenligning afbrydelse
// TIMSK2 | = (1 << OCIE2A); // dette virker, ligesom følgende linje
sbi (TIMSK2, OCIE2A); // aktiver afbrydelse på timer 2
sei (); // aktiver afbrydelser
Kræsne læsere vil have opdaget sbi (TIMSK2, OCIE2A)
Jeg opsætter et par (internet erhvervede) funktioner til indstilling og sletning af registerbit:
// Definerer til sletning af registerbits#ifndef cbi
#define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))
#Afslut Hvis
// Definerer til indstilling af registerbit
#ifndef sbi
#define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))
#Afslut Hvis
Disse funktioner giver et let opkald til at indstille eller slette afbrydelsen.
Så afbrydelsen kører, hvad kan vi få den til at gøre?
Trin 9: Afbrydelser og dobbeltbuffering
Ved 22 Khz udsendes en byte lyddata hver 0,045 ms
512 bytes (bufferstørrelsen) læses i 2,08 ms.
Så bufferen kan ikke læses fra SDCard i en skrivecyklus.
Dog skrives 512 bytes til porten på 23,22 ms.
Så alt hvad vi skal gøre er at opsætte en ny fil, der læses hver gang bufferen tømmes, og vi har tid nok til at hente dataene, før der kræves en ny datablok … Forudsat at vi bruger to buffere, tømmer en, når vi fylder en anden.
Dette er dobbeltbuffering.
Filen læses vil blive bremset af den gentagne afbrydelse, men det vil blive gjort.
Jeg har opsat to 512 byte buffere kaldet bufa og bufb.
Hvis flaget allerede er sandt, læser vi fra porta ellers læser vi fra portb
Når bufferpositionen (bufcount) når bufferstørrelsen (BUF_SIZE 512) sætter vi et flag kaldet readit til true.
Tomrumsløjfe -rutinen leder efter dette flag og starter en blok, der læser:
if (readit) {if (! aready) {
// start SDCard -blok læst til bufa
tempfile.read (bufa, BUF_SIZE);
} andet {
// start SDCard -blok læst til bufb
tempfile.read (bufb, BUF_SIZE);
}
readit = falsk;
}
Når den er færdig, rutineflagene readit = false.
Inden for afbrydelsesrutinen skal vi kontrollere, at tomrumsløkken er afsluttet ved at kontrollere, om readit == false.
I dette tilfælde signalerer vi, at en anden læsning er påkrævet, og vi skifter det allerede markerede flag til at skifte buffere.
Hvis SD-kortet stadig læser, skal vi spore én læsning (tæller--; bufcount--;) og afslutte afbrydelsen for at prøve igen senere. (Klik i lydudgangssignalet antyder, at dette er sket.)
Når alle data er læst, afbrydes afbrydelsen, porten genindstilles til midtspændingsværdien på 128, og lydfilen lukkes.
Inden du kører dac2.ino -scriptet for første gang, skal du indstille din lydstyrke til 50%. Dette vil være for højt, men det er bedre end 100%!
Hvis din volumenkontrol fungerer omvendt, skal du skifte ledninger i modsatte ender af 10K potentiometeret.
Lad mig vide, hvordan det lyder.
Anbefalede:
MP3 -afspilning af lyd FX -væg: 12 trin (med billeder)
MP3 -afspilning af lyd FX -væg: Opret en sjov og interaktiv lydvæg, der afspiller MP3'er med et enkelt tryk! Hvad gør du med en tom væg? Kan du tilføje nogle fine billeder til det? Eller dæk det med en farverig husplante. Vi har endda set nogle mennesker skjule nøgne vægge bag bogen
Brug bevægelser til at styre YouTube -afspilning med Arduino: 5 trin
Brug gestus til at styre YouTube -afspilning med Arduino: StoryYouTube giver dig kun mulighed for at spole hurtigt frem i 5 sekunder, hver gang du klikker på den højre knap. Så jeg besluttede at bruge Arduino og python til at lave en controller til at hjælpe mig med at spole 20 sekunder frem hver gang jeg vifter med hånden
Album med NFC -tags til automatisk afspilning af Spotify -musik på Chromecast: 5 trin
Album med NFC -tags til automatisk at afspille Spotify -musik på Chromecast: Dette projekt startede med ideen om at lave en albumcollage af mine mest spillede artister på Spotify. Efter lidt spil med Spotify API i Python, tænkte jeg, at det ville være rart at knytte disse albumcover til deres Spotify URI'er og begynde at afspille
Talende Arduino - Afspilning af en MP3 med Arduino uden modul - Afspilning af MP3 -fil fra Arduino ved hjælp af PCM: 6 trin
Talende Arduino | Afspilning af en MP3 med Arduino uden modul | Afspilning af mp3 -filer fra Arduino ved hjælp af PCM: I denne instruktør vil vi lære at afspille en mp3 -fil med arduino uden at bruge noget lydmodul, her vil vi bruge PCM -bibliotek til Arduino, der spiller 16 bit PCM med 8 kHz frekvens, så lad os gøre dette
Arduino Bascis - Afspilning af lyde og toner: 5 trin
Arduino Bascis - Afspilning af lyde og toner: Jeg ville spille nogle lydeffekter og indså, at dette er et af de forsømte områder, når det kommer til tutorials. Selv på Youtube mangler der gode tutorials om Arduinos og lyde, så jeg var den flinke fyr og besluttede at dele min viden