Tartalomjegyzék:

Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével: 9 lépés
Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével: 9 lépés

Videó: Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével: 9 lépés

Videó: Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével: 9 lépés
Videó: TYROS 2 USB 2024, November
Anonim
Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével
Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével
Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével
Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével
Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével
Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével

WAV fájl lejátszása Audino SD kártyáról. Ez az utasítás megmutatja, hogyan játszható le az SdCard -on található wav fájl egy egyszerű áramkörön keresztül egy hangszóróhoz.

A wav fájlnak 8 bites monónak kell lennie. Nem volt gondom 44 KHz -es fájlok lejátszásával.

A hangminőség nem kielégítő, de nagyon kielégítő.

A soros monitor a fájl kiválasztására szolgál. A fájloknak az adlog nevű mappában kell lenniük.

Ez az utasítás egy korábbi projektből következik, ahol a wav felvételeket az SdCard-ra mentettem:

Az áramkör olcsó 8 bites digitális -analóg átalakítót (DAC) és egy chipes audió erősítőt használ.

A megszakítások beállításának kulcsszavai Amanda Ghassaei kiváló cikkéből származnak:

1. lépés: Követelmények

Követelmények
Követelmények
Követelmények
Követelmények

Arduino- Én a Mega-t használom, azonban nincs ok arra, hogy az Uno ne működjön.

SdCard olvasó-a program a következőkre van konfigurálva: MicroSD Breakout Board Regulated with Logic Conversion V2

Tekintse meg ezt az útmutatót az SdCard beállítási részleteihez:

DAC0832 LCN- kiváló 8 bites digitális-analóg átalakító- Néhány font.

LM386 N-1 Op erősítő- olcsó chipekként

20 utas forgácsaljzat

8 utas chip aljzat

9 voltos tápellátás- egy akkumulátor megteszi.

LM336 2,5 V feszültség referencia

10uF kondenzátor * 3 (bármilyen feszültség több mint 9V)

10 ohmos ellenállás

50nF kondenzátor (vagy valahol közel 47nF, 56nf, 68nf- megteszi)

220uF kondenzátor

64 ohmos hangszóró

10K lineáris potenciométer

Kábel az Arduino és az áramkör közötti 8 adatvonal összekapcsolásához.

Az Unón a 8 csatlakozás egy vonalban van, a Mega -n párban.

A Mega -n 10 utas szalagkábelt használtam, 10 utas IDC fejléccel. (2 vezeték hiányzik)

Aljzat csatlakozók 0V, 9V és DAC kimenethez

Réz szalaglap, forrasztás, huzal, vágók stb

2. lépés: A specifikációk

A specifikációk
A specifikációk

Soros beállítás 115200 baud.

Támogatott a Hobbytronics MicroSD Breakout Board Mega segítségével. A chipválasztó és a többi port megváltozhat a Mega és az Uno között.

A Wav fájloknak létezniük kell az adlog nevű könyvtárban. Nyugodtan nevezzen el valami mást, és rendezze újra a szükséges kódolást.

A wav fájlnak 8 bites monónak kell lennie. 44KHz -ig teszteltem.

A Soros monitor megjeleníti a wav fájlokat az adlog mappában. A fájlnevek a monitor kimeneti sorából érkeznek.

A fájlméretet csak az SdCard mérete korlátozza.

3. lépés: Első lépések

Elkezdeni
Elkezdeni

Csatlakoztassa az SD kártyaolvasót. Ezek a Mega kapcsolatai.

0, 5V

CLK az 52. csaphoz

D0 -tól az 50 -es tűig

D1 - 51. tű

CS az 53. csaphoz

(Az Uno port csatlakozást lásd a szállítók webhelyén)

Ellenőrizze, hogy a kártyája működik-e ebben a szakaszban- használja a gyártó által biztosított szkripteket.

Kis áramkört kell készítenünk

Hangbájtokat fogunk küldeni az Arduino -ból.

Ezek a számok 0 és 255 között vannak. A feszültséget jelzik.

A csend 127-128.

A 255 hangszórókúp egyirányú.

A 0 a hangszóró kúpja másfelé.

Tehát a hang mentett számként kerül rögzítésre, amelyek különböző feszültségeket hoznak létre, amelyek mozgó hangszórókúpokat hoznak létre.

A számokat 8 sorból tudjuk kiküldeni az Arduino -n egyidejűleg egy "port" használatával.

Ha a 8 sort egy digitális -analóg átalakítóba tápláljuk, akkor azt teszi, amit az ónon ír, és analóg feszültséget állít elő, amely arányos a digitális számmal.

Csak annyit kell tennünk, hogy lecsomagoljuk a feszültséget egy kis műveleti erősítőre, majd egy hangszóróra.

4. lépés: A kis áramkör

A kis áramkör
A kis áramkör
A kis áramkör
A kis áramkör
A kis áramkör
A kis áramkör
A kis áramkör
A kis áramkör

A DAC0832 LCN

Ez egy kiváló, olcsó 8 bites digitális -analóg átalakító. (DAC)

Teljes mértékben vezérelhető adattárolási tömbökkel, adatmintavonalakkal.

Vagy beállítható úgy, hogy mindezt automatikusan végezze el az "Átfolyási művelet" részben.

A kézikönyvet idézve:

A CS, WR1, WR2 és XFER egyszerűen földelése és az ILE high megkötése lehetővé teszi, hogy mindkét belső regiszter kövesse az alkalmazott digitális bemeneteket (átáramlás), és közvetlenül befolyásolja a DAC analóg kimenetet.

OK, négy csatlakozás a chiphez alacsony, egy pedig 9 V -ra - egyszerű.

Nem akarunk negatív feszültségeket kivenni, ezért a kézikönyv azt mondja, hogy "feszültségkapcsolási módot" kell használnunk, és ők szolgáltatják a diagramot.

Csak annyit kell tennünk, hogy kicserélünk egy kis audioerősítőt az általuk javasolt helyett.

Az LM386-N audió erősítő

Az erősítő kézikönyve minimális alkatrészdiagramot tartalmaz- 20 erősítést biztosít (túl sok nekünk- de hangerőszabályzóval rendelkezik).

Csak egy kondenzátort kell hozzáadnunk a DAC és az erősítő közé, hogy csak az AC jeleket erősítsük.

Mindegyik chipünk tápegységéhez néhány kondenzátort is hozzá kell adnunk, különben zümmögést kapunk a 9 V -os tápellátásunkból.

5. lépés: Vegye ki a forrasztópáka

Vegye ki a forrasztópáka
Vegye ki a forrasztópáka
Vegye ki a forrasztópáka
Vegye ki a forrasztópáka
Vegye ki a forrasztópáka
Vegye ki a forrasztópáka

Mivel az áramkör egyszerű, nem szándékozom csapást mérni.

Íme néhány mutató:

  • Készítsen elő egy darab réz szalaglemezt, legalább 28 x 28 lyukú. (Igen, tudom, hogy az agysebészek csökkenthetik)
  • Ha csavarokkal kívánja felszerelni, engedje meg őket az elején!
  • Szerelje fel a forgácsot az aljzatokra. A chipeket csak akkor helyezze be, ha mindent ellenőriztek.
  • Tartsa távol a bemeneti vezetékeket a kimenettől.
  • Ügyeljen a kondenzátorok helyes polaritására.
  • Lásd az ábrát az LM336 feszültség referencia alapnézetéhez. A beállító láb nincs használatban, és vágható.
  • Vegye figyelembe a közvetlen kapcsolatot a DAC 8. tűjével- Nagyon hasznos a teszteléshez.
  • Csatlakoztattam az Audinóhoz szalagkábellel és egy 10 utas IDC csatlakozóval.
  • Az Uno -n a kapcsolatok egyenes vonalban vannak - előfordulhat, hogy a 8 bemeneti csatlakozás egyetlen egyenesben történő elrendezése lehetővé teszi az Arduino -hoz való kapcsolódást egy megvásárolt, kész 8 -as csatlakozóval,

Ha kész, ellenőrizze a forrasztást, és ellenőrizze a rézpályák közötti réseket.

Egy 36 tpi -s junior hack fűrészlapot nagyon hasznosnak találok a törmelék eltávolításához. Eltávolítom a penge rögzítőcsapjait, és a penge hegyét a csúszkába csúsztatom- Nyilvánvaló, hogy a penge nincs a keretben.

6. lépés: A DAC tesztelése

A DAC tesztelése
A DAC tesztelése

Hagyja kikapcsolva a kapcsolatot az áramkör és az Arduino között.

Állítsa az áramkör hangerőszabályzóját félúton.

Kapcsolja be a 9 V egyenáramot az új áramkörbe.

Ellenőrizze, hogy az áramkör rendben van-e, nem vállalok felelősséget az áramkörért!

Kikapcsolni

Csatlakoztassa az áramkört az Arduino -hoz.

A Mega-n használja a 22-29. (PORTA) Ne tévessze össze a fenti két 5 V -os csatlakozót!

Az Uno-n használja a 0-7. Ez a PORTD

Csatlakoztassa a tápegység 0V -ját az Arduino 0V -hoz.

Kapcsold be.

Nyissa meg ezt a tesztprogramot DAC_TEST

Az UNO esetében cserélje ki a PORTA -ra vonatkozó összes hivatkozást a PORTD -ra

Cserélje ki a DDRA-t DDRD-re- ez az utasítás mind a 8 sort egy mozdulattal állítja be. Ez az adatirány -regiszter.

Állítsa a soros monitort 115200 -ra.

Csatlakoztasson egy voltmérőt a DAC kimenet és az OV közé

A program a kimenetet 255 - minden vonal bekapcsolva - maximális feszültségre állítja.

Kimenet 128- a maximális feszültség fele.

Kimenet 0- nulla feszültség (vagy valószínűleg közel nulla).

Ezután bitrátán lép: 1, 2, 4, 8, 16, 32, 64, 128

A feszültségnek folyamatosan növekednie kell.

Ha a feszültség visszaesik, miközben a szám növekszik, akkor valószínűleg két összekapcsolt vezeték fordítva van.

Azt is hallani kell, hogy a hangszóró halkan kattan, ahogy változik a feszültség

7. lépés: Olvassa el a Wav fejlécet

A Wav fejléc olvasása
A Wav fejléc olvasása

A Wav fájlok meghatározott gyakorisággal és adatmérettel kerülnek mentésre.

Ezeket az információkat egy 44 bájtos fejléc tartalmazza a wav fájl elején.

Bár egyes szoftverek kiterjesztik a fejlécet (35 bájt után), ami megnehezíti az adatméret helyének megtalálását.

A fejléc olvasásához puffert hozunk létre, és lemásoljuk a fájl elejét.

A frekvencia 4 bájtban van tárolva, kezdve 24 bájtból a fájlba.

// olvasási gyakoriság a wav fájl fejlécében

byte headbuf [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = headbuf [27];

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

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

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

Serial.print (F ("Fájlfrekvencia"));

Serial.print (retval);

A legjobb módja annak, hogy megtalálja az adatméretre vonatkozó információkat, ha a fejlécben rákeres az "adatok" szóra.

Ezután bontsa ki az azt követő 4 bájtot, amelyek a hosszú értéket alkotják

előjel nélküli hosszú retval;

int mypos = 40;

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

if (headbuf == 'd') {

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

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

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

// végre megvan

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];

Rendben van az adatok hossza és gyakorisága!

Az audio adatok az adathossz értékét alkotó 4 bájt után következnek.

8. lépés: megszakítás, megszakítás…

Megszakítani, megszakítani…
Megszakítani, megszakítani…

A frekvenciainformációk felhasználásával szoftvermegszakítást hozunk létre a kívánt frekvencián vagy annak közelében.

A megszakítást nem mindig lehet pontosan beállítani, de elegendő. A fájlból kiolvasott gyakoriság átadódik a setintrupt alprogramnak.

void setintrupt (float freq) {float bitval = 8; // 8 a 8 és 0 bites időzítőknél, 1024 az 1 bájtos időzítőknél

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

// A setokroa értéke -1 kivonását igényli. Azonban 0,5 kört hozzáadva a 0,5 -öshöz

// Az időzítő felbontása korlátozott

// Végső soron a bitval nagysága határozza meg

cli (); // letiltja a megszakításokat // beállítja a timer2 megszakítást

TCCR2A = 0; // állítsa a teljes TCCR2A regisztert 0 -ra

TCCR2B = 0; // ugyanez a TCCR2B esetében

TCNT2 = 0; // inicializálja a számláló értékét 0 -ra

// állítsa össze az egyezési regisztert a gyakorisági (hz) lépésekhez

OCR2A = setokroa; // = (16*10^6) / (gyakoriság*8) - 1 (<256 kell, hogy legyen)

// kapcsolja be a CTC módot

TCCR2A | = (1 << WGM21); // CS21 bit beállítása 8 előskálázóhoz

TCCR2B | = (1 << CS21); // időzítő összehasonlítás megszakítás engedélyezése

// TIMSK2 | = (1 << OCIE2A); // ez működik, ahogy a következő sor is

sbi (TIMSK2, OCIE2A); // engedélyezze a megszakítást a 2. időzítőn

sei (); // engedélyezze a megszakításokat

Az igényes olvasók észlelték a sbi -t (TIMSK2, OCIE2A)

Beállítottam néhány (interneten szerzett) funkciót a regiszterbitek beállításához és törléséhez:

// Megadja a regiszter bitek törlését#ifndef cbi

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

#endif

// Megadja a regiszter bitek beállítását

#ifndef sbi

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

#endif

Ezek a funkciók megkönnyítik a megszakítás beállítását vagy törlését.

Tehát a megszakítás fut, mit tehetünk?

9. lépés: Megszakítások és kettős pufferelés

Megszakítások és kettős pufferelés
Megszakítások és kettős pufferelés
Megszakítások és kettős pufferelés
Megszakítások és kettős pufferelés

22 khz -en 0,045 ms -onként egy bájt audio adat kerül kiadásra

512 bájt (a puffer mérete) 2,08 ms alatt olvasható.

Tehát a puffer nem olvasható ki az SDCard -ról egy írási ciklus során.

Azonban 512 bájt van írva a portra 23,22 ms -ban.

Tehát csak annyit kell tennünk, hogy minden puffer kiürítésekor új fájlt olvasunk be, és van elég időnk az adatok beszerzésére, mielőtt új adatblokkra lenne szükség … Feltételezve, hogy két puffert használunk, az egyiket kiürítjük, miközben kitöltünk egy másikat.

Ez kettős pufferelés.

A fájl olvasását az ismételt megszakítás lelassítja, de megtörténik.

Beállítottam két 512 bájtos puffert, bufa és bufb.

Ha a zászló adady igaz, akkor a portából olvasunk, különben a portb -ból

Amikor a puffer pozíció (bufcount) eléri a pufferméretet (BUF_SIZE 512), akkor a readit nevű zászlót igazra állítjuk.

A void loop rutin megkeresi ezt a zászlót, és elindítja a blokk olvasását:

if (readit) {if (! aready) {

// kezdeményezze az SDCard blokk olvasását bufába

tempfile.read (bufa, BUF_SIZE);

} más {

// indítsa el a bufb -be olvasott SDCard -blokkot

tempfile.read (bufb, BUF_SIZE);

}

readit = hamis;

}

Ha befejezte a rutin jelzőket readit = false.

A megszakítási rutinon belül ellenőriznünk kell, hogy a void ciklus befejeződött -e, ellenőrizve, hogy readit == false.

Ebben az esetben jelezzük, hogy újabb olvasásra van szükség, és a pufferek váltásához kapcsoljuk az aready zászlót.

Ha az SD-kártya még mindig olvas, vissza kell tekintenünk egy leolvasást (számláló--; bufcount--;), és kilépünk a megszakításból, hogy később újra megpróbálhassuk. (Az audio kimeneti jel kattintása azt jelzi, hogy ez megtörtént.)

Amikor minden adat olvasásra kerül, a megszakítás törlődik, a port újra a 128-as középfeszültség értékre áll, és az audio fájl bezárul.

A dac2.ino szkript első futtatása előtt állítsa a hangerőt 50%-ra. Ez túl hangos lesz, de jobb, mint 100%!

Ha a hangerőszabályzó fordítva működik, cserélje ki a vezetékeket a 10K potenciométer ellentétes végein.

Hadd tudjam meg, hogyan hangzik.

Ajánlott: