INHOUDSOPGAWE:

Speel klanklêers (WAV) met 'n Arduino en 'n DAC: 9 stappe
Speel klanklêers (WAV) met 'n Arduino en 'n DAC: 9 stappe

Video: Speel klanklêers (WAV) met 'n Arduino en 'n DAC: 9 stappe

Video: Speel klanklêers (WAV) met 'n Arduino en 'n DAC: 9 stappe
Video: How to Add Music on Inshot Editing App! | How To Add Music On Inshot Editing App 2024, Desember
Anonim
Speel klanklêers (WAV) met 'n Arduino en 'n DAC
Speel klanklêers (WAV) met 'n Arduino en 'n DAC
Speel klanklêers (WAV) met 'n Arduino en 'n DAC
Speel klanklêers (WAV) met 'n Arduino en 'n DAC
Speel klanklêers (WAV) met 'n Arduino en 'n DAC
Speel klanklêers (WAV) met 'n Arduino en 'n DAC

Speel wav -lêer Audio vanaf u Audino SD -kaart. Hierdie instruksie sal u wys hoe 'n wav -lêer op u SdCard deur 'n eenvoudige kring na 'n luidspreker gespeel kan word.

Die wav -lêer moet 8 bis mono wees. Ek het geen probleem gehad met die speel van 44 KHz lêers nie.

Alhoewel dit nie hi-fidelity is nie, is die geluidskwaliteit baie bevredigend.

Die seriële monitor word gebruik om die lêer te kies. Die lêers moet in 'n gids met die naam adlog wees.

Hierdie instruksie volg uit 'n vorige projek waar ek wav-opnames op die SdCard gestoor het:

Die kring gebruik 'n goedkoop 8 -bis digitale na analoog -omskakelaar (DAC) en 'n enkelspeler -klankversterker.

Belangrike gedeeltes vir die opstel van onderbrekings is geneem uit die uitstekende artikel deur Amanda Ghassaei:

Stap 1: Vereistes

Vereistes
Vereistes
Vereistes
Vereistes

Arduino- Ek gebruik die Mega, maar daar is geen rede waarom die Uno nie moet werk nie.

SdCard-leser-die program is opgestel vir: MicroSD Breakout Board gereguleer met Logic Conversion V2

Sien hierdie instruksies vir die opstelbesonderhede van SdCard:

DAC0832 LCN- 'n uitstekende 8 bis digitale na analoog converter- 'n paar pond.

LM386 N-1 Op amp- goedkoop as skyfies

20 -manier chip -aansluiting

8 -rigting chip -aansluiting

9 volt kragtoevoer- 'n battery werk.

LM336 2,5 V spanningsverwysing

10uF kondensator * 3 (enige spanning meer as 9V)

Weerstand van 10 ohm

50nF kapasitor- (Of iewers naby-47nF, 56nf, 68nf- sal doen)

220uF kondensator

64 Ohm luidspreker

10K lineêre potensiometer

Kabel om die 8 data lyne tussen die Arduino en die stroombaan te verbind

Op die Uno is die 8 verbindings in lyn, op die Mega is hulle in pare.

Op die Mega gebruik ek 'n 10 -weg lintkabel met 'n 10 -weg IDC -kop. (2 drade is oor)

Sokverbindings vir 0V, 9V en DAC out

Koperstrookbord, soldeer, draad, snyers, ens

Stap 2: Die spesifikasies

Die spesifikasies
Die spesifikasies

Reeks stel op 115200 baud.

Ondersteuning is beskikbaar vir die Hobbytronics MicroSD Breakout Board met behulp van 'n Mega. Die chip select en ander poorte sal verander tussen Mega en Uno.

Die Wav-lêers moet in 'n gids met die naam adlog bestaan- noem dit gerus iets anders en rangskik die nodige kodering.

Die wav -lêer moet 8 bis mono wees. Ek het tot 44KHz getoets.

Die seriële monitor vertoon die wav -lêers in die adlog -lêergids. Lêernaam word vanaf die monitor -uitvoerlyn gestuur.

Lêergrootte word slegs beperk deur SdCard -grootte.

Stap 3: Aan die gang

Aan die gang kom
Aan die gang kom

Koppel die SD -kaartleser. Dit is die verbindings vir die Mega.

0, 5V

CLK tot pen 52

D0 tot pen 50

D1 tot pen 51

CS tot pen 53

(Sien verskafferswebwerf vir Uno -poortverbinding)

U wil toets dat u kaart in hierdie stadium werk- gebruik die skrifte wat deur die verskaffer verskaf word.

Ons moet 'n klein stroombaan maak

Ons gaan 'n stroom klankgrepe vanaf die Arduino stuur.

Hierdie getalle is tussen 0 en 255. Dit verteenwoordig die spanning.

Stilte is 127-128.

255 is luidsprekerkegel hard op een manier.

0 is luidsprekerkegel hard, andersom.

So word klank opgeneem as gestoorde getalle, wat wisselende spanning veroorsaak, wat bewegende luidsprekerkeëls skep.

Ons kan die getalle gelyktydig uit 8 reëls op die Arduino stuur deur 'n "poort" te gebruik.

As ons die 8 lyne in 'n digitaal na analoog omskakelaar voer, doen dit wat dit op die blik sê en produseer 'n analoog spanning wat eweredig is aan die digitale getal.

Al wat ons hoef te doen, is om die spanning na 'n klein versterker en dan na 'n luidspreker af te pak.

Stap 4: Die klein stroombaan

Die klein kring
Die klein kring
Die klein kring
Die klein kring
Die klein kring
Die klein kring
Die klein kring
Die klein kring

Die DAC0832 LCN

Dit is 'n uitstekende, goedkoop 8 -bis digitale na analoog -omskakelaar. (DAC)

Dit kan ten volle beheer word met 'n verskeidenheid data -bewaarlyne, steekproeflyne.

Of dit kan opgestel word om dit alles outomaties te doen in "Deurstroom deurloop".

Om die handleiding aan te haal:

Deur CS, WR1, WR2 en XFER eenvoudig te grond en ILE hoog vas te bind, kan beide interne registers die toegepaste digitale insette (deurvloei) volg en die analoge DAC-uitset direk beïnvloed.

OK, dit is vier verbindings met die chip laag en een stel op 9V - maklik.

Ons wil geen negatiewe spannings hê nie, so die handleiding sê dat ons 'n spanningswisselingsmodus moet gebruik, en dit gee die diagram.

Al wat ons hoef te doen is om 'n klein klankversterker te vervang in plaas van die een wat hulle voorstel.

Die LM386-N Audio Amp

Die handleiding van die versterker bevat 'n minimum onderdiagram- 'n wins van 20 (heeltemal te veel vir ons, maar dit het 'n volumebeheer).

Al wat ons hoef te doen is om 'n kondensator tussen die DAC en die versterker by te voeg, sodat ons slegs die AC seine versterk.

Ons moet ook 'n paar kondensators by die toevoerpen van elkeen van ons skyfies voeg, anders kry ons neurie van ons 9V -toevoer.

Stap 5: Verwyder die soldeerbout

Kom uit die soldeerbout
Kom uit die soldeerbout
Kom uit die soldeerbout
Kom uit die soldeerbout
Kom uit die soldeerbout
Kom uit die soldeerbout

Aangesien die kring eenvoudig is, is ek nie van plan om 'n slag vir slag rekening te gee nie.

Hier is 'n paar wenke:

  • Berei 'n stuk koperstrookbord van minstens 28 by 28 gate voor. (Ja, ek weet breinchirurge kan dit kleiner maak)
  • As u van plan is om dit met skroewe te monteer, laat dit aan die begin toe!
  • Monteer die skyfies op die voetstukke. Plaas die skyfies eers as alles nagegaan is.
  • Hou die ingangskabel weg van die uitvoer.
  • Let op die korrekte polariteit van die kapasitors.
  • Verwys na die diagram vir die basisaansig van die LM336 spanningsverwysing. Die verstelbeen word nie gebruik nie en kan gesny word.
  • Let op die direkte verbinding met pen 8 van die DAC- Dit is baie handig om te toets.
  • Ek het met die lintkabel en 'n 10 -rigting IDC -aansluiting op die Audino gekoppel.
  • Op die Uno is die verbindings in 'n reguit lyn - u kan vind dat deur die 8 invoerverbindings in 'n enkele reguit lyn te rangskik, u 'n skakel na die Arduino kan maak met 'n gekoopte, klaargemaakte 8 -weg -aansluiting,

As dit klaar is- kyk na die soldeer en kyk na die gapings tussen die koperspore.

Ek vind 'n 36 tpi junior hakmes baie nuttig om puin te verwyder. Ek verwyder die spelde van die lem en skuif die punt van die lem in die spoor. Dit is duidelik dat die lem nie in 'n raam is nie.

Stap 6: Toets die DAC

Toets die DAC
Toets die DAC

Laat die verbinding tussen die stroombaan en die Arduino uit.

Stel die volumeregeling op u stroombaan op halfpad.

Skakel die 9V DC -krag aan na u nuwe stroombaan.

Kontroleer of die kring reg is- ek kan geen aanspreeklikheid aanvaar vir u kring nie!

Skakel af

Koppel u stroombaan aan die Arduino.

Gebruik penne 22-29 op die Mega. (PORTA) Moenie die twee 5V -penne hierbo verwar nie!

Gebruik penne 0-7 op die Uno. Dit is PORTD

Koppel die 0V van u kragtoevoer aan die 0V op die Arduino.

Skakel aan.

Maak hierdie toetsprogram DAC_TEST oop

Vir die UNO, vervang alle verwysings na PORTA na PORTD

Vervang DDRA met DDRD- hierdie instruksie stel al 8 reëls in een keer op uitvoer. Dit is die datarigtingregister.

Stel u seriële monitor op 115200.

Koppel 'n voltmeter tussen die DAC out en OV

Die program stel die uitset op 255- alle lyne aan - maksimum spanning.

Uitset 128- half maksimum spanning.

Uitset 0- nulspanning (Of waarskynlik byna nul).

Dit stap dan stiksgewys: 1, 2, 4, 8, 16, 32, 64, 128

Die spanning moet geleidelik toeneem.

As die spanning terugsak terwyl die getal toeneem, het u waarskynlik twee van die verbindingsdrade omgekeer.

U moet ook die luidspreker rustig hoor klik terwyl die spanning verander

Stap 7: Lees die Wav -opskrif

Lees die Wav -opskrif
Lees die Wav -opskrif

WAV -lêers word gestoor met 'n gespesifiseerde frekwensie en datagrootte.

Hierdie inligting is vervat in 'n opskrif van 44 byte aan die begin van 'n wav -lêer.

Alhoewel sommige sagteware die opskrif verleng (na byte 35), word die ligging van die datagrootte moeiliker om op te spoor.

Om die opskrif te lees, skep ons 'n buffer en kopieer die begin van die lêer.

Die frekwensie word gestoor in 4 grepe vanaf 24 grepe in die lêer.

// leesfrekwensie gespesifiseer in wav -lêeropskrif

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 ("lêerfrekwensie"));

Serial.print (retval);

Die beste manier om die gegewensgrootte -inligting te vind, is om na die woord "data" in die kop te soek.

Onttrek dan die 4 grepe wat daarop volg, wat die lang waarde uitmaak

ongetekende lang herhaling;

int mypos = 40;

vir (int i = 36; i <60; i ++) {

as (headbuf == 'd') {

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

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

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

// uiteindelik het ons dit

mypos = i+4;

ek = 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, ons het die datalengte en frekwensie!

Die klankdata volg die 4 grepe waaruit die datalengtewaarde bestaan.

Stap 8: Onderbreek, onderbreek…

Onderbreek, onderbreek…
Onderbreek, onderbreek…

Ons gebruik die frekwensie -inligting om 'n sagteware -onderbreking op of naby die vereiste frekwensie te skep.

Die onderbreking kan nie altyd presies ingestel word nie, maar dit is voldoende. Die frekwensie wat uit die lêer gelees word, word deurgegee na die ingestelde onderbreekprogram.

leegte setintrupt (float freq) {float bitval = 8; // 8 vir 8 bit timers 0 en 2, 1024 vir timer 1 byte

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

// Die setocroa -waarde vereis 'n aftrekking van -1. Voeg egter 0,5 rondes by naaste 0,5

// Die resolusie van die timer is beperk

// Uiteindelik bepaal deur die grootte van bitval

cli (); // skakel onderbrekings uit // stel timer2 -onderbreking in

TCCR2A = 0; // stel die hele TCCR2A -register op 0

TCCR2B = 0; // dieselfde vir TCCR2B

TCNT2 = 0; // initialiseer tellerwaarde na 0

// stel vergelyk wedstrydregister vir frekwensie (hz) inkremente

OCR2A = setocroa; // = (16*10^6) / (frekwensie*8) - 1 (moet <256 wees)

// skakel die CTC -modus aan

TCCR2A | = (1 << WGM21); // Stel CS21 -bit in vir 8 voorverkoeler

TCCR2B | = (1 << CS21); // aktiveer timer vergelyk onderbreek

// TIMSK2 | = (1 << OCIE2A); // dit werk, net soos die volgende reël

sbi (TIMSK2, OCIE2A); // aktiveer onderbreking op timer 2

sei (); // maak onderbrekings moontlik

Besondere lesers sal sbi (TIMSK2, OCIE2A) raakgesien het

Ek stel 'n paar (internetverwerkte) funksies op vir die instelling en verwydering van registerstukkies:

// Definieer vir die verwydering van registerstukke#ifndef cbi

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

#endif

// Definieer vir die opstel van registerstukke

#ifndef sbi

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

#endif

Hierdie funksies bied 'n maklike oproep om die onderbreking in te stel of uit te vee.

Die onderbreking loop dus, wat kan ons dit laat doen?

Stap 9: Onderbrekings en dubbele buffering

Onderbrekings en dubbele buffering
Onderbrekings en dubbele buffering
Onderbrekings en dubbele buffering
Onderbrekings en dubbele buffering

By 22 Khz word 'n greep klankdata elke 0,045 ms afgelewer

512 grepe (die buffer grootte) word gelees in 2,08 ms.

Die buffer kan dus nie in een skryf siklus van die SDCard gelees word nie.

512 grepe word egter in 23,22 ms na die poort geskryf.

Al wat ons hoef te doen is om 'n nuwe lêer op te stel elke keer as die buffer leeggemaak word, en ons het genoeg tyd om die data te kry voordat 'n nuwe datablok nodig is … As ons twee buffers gebruik, een leegmaak terwyl ons 'n ander vul.

Dit is dubbele buffering.

Die lees van die lêer word vertraag deur die herhaalde onderbreking, maar dit sal klaar wees.

Ek het twee 512 byte buffers opgestel wat bufa en bufb genoem word.

As die vlag reeds waar is, lees ons uit porta, anders lees ons uit portb

As die bufferposisie (bufcount) die buffergrootte (BUF_SIZE 512) bereik, stel ons 'n vlag genaamd readit op true.

Die leemte -lusroetine soek hierdie vlag en begin 'n blok wat lees:

if (readit) {if (! aready) {

// begin SDCard -blok gelees na bufa

tempfile.read (bufa, BUF_SIZE);

} anders {

// begin SDCard -blok gelees na bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = vals;

}

As dit klaar is, word die roetine -vlae readit = false.

Binne die onderbreekroetine moet ons kontroleer of die leemte -lus klaar is deur te kyk of readit == false.

In hierdie geval gee ons aan dat nog 'n lesing nodig is, en skakel die vlag wat reeds is, om van buffer te verander.

As die SD-kaart nog lees, moet ons een lesing (teller--; bufcount--;) agteruit hou en die onderbreking verlaat om later weer te probeer. (Kliek op die klankuitsetsein impliseer dat dit gebeur het.)

As al die data gelees word, word die onderbreking gekanselleer, die poort word weer ingestel op die middelspanningswaarde van 128 en die klanklêer word gesluit.

Stel u volume op 50%voordat u die script dac2.ino vir die eerste keer uitvoer. Dit sal te hard wees, maar dit is beter as 100%!

As u volumekontrole omgekeerd werk, ruil die drade aan die teenoorgestelde ente van die 10K potensiometer.

Laat weet my hoe dit klink.

Aanbeveel: