Obsah:
- Krok 1: Požadavky
- Krok 2: Specifikace
- Krok 3: Začínáme
- Krok 4: Malý obvod
- Krok 5: Vyjměte páječku
- Krok 6: Testování DAC
- Krok 7: Čtení záhlaví Wav
- Krok 8: Přerušení, Přerušení…
- Krok 9: Přerušení a dvojité ukládání do vyrovnávací paměti
Video: Přehrávání zvukových zvukových souborů (Wav) s Arduinem a DAC: 9 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:23
Přehrávejte zvuk wav ze své karty Audino SD. Tento Instructable vám ukáže, jak lze soubor wav na vaší kartě SdCard přehrát jednoduchým obvodem do reproduktoru.
Soubor wav musí být 8bitový mono. Neměl jsem problém s přehráváním 44kHz souborů.
I když to není hi-fidelity, kvalita zvuku je velmi uspokojivá.
K výběru souboru slouží sériový monitor. Soubory musí být ve složce s názvem adlog.
Tento návod vyplývá z dřívějšího projektu, kde jsem ukládal wav nahrávky na kartu SdCard:
Obvod využívá levný 8bitový převodník digitálního signálu na analogový (DAC) a jednočipový zvukový zesilovač.
Klíčové části pro nastavení přerušení byly převzaty z vynikajícího článku Amandy Ghassaei:
Krok 1: Požadavky
Arduino- používám Mega, ale není důvod, proč by Uno nemělo fungovat.
Čtečka SdCard-program je nakonfigurován pro: MicroSD Breakout Board Regulované s logickou konverzí V2
Podrobnosti o nastavení karty SdCard najdete v tomto návodu:
DAC0832 LCN- vynikající 8bitový převodník digitálního signálu na analogový- několik liber.
Operační zesilovač LM386 N-1- levný jako čipy
20cestná zásuvka na čip
8cestná zásuvka na čip
Napájení 9 voltů- baterie bude stačit.
LM336 2,5 V referenční napětí
10uF kondenzátor * 3 (jakékoli napětí vyšší než 9V)
10 ohmový odpor
50nF kondenzátor- (Nebo někde blízko-47nF, 56nf, 68nf- bude stačit)
Kondenzátor 220uF
64 ohmový reproduktor
10K lineární potenciometr
Kabel pro propojení 8 datových linek mezi Arduinem a obvodem-
Na Uno je 8 spojení v řadě, na Mega jsou ve dvojicích.
Na Mega jsem použil 10pásmový plochý kabel s 10cestným IDC konektorem. (2 dráty jsou náhradní)
Zásuvkové konektory pro výstup 0V, 9V a DAC
Deska z měděného pásu, pájka, drát, řezačky atd
Krok 2: Specifikace
Sériově nastaveno na 115200 baudů.
Podpora Hobbytronics MicroSD Breakout Board pomocí Mega je k dispozici. Výběr čipu a další porty se změní mezi Mega a Uno.
Soubory Wav musí existovat v adresáři s názvem adlog- Neváhejte jej pojmenovat jinak a znovu uspořádat potřebné kódování.
Soubor wav musí být 8bitový mono. Testoval jsem až 44KHz.
Sériový monitor zobrazuje soubory wav ve složce adlog. Názvy souborů jsou odesílány z výstupního řádku monitoru.
Velikost souboru je omezena pouze velikostí karty SdCard.
Krok 3: Začínáme
Připojte čtečku karet SD. Toto jsou spojení pro Mega.
0, 5V
CLK na pin 52
D0 na pin 50
D1 na pin 51
CS na pin 53
(Připojení k portu Uno najdete na webu dodavatele)
V této fázi budete chtít vyzkoušet, zda vaše karta funguje- použijte skripty dodané prodejcem.
Musíme udělat malý obvod
Z Arduina pošleme proud zvukových bytů.
Tato čísla jsou mezi 0 a 255. Představují napětí.
Ticho je 127-128.
255 je reproduktorový kužel tvrdý jedním způsobem.
0 je reproduktorový kužel tvrdý jiným způsobem.
Zvuk je tedy zaznamenáván jako uložená čísla, která vytvářejí různá napětí a vytvářejí pohyblivé reproduktorové kužely.
Můžeme poslat čísla z 8 řádků na Arduinu současně pomocí „portu“.
Pokud přivedeme 8 řádků do převodníku digitálního signálu na analogový, udělá to, co říká na cínu, a vytvoří analogové napětí, které je úměrné digitálnímu číslu.
Vše, co musíme udělat, je sbalit napětí do malého operačního zesilovače a poté do reproduktoru.
Krok 4: Malý obvod
DAC0832 LCN
Jedná se o vynikající, levný 8bitový převodník digitálního signálu na analogový. (DAC)
Lze jej plně ovládat pomocí řady řádků pro uchovávání dat a vzorků dat.
Nebo lze nastavit, aby to vše dělalo automaticky, v „Průtoku operací“.
Citovat manuál:
Jednoduše uzemněte CS, WR1, WR2 a XFER a spojte ILE vysoko, aby oba interní registry sledovaly použité digitální vstupy (průtok) a přímo ovlivňovaly analogový výstup DAC.
Dobře, to jsou čtyři připojení k čipu nastavená na nízkou úroveň a jedno na 9V - snadné.
Nechceme, aby docházelo k záporným napětím, takže manuál říká, že bychom měli použít „režim přepínání napětí“a dodávají diagram.
Jediné, co musíme udělat, je nahradit malý zvukový zesilovač místo toho, který navrhují.
Zvukový zesilovač LM386-N
Manuál zesilovače poskytuje diagram minimálních částí- poskytuje zisk 20 (příliš mnoho pro nás- ale má ovládání hlasitosti).
Jediné, co musíme udělat, je přidat mezi DAC a zesilovač kondenzátor, abychom zesilovali pouze střídavé signály.
Musíme také přidat několik kondenzátorů blízko napájecího kolíku každého z našich čipů, jinak budeme z našeho 9V napájení hučet.
Krok 5: Vyjměte páječku
Vzhledem k tomu, že obvod je jednoduchý, nemám v úmyslu dávat účet ránu po úderu.
Zde jsou některé rady:
- Připravte si kus desky z měděného pásu nejméně 28 x 28 otvorů. (Ano, vím, že mozkoví chirurgové to mohou zmenšit)
- Pokud jej hodláte namontovat pomocí šroubů, počítejte s nimi hned na začátku!
- Namontujte čipy na zásuvky. Čipy vkládejte, až když je vše zkontrolováno.
- Udržujte vstupní vodiče mimo výstup.
- Dbejte na správnou polaritu kondenzátorů.
- Na obrázku je základní pohled na referenční napětí LM336. Nastavovací noha se nepoužívá a lze ji řezat.
- Všimněte si přímého připojení na pin 8 DAC- Je to velmi užitečné pro testování.
- Připojil jsem se k Audinu plochým kabelem a 10cestným konektorem IDC.
- Na Uno jsou připojení v přímé linii - možná zjistíte, že uspořádání 8 vstupních připojení do jedné přímé linky vám umožní propojit se zařízením Arduino pomocí zakoupeného, připraveného 8cestného konektoru,
Když je hotovo- zkontrolujte pájení a zkontrolujte mezery mezi měděnými pásy.
Považuji pilový kotouč o rozměrech 36 tpi junior za velmi užitečný pro úklid nečistot. Odstraním polohovací čepy čepele a zasunu špičku čepele do dráhy- Čepel zjevně není v rámu.
Krok 6: Testování DAC
Nechte spojení mezi obvodem a Arduinem vypnuté.
Nastavte ovladač hlasitosti na vašem obvodu do poloviny.
Zapněte 9V DC napájení vašeho nového obvodu.
Zkontrolujte, zda je obvod v pořádku- nemohu přijmout žádnou odpovědnost za váš obvod!
Vypnout
Připojte svůj obvod k Arduinu.
Na Mega použijte piny 22-29. (PORTA) Nepleťte si dva výše uvedené 5V piny!
Na Uno použijte piny 0-7. Toto je PORTD
Připojte 0V vašeho napájecího zdroje k 0V na Arduinu.
Zapnout
Otevřete tento testovací program DAC_TEST
U UNO nahraďte všechny odkazy na PORTA až PORTD
Nahradit DDRA DDRD- tato instrukce nastaví výstup všech 8 řádků najednou. Toto je registr směru dat.
Nastavte svůj sériový monitor na 115200.
Připojte voltmetr mezi výstup DAC a OV
Program nastaví výstup na 255 - všechny řádky zapnuty - maximální napětí.
Výstup 128- poloviční maximální napětí.
Výstup 0- nulové napětí (nebo pravděpodobně téměř nulové).
Poté bude krokovat bitově: 1, 2, 4, 8, 16, 32, 64, 128
Napětí by se mělo plynule zvyšovat.
Pokud napětí klesne zpět, zatímco se počet zvyšuje, pravděpodobně máte dva propojovací vodiče obrácené.
Při změně napětí byste měli také slyšet tiché cvaknutí reproduktoru
Krok 7: Čtení záhlaví Wav
Soubory WAV se ukládají se zadanou frekvencí a velikostí dat.
Tyto informace jsou obsaženy v záhlaví 44 bajtů na začátku souboru wav.
Ačkoli některý software rozšiřuje záhlaví (po bajtu 35), je obtížnější lokalizovat umístění velikosti dat.
Chcete -li přečíst záhlaví, vytvoříme vyrovnávací paměť a zkopírujeme začátek souboru.
Frekvence je uložena ve 4 bajtech počínaje 24 bajty do souboru.
// četnost čtení specifikovaná v záhlaví souboru wav
byte headbuf [60]
tempfile.seek (0);
tempfile.read (headbuf, 60);
retval = headbuf [27];
retval = (retval << 8) | hlavice [26];
retval = (retval << 8) | hlavice [25];
retval = (retval << 8) | hlavice [24];
Serial.print (F („Frekvence souborů“));
Serial.print (retval);
Nejlepší způsob, jak najít informace o velikosti dat, je vyhledat v záhlaví slovo „data“.
Poté extrahujte 4 bajty, které jej následují, které tvoří dlouhou hodnotu
nepodepsaný dlouhý návrat;
int mypos = 40;
pro (int i = 36; i <60; i ++) {
if (headbuf == 'd') {
if (headbuf [i+1] == 'a') {
if (headbuf [i+2] == 't') {
if (headbuf [i+3] == 'a') {
// konečně to máme
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];
Dobře, máme délku a frekvenci dat!
Zvuková data sledují 4 bajty, které tvoří hodnotu délky dat.
Krok 8: Přerušení, Přerušení…
Informace o frekvenci používáme k vytvoření softwarového přerušení na požadované frekvenci nebo v její blízkosti.
Přerušení nelze vždy přesně nastavit, ale je dostatečné. Četnost načtená ze souboru je předána podprogramu setintrupt.
void setintrupt (float freq) {float bitval = 8; // 8 pro 8bitové časovače 0 a 2, 1024 pro časovač 1 byte
setocroa = (16000000/(freq*bitval)) - 0,5;
// Hodnota setocroa vyžaduje odečtení -1. Přidání 0,5 kola na nejbližší 0,5
// Rozlišení časovače je omezené
// Nakonec určeno velikostí bitvalu
cli (); // zakázat přerušení // nastavit časovač2 přerušení
TCCR2A = 0; // nastavení celého registru TCCR2A na 0
TCCR2B = 0; // totéž pro TCCR2B
TCNT2 = 0; // inicializace hodnoty čítače na 0
// nastavení porovnat registr shody pro přírůstky frekvence (hz)
OCR2A = setocroa; // = (16*10^6) / (frekvence*8) - 1 (musí být <256)
// zapněte režim CTC
TCCR2A | = (1 << WGM21); // Nastavit bit CS21 pro 8 předzesilovačů
TCCR2B | = (1 << CS21); // povolit přerušení porovnání časovače
// TIMSK2 | = (1 << OCIE2A); // to funguje, stejně jako následující řádek
sbi (TIMSK2, OCIE2A); // povolit přerušení na časovači 2
sei (); // povolit přerušení
Nároční čtenáři si všimnou sbi (TIMSK2, OCIE2A)
Nastavil jsem několik funkcí (získaných z internetu) pro nastavení a vymazání bitů registru:
// Definuje pro vymazání bitů registru#ifndef cbi
#define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))
#endif
// Definuje pro nastavení bitů registru
#ifndef sbi
#define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))
#endif
Tyto funkce poskytují snadné volání pro nastavení nebo zrušení přerušení.
Takže přerušení běží, co můžeme udělat?
Krok 9: Přerušení a dvojité ukládání do vyrovnávací paměti
Při 22 Khz je každých 0,045 ms vyveden bajt zvukových dat
512 bajtů (velikost vyrovnávací paměti) je načteno za 2,08 ms.
Vyrovnávací paměť tedy nelze přečíst z karty SDCard v jednom cyklu zápisu.
Na port je však zapsáno 512 bajtů za 23,22 ms.
Jediné, co musíme udělat, je nastavit nový soubor načtený pokaždé, když se vyrovnávací paměť vyprázdní, a máme dostatek času na získání dat, než bude vyžadován nový datový blok … Za předpokladu, že použijeme dvě vyrovnávací paměti, přičemž jednu vyprázdníme, když naplníme další.
Toto je dvojité ukládání do vyrovnávací paměti.
Čtení souboru se zpomalí opakovaným přerušením, ale bude to hotové.
Nastavil jsem dvě vyrovnávací paměti 512 bajtů nazývané bufa a bufb.
Pokud je flag aready pravdivý, čteme z porta, jinak čteme z portb
Když pozice bufferu (bufcount) dosáhne velikosti bufferu (BUF_SIZE 512), nastavíme příznak s názvem readit na true.
Rutina void loop hledá tento příznak a spustí čtení bloku:
if (readit) {if (! aready) {
// inicializace čtení bloku SDCard na bufa
tempfile.read (bufa, BUF_SIZE);
} else {
// inicializace čtení bloku SDCard do bufb
tempfile.read (bufb, BUF_SIZE);
}
readit = false;
}
Po dokončení rutinní příznaky readit = false.
V rámci rutiny přerušení musíme zkontrolovat, zda byla prázdná smyčka dokončena, kontrolou readit == false.
V tomto případě signalizujeme, že je vyžadováno další čtení, a přepnutím příznaku aready přepnete vyrovnávací paměti.
Pokud karta SD stále čte, musíme zpětně sledovat jedno čtení (čítač--; bufcount--;) a ukončit přerušení a zkusit to znovu později. (Kliknutí na zvukový výstupní signál naznačuje, že k tomu došlo.)
Když jsou načtena všechna data, přerušení se zruší, port se znovu nastaví na hodnotu středního napětí 128 a zvukový soubor se zavře.
Před prvním spuštěním skriptu dac2.ino nastavte hlasitost na 50%. Bude to příliš hlasité, ale je to lepší než 100%!
Pokud vaše ovládání hlasitosti funguje obráceně, vyměňte vodiče na opačných koncích 10K potenciometru.
Dejte mi vědět, jak to zní.
Doporučuje:
Reproduktor nálady- výkonný reproduktor pro přehrávání náladové hudby na základě okolní teploty: 9 kroků
Mood Speaker- výkonný reproduktor pro přehrávání náladové hudby na základě okolní teploty: Ahoj! Pro svůj školní projekt na MCT Howest Kortrijk jsem vyrobil reproduktor Mood Speaker, který je chytrým reproduktorovým zařízením Bluetooth s různými senzory, LCD a WS2812b ledstrip v ceně. Reproduktor přehrává hudbu na pozadí podle teploty, ale může
Jak vyrobit stereofonní rádio Ford Audiophile pro přehrávání souborů MP3 .: 7 kroků
Jak vytvořit stereofonní rádio Ford Audiophile pro přehrávání souborů MP3: Tento návod vám poskytne několik důležitých podrobností o tom, jak splnit požadavky na kompatibilitu MP3 CD-R u Ford Audiophile (a pravděpodobně Mach 300, Shaker 500 a Shaker 1000 ) tovární stereo, takže můžete vypalovat a užívat si soubory MP3 na disku CD
Použití automobilového sterea k přehrávání MP3 na starším domácím stereu: 7 kroků
Použití automobilového sterea k přehrávání MP3 na starším domácím stereu: Přehrávání souborů mp3 na domácím stereu Za poslední dvě desetiletí jsem stáhl nebo zkopíroval zhruba 5 000 klasických rockových melodií a potřeboval jsem jednoduchý způsob přehrávání digitálních hudebních souborů na starším domácím stereu. Mám připojený počítač domácího kina (HTC)
Přehrávání zvuku MP3 zeď FX: 12 kroků (s obrázky)
MP3 přehrávání zvuku FX Wall: Vytvořte zábavnou a interaktivní zvukovou zeď, která přehraje MP3 jednoduchým dotykem! Co děláte s prázdnou zdí? Mohl byste k tomu přidat nějaké pěkné obrázky? Nebo ji zakryjte barevnou pokojovou rostlinou. Dokonce jsme viděli, jak někteří lidé schovávají holé zdi za knihu
Mluvící Arduino - Přehrávání MP3 pomocí Arduina bez jakéhokoli modulu - Přehrávání souborů MP3 z Arduina pomocí PCM: 6 kroků
Mluvící Arduino | Přehrávání MP3 pomocí Arduina bez jakéhokoli modulu | Přehrávání souboru MP3 z Arduina pomocí PCM: V tomto návodu se naučíme, jak přehrávat soubor mp3 s arduino bez použití jakéhokoli zvukového modulu, zde použijeme knihovnu PCM pro Arduino, která přehrává 16 bitů PCM s frekvencí 8 kHZ, takže to zvládneme