Indholdsfortegnelse:

Afspilning af lydfiler (Wav) Med en Arduino og en DAC: 9 trin
Afspilning af lydfiler (Wav) Med en Arduino og en DAC: 9 trin

Video: Afspilning af lydfiler (Wav) Med en Arduino og en DAC: 9 trin

Video: Afspilning af lydfiler (Wav) Med en Arduino og en DAC: 9 trin
Video: Logic Pro X - How to Export your Track (WAV or MP3) 2024, December
Anonim
Afspilning af lydfiler (Wav) med en Arduino og en DAC
Afspilning af lydfiler (Wav) med en Arduino og en DAC
Afspilning af lydfiler (Wav) med en Arduino og en DAC
Afspilning af lydfiler (Wav) med en Arduino og en DAC
Afspilning af lydfiler (Wav) med en Arduino og en DAC
Afspilning af lydfiler (Wav) med en Arduino og en DAC

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

Krav
Krav
Krav
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

Specifikationerne
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

Kom godt i gang
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

Det lille kredsløb
Det lille kredsløb
Det lille kredsløb
Det lille kredsløb
Det lille kredsløb
Det lille kredsløb
Det lille kredsløb
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

Kom ud af loddejernet
Kom ud af loddejernet
Kom ud af loddejernet
Kom ud af loddejernet
Kom ud af loddejernet
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

Test af DAC
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

Læser Wav Header
Læser 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…

Afbryd, Afbryd…
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

Afbrydelser og dobbeltbuffering
Afbrydelser og dobbeltbuffering
Afbrydelser og dobbeltbuffering
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: