Obsah:

Přehrávání zvukových zvukových souborů (Wav) s Arduinem a DAC: 9 kroků
Přehrávání zvukových zvukových souborů (Wav) s Arduinem a DAC: 9 kroků

Video: Přehrávání zvukových zvukových souborů (Wav) s Arduinem a DAC: 9 kroků

Video: Přehrávání zvukových zvukových souborů (Wav) s Arduinem a DAC: 9 kroků
Video: mbot - práce se zvukovým modulem ME audio player 2024, Listopad
Anonim
Přehrávání zvukových zvukových souborů (Wav) pomocí Arduina a DAC
Přehrávání zvukových zvukových souborů (Wav) pomocí Arduina a DAC
Přehrávání zvukových zvukových souborů (Wav) pomocí Arduina a DAC
Přehrávání zvukových zvukových souborů (Wav) pomocí Arduina a DAC
Přehrávání zvukových zvukových souborů (Wav) pomocí Arduina a DAC
Přehrávání zvukových zvukových souborů (Wav) pomocí Arduina a DAC

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

Požadavky
Požadavky
Požadavky
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

Specifikace
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

Začínáme
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

Malý okruh
Malý okruh
Malý okruh
Malý okruh
Malý okruh
Malý okruh
Malý okruh
Malý okruh

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

Získejte páječku
Získejte páječku
Získejte páječku
Získejte páječku
Získejte páječku
Získejte 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

Testování DAC
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

Čtení záhlaví Wav
Č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í…

Přerušit, Přerušit…
Přerušit, Přerušit…

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řerušení a dvojité ukládání do vyrovnávací paměti
Přerušení a dvojité ukládání do vyrovnávací paměti
Přerušení a dvojité ukládání do vyrovnávací paměti
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: