Obsah:

Prehrávanie zvukových zvukových súborov (WAV) s Arduino a DAC: 9 krokov
Prehrávanie zvukových zvukových súborov (WAV) s Arduino a DAC: 9 krokov

Video: Prehrávanie zvukových zvukových súborov (WAV) s Arduino a DAC: 9 krokov

Video: Prehrávanie zvukových zvukových súborov (WAV) s Arduino a DAC: 9 krokov
Video: Zoom H6 против Zoom H8 | Посмотрите это, прежде чем покупать их в 2023 году! 2024, November
Anonim
Prehrávanie zvukových zvukových súborov (WAV) s Arduino a DAC
Prehrávanie zvukových zvukových súborov (WAV) s Arduino a DAC
Prehrávanie zvukových zvukových súborov (WAV) s Arduino a DAC
Prehrávanie zvukových zvukových súborov (WAV) s Arduino a DAC
Prehrávanie zvukových zvukových súborov (WAV) s Arduino a DAC
Prehrávanie zvukových zvukových súborov (WAV) s Arduino a DAC

Prehrávajte zvuk vo formáte wav z karty Audino SD. Tento návod vám ukáže, ako je možné súbor wav na karte SdCard prehrať pomocou jednoduchého obvodu s reproduktorom.

Súbor wav musí byť 8 -bitový mono. Nemal som problém prehrať súbory 44 KHz.

Aj keď nejde o hi-fi, kvalita zvuku je veľmi uspokojivá.

Na výber súboru slúži sériový monitor. Súbory musia byť v priečinku s názvom adlog.

Tento návod vyplýva z predchádzajúceho projektu, kde som nahrávky wav uložil na kartu SdCard:

Obvod používa lacný 8 -bitový prevodník digitálneho signálu na analógový (DAC) a jednočipový zvukový zosilňovač.

Kľúčové sekcie na nastavenie prerušení boli prevzaté z vynikajúceho článku Amandy Ghassaei:

Krok 1: Požiadavky

Požiadavky
Požiadavky
Požiadavky
Požiadavky

Arduino- Používam Mega, neexistuje však dôvod, prečo by Uno nemalo fungovať.

Čítačka SdCard-program je nakonfigurovaný pre: MicroSD Breakout Board Regulované s logickou konverziou V2

Podrobnosti o nastavení karty SdCard nájdete v tomto návode:

DAC0832 LCN- vynikajúci 8-bitový prevodník digitálneho signálu na analógový- niekoľko libier.

Operačný zosilňovač LM386 N-1- lacný ako čipy

20 -cestná zásuvka na čip

8 -cestná zásuvka na čip

Napájanie 9 voltov- postačí batéria.

LM336 2,5 V referencia napätia

10uF kondenzátor * 3 (akékoľvek napätie viac ako 9V)

Odpor 10 ohmov

50nF kondenzátor- (Alebo niekde blízko-47nF, 56nf, 68nf- bude stačiť)

Kondenzátor 220uF

64 ohmový reproduktor

10K lineárny potenciometer

Kábel na prepojenie 8 dátových liniek medzi Arduinom a obvodom-

Na Uno je 8 spojov v rade, na Mega sú vo dvojiciach.

Na Mega som použil 10 -cestný plochý kábel s 10 -pólovým IDC konektorom. (2 vodiče sú náhradné)

Zásuvkové konektory pre výstup 0V, 9V a DAC

Doska z medeného pásu, spájka, drôt, rezačky atď

Krok 2: Špecifikácia

Špecifikácia
Špecifikácia

Sériovo nastavený na 115200 baudov.

Podpora pre dosku Hobbytronics MicroSD Breakout Board pomocou systému Mega je k dispozícii. Výber čipu a ostatné porty sa budú meniť medzi Mega a Uno.

Súbory Wav musia existovať v adresári s názvom adlog- Neváhajte ho pomenovať inak a znova usporiadajte potrebné kódovanie.

Súbor wav musí byť 8 -bitový mono. Testoval som až 44 kHz.

Sériový monitor zobrazuje súbory wav v priečinku adlog. Názvy súborov sa odosielajú z výstupného riadka monitora.

Veľkosť súboru je obmedzená iba veľkosťou karty SdCard.

Krok 3: Začíname

Začíname
Začíname

Pripojte čítačku kariet SD. Toto sú spojenia pre Mega.

0, 5V

CLK na pin 52

D0 až pin 50

D1 až pin 51

CS na pin 53

(Pripojenie portu Uno nájdete na webových stránkach dodávateľov)

V tejto fáze budete chcieť vyskúšať, či vaša karta funguje- použite skripty dodané dodávateľom.

Musíme urobiť malý obvod

Pošleme prúd zvukových bajtov z Arduina.

Tieto čísla sú medzi 0 a 255. Predstavujú napätie.

Ticho je 127-128.

255 je reproduktorový kužeľ tvrdý jedným spôsobom.

0 je reproduktorový kužeľ tvrdý iným spôsobom.

Zvuk sa teda zaznamenáva ako uložené čísla, ktoré vytvárajú rôzne napätia a vytvárajú pohyblivé reproduktorové kužele.

Čísla môžeme odoslať z 8 riadkov na Arduino súčasne pomocou „portu“.

Ak privedieme 8 riadkov do prevodníka digitálneho signálu na analógový, urobí to, čo hovorí na cíne a vytvorí analógové napätie, ktoré je úmerné digitálnemu číslu.

Všetko, čo musíme urobiť, je potom zapojiť napätie do malého operačného zosilňovača a potom do reproduktora.

Krok 4: Malý obvod

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

DAC0832 LCN

Je to vynikajúci a lacný 8 -bitový prevodník digitálneho signálu na analógový. (DAC)

Dá sa úplne ovládať pomocou radu riadkov na uchovávanie údajov a vzoriek údajov.

Alebo je možné nastaviť, aby to všetko robilo automaticky, v časti „Flow through operation“.

Citujem manuál:

Jednoduché uzemnenie CS, WR1, WR2 a XFER a viazanie ILE na vysokú úroveň umožňuje obom interným registrom sledovať použité digitálne vstupy (prietok) a priamo ovplyvniť analógový výstup DAC.

OK, to sú štyri pripojenia k čipu nastavené nízko a jedno nastavené na 9 V - jednoduché.

Nechceme, aby došlo k zápornému napätiu, takže manuál hovorí, že by sme mali použiť „režim prepínania napätia“a dodávajú diagram.

Všetko, čo musíme urobiť, je nahradiť malý zvukový zosilňovač namiesto toho, ktorý navrhujú.

Zvukový zosilňovač LM386-N

Manuál k zosilňovaču poskytuje diagram minimálnych súčastí- poskytuje zisk 20 (pre nás príliš veľa- ale má ovládanie hlasitosti).

Všetko, čo musíme urobiť, je pridať kondenzátor medzi DAC a zosilňovač, aby sme zosilňovali iba striedavé signály.

Musíme tiež pridať niekoľko kondenzátorov blízko napájacieho kolíka každého z našich čipov, inak budeme z nášho 9V napájania hučať.

Krok 5: Vyberte spájkovačku

Vydajte sa zo spájkovačky
Vydajte sa zo spájkovačky
Vydajte sa zo spájkovačky
Vydajte sa zo spájkovačky
Vydajte sa zo spájkovačky
Vydajte sa zo spájkovačky

Keďže obvod je jednoduchý, nemám v úmysle dávať účet úder za úder.

Tu sú niektoré rady:

  • Pripravte si kus dosky z medeného pásu najmenej 28 x 28 otvorov. (Áno, viem, že mozgoví chirurgovia to môžu zmenšiť)
  • Ak ho plánujete namontovať pomocou skrutiek, na začiatku ich povoľte!
  • Namontujte čipy na zásuvky. Čipy vkladajte iba vtedy, ak je všetko skontrolované.
  • Udržujte vstupné vodiče mimo výstupu.
  • Dbajte na správnu polaritu kondenzátorov.
  • Na obrázku je základný pohľad na referenčnú hodnotu napätia LM336. Nastavovacia noha sa nepoužíva a dá sa rezať.
  • Všimnite si priameho pripojenia na pin 8 DAC- Je to veľmi užitočné pri testovaní.
  • Pripojil som sa k Audinu plochým káblom a 10 -cestným konektorom IDC.
  • Na Uno sú pripojenia v priamke - môžete prísť na to, že usporiadanie 8 vstupných pripojení do jednej priamky vám umožní prepojiť sa s Arduino pomocou zakúpeného, pripraveného 8 -cestného konektora,

Keď je hotový- skontrolujte spájkovanie a skontrolujte medzery medzi medenými pásmi.

Považujem pílový list na píly 36 tpi junior za veľmi užitočný na odstraňovanie nečistôt. Odstránim polohovacie kolíky čepele a zasuniem hrot čepele do koľaje- Čepeľ zrejme nie je v ráme.

Krok 6: Testovanie DAC

Testovanie DAC
Testovanie DAC

Nechajte spojenie medzi obvodom a Arduinom vypnuté.

Nastavte ovládač hlasitosti na svojom obvode na polovicu.

Zapnite 9 V jednosmerný prúd do nového obvodu.

Skontrolujte, či je obvod v poriadku- nemôžem prijať žiadnu zodpovednosť za váš obvod!

Vypnúť

Pripojte svoj obvod k Arduinu.

Na Mega použite piny 22-29. (PORTA) Nezamieňajte dva vyššie uvedené 5V kolíky!

Na Uno použite piny 0-7. Toto je PORTD

Pripojte 0 V vášho zdroja k 0 V na Arduine.

Zapnúť

Otvorte tento testovací program DAC_TEST

V prípade UNO nahraďte všetky odkazy na PORTA na PORTD

Nahradiť DDRA za DDRD- táto inštrukcia nastaví výstup všetkých 8 riadkov naraz. Toto je register smeru údajov.

Nastavte sériový monitor na 115200.

Pripojte voltmetr medzi výstup DAC a OV

Program nastaví výstup na 255 - všetky riadky zapnuté - maximálne napätie.

Výstup 128- polovičné maximálne napätie.

Výstup 0- nulové napätie (Alebo pravdepodobne takmer nulové).

Potom bude postupovať bitovo: 1, 2, 4, 8, 16, 32, 64, 128

Napätie by sa malo plynule zvyšovať.

Ak napätie klesne späť a číslo sa zvýši, pravdepodobne budete mať prepojené dva prepojovacie vodiče.

Pri zmene napätia by ste mali počuť aj tiché cvakanie reproduktora

Krok 7: Prečítajte si hlavičku Wav

Čítanie hlavičky Wav
Čítanie hlavičky Wav

Súbory WAV sa ukladajú so zadanou frekvenciou a veľkosťou údajov.

Tieto informácie sú obsiahnuté v 44 -bajtovej hlavičke na začiatku súboru wav.

Aj keď niektorý softvér rozširuje hlavičku (po bajte 35), sťažuje lokalizáciu umiestnenia veľkosti údajov.

Na prečítanie hlavičky vytvoríme vyrovnávaciu pamäť a skopírujeme začiatok súboru.

Frekvencia je uložená v 4 bajtoch od 24 bajtov do súboru.

// frekvencia čítania špecifikovaná v hlavičke súboru wav

byte headbuf [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = headbuf [27];

retval = (retval << 8) | opierka hlavy [26];

retval = (retval << 8) | opierka hlavy [25];

retval = (retval << 8) | opierka hlavy [24];

Serial.print (F („Frekvencia súborov“));

Serial.print (retval);

Najlepším spôsobom, ako nájsť informácie o veľkosti údajov, je vyhľadať slovo „údaje“v hlavičke.

Potom extrahujte 4 bajty po ňom, ktoré tvoria dlhú hodnotu

nepodpísaný dlhý návrat;

int mypos = 40;

pre (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čne to máme

mypos = i+4;

i = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = headbuf [mypos+3];

retval = (retval << 8) | opierka hlavy [mypos+2];

retval = (retval << 8) | opierka hlavy [mypos+1];

retval = (retval << 8) | opierka hlavy [mypos];

Dobre, máme dĺžku a frekvenciu údajov!

Zvukové údaje nasledujú po 4 bajtoch, ktoré tvoria hodnotu dĺžky údajov.

Krok 8: Prerušiť, prerušiť…

Prerušiť, prerušiť …
Prerušiť, prerušiť …

Informácie o frekvencii používame na vytvorenie prerušenia softvéru na požadovanej frekvencii alebo v jej blízkosti.

Prerušenie nie je možné vždy nastaviť presne, ale je dostatočné. Frekvencia načítaná zo súboru je odoslaná do podprogramu setintrupt.

void setintrupt (float freq) {float bitval = 8; // 8 pre 8 bitové časovače 0 a 2, 1024 pre časovač 1 bajt

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

// Hodnota setocroa vyžaduje odčítanie -1. Sčítanie 0,5 náboja na najbližších 0,5

// Rozlíšenie časovača je obmedzené

// Nakoniec určené veľkosťou bitvalu

cli (); // vypnutie prerušenia // nastavenie prerušenia timer2

TCCR2A = 0; // nastavenie celého registra TCCR2A na 0

TCCR2B = 0; // to isté pre TCCR2B

TCNT2 = 0; // inicializácia hodnoty počítadla na 0

// nastavenie porovnania registra zhody pre prírastky frekvencie (hz)

OCR2A = setocroa; // = (16*10^6) / (frekvencia*8) - 1 (musí byť <256)

// zapnite režim CTC

TCCR2A | = (1 << WGM21); // Nastavte bit CS21 pre 8 predzosilňovačov

TCCR2B | = (1 << CS21); // povolenie prerušenia porovnávania časovača

// TIMSK2 | = (1 << OCIE2A); // to funguje, rovnako ako nasledujúci riadok

sbi (TIMSK2, OCIE2A); // povolenie prerušenia na časovači 2

sei (); // povoliť prerušenia

Nároční čitatelia budú mať škvrnitú sbi (TIMSK2, OCIE2A)

Nastavil som niekoľko (z internetu získaných) funkcií na nastavenie a vymazanie registrových bitov:

// Definuje vymazanie registrových bitov#ifndef cbi

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

#koniec Ak

// Definuje pre nastavenie registrových bitov

#ifndef sbi

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

#koniec Ak

Tieto funkcie poskytujú jednoduché volanie na nastavenie alebo zrušenie prerušenia.

Prerušenie teda beží, čo môžeme urobiť?

Krok 9: Prerušenia a dvojité ukladanie do vyrovnávacej pamäte

Prerušenia a dvojité ukladanie do vyrovnávacej pamäte
Prerušenia a dvojité ukladanie do vyrovnávacej pamäte
Prerušenia a dvojité ukladanie do vyrovnávacej pamäte
Prerušenia a dvojité ukladanie do vyrovnávacej pamäte

Pri 22 Khz je každých 0,045 ms vyvedený bajt zvukových údajov

512 bajtov (veľkosť vyrovnávacej pamäte) sa odčíta za 2,08 ms.

Vyrovnávaciu pamäť nie je možné načítať z karty SDCard v jednom cykle zápisu.

Na port je však zapísaných 512 bajtov za 23,22 ms.

Všetko, čo musíme urobiť, je nastaviť nový prečítaný súbor vždy, keď sa vyrovnávacia pamäť vyprázdni, a budeme mať dostatok času na získanie údajov skôr, ako bude potrebný nový dátový blok … Za predpokladu, že používame dve vyrovnávacie pamäte, pričom jednu vyprázdňujeme, keď plníme inú.

Toto je dvojité ukladanie do vyrovnávacej pamäte.

Čítanie súboru sa spomalí opakovaným prerušením, ale dokončí sa.

Nastavil som dva 512 bajtové vyrovnávacie pamäte nazývané bufa a bufb.

Ak je vlajka aready pravdivá, čítame z portu, inak čítame z portu

Keď pozícia vyrovnávacej pamäte (bufcount) dosiahne veľkosť vyrovnávacej pamäte (BUF_SIZE 512), nastavíme príznak s názvom readit na true.

Rutina prázdnej slučky vyhľadá tento príznak a spustí čítanie bloku:

if (readit) {if (! aready) {

// spustenie čítania bloku SDCard na bufa

tempfile.read (bufa, BUF_SIZE);

} else {

// spustenie čítania bloku SDCard na bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = false;

}

Po dokončení rutinné príznaky readit = false.

V rámci rutiny prerušenia musíme skontrolovať, či sa prázdna slučka skončila, a skontrolovať, či je readit == false.

V takom prípade signalizujeme, že je potrebné ďalšie čítanie, a prepnutím medzipamäte prepíname vyrovnávacie pamäte.

Ak karta SD stále číta, musíme sledovať jedno čítanie (počítadlo--; bufcount--;) a ukončiť prerušenie, aby sme to mohli skúsiť znova neskôr. (Kliknutia na zvukový výstupný signál naznačujú, že k tomu došlo.)

Keď sa prečítajú všetky údaje, prerušenie sa zruší, port sa znova nastaví na hodnotu stredného napätia 128 a zvukový súbor sa zatvorí.

Pred prvým spustením skriptu dac2.ino nastavte hlasitosť na 50%. Bude to príliš hlasné, ale je to lepšie ako 100%!

Ak ovládanie hlasitosti funguje opačne, vymeňte vodiče na opačných koncoch 10K potenciometra.

Dajte mi vedieť, ako to znie.

Odporúča: