Tartalomjegyzék:
- 1. lépés: Követelmények
- 2. lépés: A specifikációk
- 3. lépés: Első lépések
- 4. lépés: A kis áramkör
- 5. lépés: Vegye ki a forrasztópáka
- 6. lépés: A DAC tesztelése
- 7. lépés: Olvassa el a Wav fejlécet
- 8. lépés: megszakítás, megszakítás…
- 9. lépés: Megszakítások és kettős pufferelés
Videó: Audio hangfájlok lejátszása (Wav) Arduino és DAC segítségével: 9 lépés
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:43
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
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
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
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 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
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
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 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…
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
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:
Videó lejátszása az ESP32 segítségével: 10 lépés (képekkel)
Videó lejátszása ESP32 -vel: Ez az utasítás bemutat valamit a videó és audió lejátszásáról az ESP32 segítségével
Beszélő Arduino - MP3 lejátszása Arduino -val modul nélkül - MP3 fájl lejátszása Arduino -ból PCM használatával: 6 lépés
Beszélő Arduino | MP3 lejátszása Arduino -val modul nélkül | Mp3 fájl lejátszása az Arduino -ból PCM használatával: Ebben az utasításban megtanuljuk, hogyan kell lejátszani egy mp3 fájlt arduino -val audio modul használata nélkül, itt a PCM könyvtárat fogjuk használni az Arduino számára, amely 16 bites 8 kHz -es PCM -et játszik le
Zeneszámok lejátszása Arduino segítségével az ADC - PWM használatával a Flyback Transformeren vagy hangszórón: 4 lépés
Zeneszámok lejátszása Arduino -val az ADC használatával a PWM -hez a Flyback Transformeren vagy hangszórón: Helló srácok, Ez a második része a másik tanulhatónak (ez nagyon nehéz volt). Alapvetően ebben a projektben az ADC -t és az időzítőt használtam az Arduino -n konvertálja az audiojelet PWM jellé. Ez sokkal könnyebb, mint az előző utasításom
Zeneszámok lejátszása (MP3) Arduino segítségével PWM használatával hangszórón vagy Flyback Transformeren: 6 lépés (képekkel)
Zeneszámok lejátszása (MP3) Arduino segítségével PWM használata hangszórón vagy Flyback Transformeren: Hello Srácok, Ez az első tanítható, remélem tetszeni fog! Alapvetően ebben a projektben az Arduino és a laptopom közötti soros kommunikációt használtam, hogy zenei adatokat továbbítsak a laptopomról az Arduino -hoz. És az Arduino TIMERS t használatával
Zene lejátszása Arduino segítségével!: 5 lépés (képekkel)
Zene lejátszása Arduino -val!: Ebben az oktatóanyagban megmutatom, hogyan játszok zenét egy Arduino UNO és egy SD kártya modul segítségével. Az SPI kommunikációt fogjuk használni. Kezdjük