INHOUDSOPGAWE:
- Stap 1: Vereistes
- Stap 2: Die spesifikasies
- Stap 3: Aan die gang
- Stap 4: Die klein stroombaan
- Stap 5: Verwyder die soldeerbout
- Stap 6: Toets die DAC
- Stap 7: Lees die Wav -opskrif
- Stap 8: Onderbreek, onderbreek…
- Stap 9: Onderbrekings en dubbele buffering
Video: Speel klanklêers (WAV) met 'n Arduino en 'n DAC: 9 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:27
Speel wav -lêer Audio vanaf u Audino SD -kaart. Hierdie instruksie sal u wys hoe 'n wav -lêer op u SdCard deur 'n eenvoudige kring na 'n luidspreker gespeel kan word.
Die wav -lêer moet 8 bis mono wees. Ek het geen probleem gehad met die speel van 44 KHz lêers nie.
Alhoewel dit nie hi-fidelity is nie, is die geluidskwaliteit baie bevredigend.
Die seriële monitor word gebruik om die lêer te kies. Die lêers moet in 'n gids met die naam adlog wees.
Hierdie instruksie volg uit 'n vorige projek waar ek wav-opnames op die SdCard gestoor het:
Die kring gebruik 'n goedkoop 8 -bis digitale na analoog -omskakelaar (DAC) en 'n enkelspeler -klankversterker.
Belangrike gedeeltes vir die opstel van onderbrekings is geneem uit die uitstekende artikel deur Amanda Ghassaei:
Stap 1: Vereistes
Arduino- Ek gebruik die Mega, maar daar is geen rede waarom die Uno nie moet werk nie.
SdCard-leser-die program is opgestel vir: MicroSD Breakout Board gereguleer met Logic Conversion V2
Sien hierdie instruksies vir die opstelbesonderhede van SdCard:
DAC0832 LCN- 'n uitstekende 8 bis digitale na analoog converter- 'n paar pond.
LM386 N-1 Op amp- goedkoop as skyfies
20 -manier chip -aansluiting
8 -rigting chip -aansluiting
9 volt kragtoevoer- 'n battery werk.
LM336 2,5 V spanningsverwysing
10uF kondensator * 3 (enige spanning meer as 9V)
Weerstand van 10 ohm
50nF kapasitor- (Of iewers naby-47nF, 56nf, 68nf- sal doen)
220uF kondensator
64 Ohm luidspreker
10K lineêre potensiometer
Kabel om die 8 data lyne tussen die Arduino en die stroombaan te verbind
Op die Uno is die 8 verbindings in lyn, op die Mega is hulle in pare.
Op die Mega gebruik ek 'n 10 -weg lintkabel met 'n 10 -weg IDC -kop. (2 drade is oor)
Sokverbindings vir 0V, 9V en DAC out
Koperstrookbord, soldeer, draad, snyers, ens
Stap 2: Die spesifikasies
Reeks stel op 115200 baud.
Ondersteuning is beskikbaar vir die Hobbytronics MicroSD Breakout Board met behulp van 'n Mega. Die chip select en ander poorte sal verander tussen Mega en Uno.
Die Wav-lêers moet in 'n gids met die naam adlog bestaan- noem dit gerus iets anders en rangskik die nodige kodering.
Die wav -lêer moet 8 bis mono wees. Ek het tot 44KHz getoets.
Die seriële monitor vertoon die wav -lêers in die adlog -lêergids. Lêernaam word vanaf die monitor -uitvoerlyn gestuur.
Lêergrootte word slegs beperk deur SdCard -grootte.
Stap 3: Aan die gang
Koppel die SD -kaartleser. Dit is die verbindings vir die Mega.
0, 5V
CLK tot pen 52
D0 tot pen 50
D1 tot pen 51
CS tot pen 53
(Sien verskafferswebwerf vir Uno -poortverbinding)
U wil toets dat u kaart in hierdie stadium werk- gebruik die skrifte wat deur die verskaffer verskaf word.
Ons moet 'n klein stroombaan maak
Ons gaan 'n stroom klankgrepe vanaf die Arduino stuur.
Hierdie getalle is tussen 0 en 255. Dit verteenwoordig die spanning.
Stilte is 127-128.
255 is luidsprekerkegel hard op een manier.
0 is luidsprekerkegel hard, andersom.
So word klank opgeneem as gestoorde getalle, wat wisselende spanning veroorsaak, wat bewegende luidsprekerkeëls skep.
Ons kan die getalle gelyktydig uit 8 reëls op die Arduino stuur deur 'n "poort" te gebruik.
As ons die 8 lyne in 'n digitaal na analoog omskakelaar voer, doen dit wat dit op die blik sê en produseer 'n analoog spanning wat eweredig is aan die digitale getal.
Al wat ons hoef te doen, is om die spanning na 'n klein versterker en dan na 'n luidspreker af te pak.
Stap 4: Die klein stroombaan
Die DAC0832 LCN
Dit is 'n uitstekende, goedkoop 8 -bis digitale na analoog -omskakelaar. (DAC)
Dit kan ten volle beheer word met 'n verskeidenheid data -bewaarlyne, steekproeflyne.
Of dit kan opgestel word om dit alles outomaties te doen in "Deurstroom deurloop".
Om die handleiding aan te haal:
Deur CS, WR1, WR2 en XFER eenvoudig te grond en ILE hoog vas te bind, kan beide interne registers die toegepaste digitale insette (deurvloei) volg en die analoge DAC-uitset direk beïnvloed.
OK, dit is vier verbindings met die chip laag en een stel op 9V - maklik.
Ons wil geen negatiewe spannings hê nie, so die handleiding sê dat ons 'n spanningswisselingsmodus moet gebruik, en dit gee die diagram.
Al wat ons hoef te doen is om 'n klein klankversterker te vervang in plaas van die een wat hulle voorstel.
Die LM386-N Audio Amp
Die handleiding van die versterker bevat 'n minimum onderdiagram- 'n wins van 20 (heeltemal te veel vir ons, maar dit het 'n volumebeheer).
Al wat ons hoef te doen is om 'n kondensator tussen die DAC en die versterker by te voeg, sodat ons slegs die AC seine versterk.
Ons moet ook 'n paar kondensators by die toevoerpen van elkeen van ons skyfies voeg, anders kry ons neurie van ons 9V -toevoer.
Stap 5: Verwyder die soldeerbout
Aangesien die kring eenvoudig is, is ek nie van plan om 'n slag vir slag rekening te gee nie.
Hier is 'n paar wenke:
- Berei 'n stuk koperstrookbord van minstens 28 by 28 gate voor. (Ja, ek weet breinchirurge kan dit kleiner maak)
- As u van plan is om dit met skroewe te monteer, laat dit aan die begin toe!
- Monteer die skyfies op die voetstukke. Plaas die skyfies eers as alles nagegaan is.
- Hou die ingangskabel weg van die uitvoer.
- Let op die korrekte polariteit van die kapasitors.
- Verwys na die diagram vir die basisaansig van die LM336 spanningsverwysing. Die verstelbeen word nie gebruik nie en kan gesny word.
- Let op die direkte verbinding met pen 8 van die DAC- Dit is baie handig om te toets.
- Ek het met die lintkabel en 'n 10 -rigting IDC -aansluiting op die Audino gekoppel.
- Op die Uno is die verbindings in 'n reguit lyn - u kan vind dat deur die 8 invoerverbindings in 'n enkele reguit lyn te rangskik, u 'n skakel na die Arduino kan maak met 'n gekoopte, klaargemaakte 8 -weg -aansluiting,
As dit klaar is- kyk na die soldeer en kyk na die gapings tussen die koperspore.
Ek vind 'n 36 tpi junior hakmes baie nuttig om puin te verwyder. Ek verwyder die spelde van die lem en skuif die punt van die lem in die spoor. Dit is duidelik dat die lem nie in 'n raam is nie.
Stap 6: Toets die DAC
Laat die verbinding tussen die stroombaan en die Arduino uit.
Stel die volumeregeling op u stroombaan op halfpad.
Skakel die 9V DC -krag aan na u nuwe stroombaan.
Kontroleer of die kring reg is- ek kan geen aanspreeklikheid aanvaar vir u kring nie!
Skakel af
Koppel u stroombaan aan die Arduino.
Gebruik penne 22-29 op die Mega. (PORTA) Moenie die twee 5V -penne hierbo verwar nie!
Gebruik penne 0-7 op die Uno. Dit is PORTD
Koppel die 0V van u kragtoevoer aan die 0V op die Arduino.
Skakel aan.
Maak hierdie toetsprogram DAC_TEST oop
Vir die UNO, vervang alle verwysings na PORTA na PORTD
Vervang DDRA met DDRD- hierdie instruksie stel al 8 reëls in een keer op uitvoer. Dit is die datarigtingregister.
Stel u seriële monitor op 115200.
Koppel 'n voltmeter tussen die DAC out en OV
Die program stel die uitset op 255- alle lyne aan - maksimum spanning.
Uitset 128- half maksimum spanning.
Uitset 0- nulspanning (Of waarskynlik byna nul).
Dit stap dan stiksgewys: 1, 2, 4, 8, 16, 32, 64, 128
Die spanning moet geleidelik toeneem.
As die spanning terugsak terwyl die getal toeneem, het u waarskynlik twee van die verbindingsdrade omgekeer.
U moet ook die luidspreker rustig hoor klik terwyl die spanning verander
Stap 7: Lees die Wav -opskrif
WAV -lêers word gestoor met 'n gespesifiseerde frekwensie en datagrootte.
Hierdie inligting is vervat in 'n opskrif van 44 byte aan die begin van 'n wav -lêer.
Alhoewel sommige sagteware die opskrif verleng (na byte 35), word die ligging van die datagrootte moeiliker om op te spoor.
Om die opskrif te lees, skep ons 'n buffer en kopieer die begin van die lêer.
Die frekwensie word gestoor in 4 grepe vanaf 24 grepe in die lêer.
// leesfrekwensie gespesifiseer in wav -lêeropskrif
byte headbuf [60]
tempfile.seek (0);
tempfile.read (headbuf, 60);
retval = headbuf [27];
retval = (retval << 8) | headbuf [26];
retval = (retval << 8) | headbuf [25];
retval = (retval << 8) | headbuf [24];
Serial.print (F ("lêerfrekwensie"));
Serial.print (retval);
Die beste manier om die gegewensgrootte -inligting te vind, is om na die woord "data" in die kop te soek.
Onttrek dan die 4 grepe wat daarop volg, wat die lang waarde uitmaak
ongetekende lang herhaling;
int mypos = 40;
vir (int i = 36; i <60; i ++) {
as (headbuf == 'd') {
as (headbuf [i+1] == 'a') {
as (headbuf [i+2] == 't') {
as (headbuf [i+3] == 'a') {
// uiteindelik het ons dit
mypos = i+4;
ek = 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];
OK, ons het die datalengte en frekwensie!
Die klankdata volg die 4 grepe waaruit die datalengtewaarde bestaan.
Stap 8: Onderbreek, onderbreek…
Ons gebruik die frekwensie -inligting om 'n sagteware -onderbreking op of naby die vereiste frekwensie te skep.
Die onderbreking kan nie altyd presies ingestel word nie, maar dit is voldoende. Die frekwensie wat uit die lêer gelees word, word deurgegee na die ingestelde onderbreekprogram.
leegte setintrupt (float freq) {float bitval = 8; // 8 vir 8 bit timers 0 en 2, 1024 vir timer 1 byte
setocroa = (16000000/(freq*bitval)) - 0,5;
// Die setocroa -waarde vereis 'n aftrekking van -1. Voeg egter 0,5 rondes by naaste 0,5
// Die resolusie van die timer is beperk
// Uiteindelik bepaal deur die grootte van bitval
cli (); // skakel onderbrekings uit // stel timer2 -onderbreking in
TCCR2A = 0; // stel die hele TCCR2A -register op 0
TCCR2B = 0; // dieselfde vir TCCR2B
TCNT2 = 0; // initialiseer tellerwaarde na 0
// stel vergelyk wedstrydregister vir frekwensie (hz) inkremente
OCR2A = setocroa; // = (16*10^6) / (frekwensie*8) - 1 (moet <256 wees)
// skakel die CTC -modus aan
TCCR2A | = (1 << WGM21); // Stel CS21 -bit in vir 8 voorverkoeler
TCCR2B | = (1 << CS21); // aktiveer timer vergelyk onderbreek
// TIMSK2 | = (1 << OCIE2A); // dit werk, net soos die volgende reël
sbi (TIMSK2, OCIE2A); // aktiveer onderbreking op timer 2
sei (); // maak onderbrekings moontlik
Besondere lesers sal sbi (TIMSK2, OCIE2A) raakgesien het
Ek stel 'n paar (internetverwerkte) funksies op vir die instelling en verwydering van registerstukkies:
// Definieer vir die verwydering van registerstukke#ifndef cbi
#definieer cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))
#endif
// Definieer vir die opstel van registerstukke
#ifndef sbi
#define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))
#endif
Hierdie funksies bied 'n maklike oproep om die onderbreking in te stel of uit te vee.
Die onderbreking loop dus, wat kan ons dit laat doen?
Stap 9: Onderbrekings en dubbele buffering
By 22 Khz word 'n greep klankdata elke 0,045 ms afgelewer
512 grepe (die buffer grootte) word gelees in 2,08 ms.
Die buffer kan dus nie in een skryf siklus van die SDCard gelees word nie.
512 grepe word egter in 23,22 ms na die poort geskryf.
Al wat ons hoef te doen is om 'n nuwe lêer op te stel elke keer as die buffer leeggemaak word, en ons het genoeg tyd om die data te kry voordat 'n nuwe datablok nodig is … As ons twee buffers gebruik, een leegmaak terwyl ons 'n ander vul.
Dit is dubbele buffering.
Die lees van die lêer word vertraag deur die herhaalde onderbreking, maar dit sal klaar wees.
Ek het twee 512 byte buffers opgestel wat bufa en bufb genoem word.
As die vlag reeds waar is, lees ons uit porta, anders lees ons uit portb
As die bufferposisie (bufcount) die buffergrootte (BUF_SIZE 512) bereik, stel ons 'n vlag genaamd readit op true.
Die leemte -lusroetine soek hierdie vlag en begin 'n blok wat lees:
if (readit) {if (! aready) {
// begin SDCard -blok gelees na bufa
tempfile.read (bufa, BUF_SIZE);
} anders {
// begin SDCard -blok gelees na bufb
tempfile.read (bufb, BUF_SIZE);
}
readit = vals;
}
As dit klaar is, word die roetine -vlae readit = false.
Binne die onderbreekroetine moet ons kontroleer of die leemte -lus klaar is deur te kyk of readit == false.
In hierdie geval gee ons aan dat nog 'n lesing nodig is, en skakel die vlag wat reeds is, om van buffer te verander.
As die SD-kaart nog lees, moet ons een lesing (teller--; bufcount--;) agteruit hou en die onderbreking verlaat om later weer te probeer. (Kliek op die klankuitsetsein impliseer dat dit gebeur het.)
As al die data gelees word, word die onderbreking gekanselleer, die poort word weer ingestel op die middelspanningswaarde van 128 en die klanklêer word gesluit.
Stel u volume op 50%voordat u die script dac2.ino vir die eerste keer uitvoer. Dit sal te hard wees, maar dit is beter as 100%!
As u volumekontrole omgekeerd werk, ruil die drade aan die teenoorgestelde ente van die 10K potensiometer.
Laat weet my hoe dit klink.
Aanbeveel:
Speel video met ESP32: 10 stappe (met foto's)
Speel video met ESP32: hierdie instruksies wys iets oor die speel van video en klank met ESP32
Praat Arduino - 'N MP3 speel met Arduino sonder enige module - Speel MP3 -lêer vanaf Arduino met behulp van PCM: 6 stappe
Praat Arduino | 'N MP3 speel met Arduino sonder enige module | Mp3 -lêer speel vanaf Arduino met behulp van PCM: In hierdie instruksies leer ons hoe om 'n mp3 -lêer met arduino te speel sonder om 'n klankmodule te gebruik
Speel liedjies met Arduino met behulp van ADC na PWM op Flyback Transformer of luidspreker: 4 stappe
Speel liedjies met Arduino met behulp van ADC na PWM op Flyback Transformer of luidspreker: Hallo ouens, dit is die tweede deel van my ander instruksies (dit was baie moeilik), basies, in hierdie projek het ek die ADC en TIMERS op my Arduino gebruik om omskakel klanksignaal in 'n PWM -sein. Dit is baie makliker as my vorige Instructa
Speel liedjies (MP3) met Arduino met behulp van PWM op luidspreker of Flyback -transformator: 6 stappe (met foto's)
Speel liedjies (MP3) met Arduino met behulp van PWM op luidspreker of Flyback -transformator: Hallo ouens, dit is my eerste instruksie, ek hoop dat u daarvan sal hou !! In hierdie projek het ek die seriële kommunikasie tussen my Arduino en my laptop gebruik, om musiekdata van my skootrekenaar na die Arduino oor te dra. En met behulp van die Arduino TIMERS t
Speel musiek met Arduino !: 5 stappe (met foto's)
Speel musiek met Arduino !: In hierdie instruksies sal ek jou wys hoe ek musiek speel met 'n Arduino UNO en 'n SD -kaartmodule. Ons sal die SPI -kommunikasie gebruik. Kom aan die gang