Arduino (Mega) Lydoptagelse: 9 trin (med billeder)

Arduino (Mega) Lydoptagelse: 9 trin (med billeder)

Indholdsfortegnelse:

Anonim

Optag lyd til dit Audino Mega SD-kort.

Lydfilen kan afspilles på et standard lydprogram eller analyseret byte med byte.

Denne instruktør viser dig, hvordan lydindgang gentages til en 512 byte buffer og derefter overføres til et SD-kort i realtid. Den registrerede periode kan ændres.

Prøvehastigheden er 9,4 KHz og wav-filen output 8 bit, mono. Selvom det ikke er troværdighed, er lydkvaliteten helt passende.

Den indspillede wav-fil kan gemmes som tabulerede data. Det kan også vises som en simpel rullediagram på skærmen.

Alle filer er tidsstemplet ved hjælp af en unix-tidskode, der sendes fra den serielle skærm.

Inspirationen til denne artikel kom fra at læse Amanda Ghassaei: http: //www.instructables.com/id/Arduino-Audio-Inp …

Min seneste programopdatering i slutningen af ​​denne instruerbare, øger prøvehastigheden til 19 kHz med en betydelig forbedring i lydkvaliteten.

Du kan også være interesseret i mine instruktables på:

EN høj hastighed Arduino Oscilloskop: http: //www.instructables.com/id/Arduino-Highspeed …

Plægge wav filer fra Arduino: http: //www.instructables.com/id/Arduino-playing-wa …

Uundgåeligt er SD-kortteknologi allerede forbedret. Jeg har testet med et Sandisk Ultra 8GB SD-kort. Dette er betydeligt hurtigere end Kingston 4GB-kortet, jeg startede med. Ved hjælp af min opdaterede software er jeg i stand til at optage på 38,3 kHz uden nogen nedbrydning i kvalitet. (2014/04/08)

forsyninger:

Trin 1: Krav

Arduino Mega 2560

Følgende komponenter arbejdsmuligheder kan være levedygtige (med program tweaking-jeg forlader det til dig!)

LCD tastatur skærm http: //www.hobbytronics.co.uk/arduino-lcd-keypad -…

MicroSD Breakout Board Reguleret med Logisk Konvertering V2

http: //www.hobbytronics.co.uk/microsd-card-regula …

4GB Micro SD hukommelseskort http: //www.hobbytronics.co.uk/microsd-card-regula …

Mikrofonforforstærker-

ac kombineret med en potentiel divider for at centrere spændingen mellem Arduino 0-5 V-skinne

Amanda Ghassaei har udgivet et kredsløb på http: //www.instructables.com/id/Arduino-Audio-Inpu …

Jeg har designet min egen med bas, diskant og lydstyrkeregulering. Men der er masser af pre-amp designs på nettet.

Trin 2: Specifikationerne

Seriel, LCD, SD og flashhukommelses support.

Seriel indstillet til 115200 baud.

Tidsstempel i Linux-format fra seriel skærm.

Seriel indgang kan starte ny dataoptagelse - ved hjælp af kommandoen 'igen'.

Seriel indgang kan indstille antallet af Kbytes af data læser og derfor varigheden af ​​lydfilen - ved hjælp af kommandoen 'alter'.

Seriel output af data efter input request-command 'read' - output kan stoppes med kommando 'q'

Grundlæggende graf tegnet på seriel skærm.

Rå data gemt i wav kompatibel fil.

Rå data oversat til tabuleret filkommando 'skrive'.

Gentaget 60 s tid opdatering til eeprom. LCD lyser under opdatering af tid til eeprom.

PWM 3 Firkantbølge til testning - skifte med kommandotest.

Indgang 2 sæt høj undgås vente på seriel tidsindstilling.

Ikke-brug kan være muligt med programjustering, herunder flytning af tidslagringsbytes (variabel ememory). Jeg forlader det arbejde for dig.

NB bedste lyd lyd opnås med input varierende omkring midtspændingsværdien på 128. Dette er vigtigt!

Lcd-output af grundlæggende oplysninger.

Lcd-adc-port angivet med variabel lcdport.

Lcd-knappestøtte:

Vælg initierer en ny prøve Venstre ændrer Prøve Kbyte nummer-derefter op +10, ned -10, venstre -1, højre +1

Trin 3: Kom godt i gang

Tilslut LCD-tastaturet.

Tilslut SD-kortlæser

0, 5V

CLK til pin 52

D0 til pin 50

D1 til pin 51

CS til pin 53

Jeg monterede SD-læseren på en smule strimler med passerer gennem stifterne for at matche de nødvendige tilslutningspunkter.

(Detaljer at følge)

Du vil sandsynligvis gerne teste lcd- og sd-kortlæseren ved hjælp af eksempler på scripts fra købsstedet.

Dette lyder lidt afslappet, men det er alle detaljerede ellers-hvor:

Byg en mikrofonforstærker og tilslut den gennem en potentiel deler som beskrevet af Amanda.

Eller brug et andet design.

Jeg anbefaler, at du indbefatter en variabel modstand i den potentielle divider sektion, så indgangen kan omhyggeligt justeres til at centrere omkring en målt input værdi på 128 (halvdelen af ​​0-5 forsyningsspænding. På min pc er "5V" mindre end 5V når den drives af USB.)

Den lcd-skærm, jeg specificerede, bruger analog port nul til lcd-knapperne - så tilslut din lydindgang til A1.

Trin 4: Montering af SD-kortlæser

SD-kortet kan nemt monteres på et stykke stripkort og placeres ved hjælp af passere gennem stifter.

Jeg brugte to sæt stikforbindelser (øverst og nederst) for at stabilisere brættet.

Forbindelserne er ved siden af ​​hinanden på Arduino Mega. Så kobberstrimmelsporerne mellem forbindelserne skal være skære. Jeg brugte en håndholdt junior hack savklinge (ikke i savrammen) med en placeringsstift slået ud. Sørg for at du bruger en god kvalitet bøde tandklinge. Det er også meget nyttigt til at rengøre mellemrummet mellem kobberstrimlerne. Jeg fandt det lettere at skære 5V sporet mens du skar de næste to. (Se billede 4) Det er så nemt at lodde en ledning på tværs af skæret.

Til stifterne brugte jeg standard stiftstrimmel. Stiftlængden på kobbersiden blev justeret til dybden af ​​Arduino sokkel før lodning. Sparestiftlængden på komponentsiden blev skåret og arkiveret ren efter lodning.

En otte-vejs hovedforbinder blev loddet på og en 90-graders stikkontakt blev tilsluttet. Et lille stykke fint dowel blev brugt til at understøtte læseren. Et lille hul boret gennem hjørnet af brættet gør det muligt for en skrue at holde dybden, selv om limen ville være ok.

Jeg tilføjede en stiftekop til 0V-linjen på stripkortet. Dette sikrede, at jeg ikke havde mistet tilgængeligheden af ​​0V-forbindelsespunktet.

SDcard-læseren skal bruge en loddet 90 graders sokkelhoved.

5V strømforsyningen kan indsamles med en flyvende ledning til en af ​​stifterne mellem 21 og 22 (markeret 5V).

Kontrollér, at du har klippet alle sporene vist på billedet, herunder sporene skæres med en borekrone!

Tjek dit layout og lodning Før tilslutte!

Trin 5: Wave File Format

En bølge fil header er en 44 byte blok.

Overskriften er i starten af ​​wav-filen.

Hovedblokken skal initialiseres globalt med:

byte wavheader 44;

Lyddata følger overskriften.

For en 8 bit er mono wav-fildata et tal mellem 0 og 255.

Skriften læser A1-porten, fortolker det indgående lyd som en spænding mellem 0 og 255. Perfekt!

Kun 4 sektioner af overskriften skal opdateres, når en wav-fil er gemt.

Disse vises som de kommenterede sektioner i billedet.

Byterne ved forskydning 4 indeholder længden af ​​data + længden af ​​overskriften - 2 * 4 byte

Eller mere simpelthen tæller dataene +36.

Hver kommenteret sektion er et 4 byte nummer.

De fire bytes forekommer med den mindst signifikante byte først - dette er "lille endianformat".

Den følgende rutine vil acceptere en lang værdi og skrive det til et bestemt punkt i wav header som 4 succesfulde bytes:

void headmod (lang værdi, byte placering) {

// skriv fire bytes for en lang

tempfile.seek (placering); // Find placeringen i filen

byte tbuf 4;

tbuf 0 = værdi & 0xFF; // lo byte

tbuf 1 = (værdi >> 8) & 0xFF;

tbuf 2 = (værdi >> 16) & 0xFF;

tbuf 3 = (værdi >> 24) & 0xFF; // hej byte

tempfile.write (tbuf, 4); // skriv 4 byte buffer

}

Trin 6: Indstilling af afbrydelsen, der læser den analoge port

Vi kan oprette en afbrydelse, så en analog port bliver gentaget.

(Se Amandas artikel for yderligere detaljer)

Min "startad" subrutine bruger en pre-scalar på 128.

Dette skaber en gentagen afbrydelse, således at port A1 kontinuerligt læses ved 9,4 KHz.

Afbrydelsesunderrutinen har en tofolds funktion:

1) Hvis tælleren er Mindre end Antallet af aflæsninger:

  • Tilføj lyddata byte til 512 byte buffer.
  • Når bufferen er fuld, skriv bufferen på én gang til sdcard-512 bytes er den optimale størrelse for hurtige data sparer. Nulstil buffertællingen til nul for den næste indkommende lydbyte.

2) Når tælleren er svarende til Det krævede antal aflæsninger:

Stop afbrydelsen igen

  • Beregn hvor lang tid processen tog, frekvens osv.
  • Brug frekvensen og filstørrelsen til at opdatere bølgefiloverskriften.
  • Slip analog port A1 og aktiver port A0, så lcd knapperne vil fungere.

Trin 7: Indstilling af dato og klokkeslæt og snigende lagring

Arduino kan holde styr på tiden, men skal fortælle et udgangspunkt.

Når det genstartes, skal det fortælles igen. (Medmindre du passer til et realtidsur).

Tiden kan angives som en unix tidsstreng - hvilket er antallet af sekunder, der er gået siden "standard epok den 1/1/1970"

Seriekonsollen kan bruges til at sende en T efterfulgt af unix tidsstrengen.

T1403524800 repræsenterer kl. 12.00 den 3. juni 2014

Se underrutinen "waitfordate" og "processSyncMessage"

if (Serial.find (TIME_HEADER)) {// Se efter T

pctime = Serial.parseInt (); // udtrække tiden

hvis (pctime> = DEFAULT_TIME) {// begrænset skal du kontrollere, at tiden er efter default_time

setTime (pctime); // Sync Arduino ur til den tid, der modtages på seriel port

Dette websted tilbyder unix tidsværdier:

Tid værdier kan gemmes i eeprom hukommelse, som tilbageholdes efter nulstilling.

De lagrede værdier er historiske - de opdateres ikke under nulstilling.

Men de er nyttige som udgangspunkt for nye filnavne. Når scriptet køres uden tidsstempling, bruges den tidligere tidværdi med en 60'ers tilføjelse.

writeeeprom og readeeprom tillader lagring og hentning af tidsstrenge.

Tiden er skrevet til eeprom-hukommelsen hvert 60 sekund.

Vær opmærksom på, at eeprom-hukommelsen har en genanvendelsesgrænse - men stikkontakterne sandsynligvis slides først ud.

Trin 8: Hvad er output og hvordan styres det

En mappe kaldet adlog bruges til dataene.

Følgende output er tilgængelig:

1) En wav-fil for hver læsning. Filnavnet er i formatet ddhhmmss.wav Lydoptagelse kan gentages med kommandoen "igen".

2) Efter seriekonsol kommandoen "write", produceres en tekstfil med datanummer og dataværdi i kolonner. Dette er komma afgrænset og kan let importeres til andre programmer til grafisk analyse. Filnavnet format er ddhhmmss.txt

3) Seriekonsol kommandoen "læs" producerer en lodret rullende grafisk gengivelse af lyden. Dette kan stoppes ved at sende en "q" fra konsollen.

LCD-knapperne kan også bruges til at optage en ny lydfil og ændre antallet af logget byte. Vælg starter en ny fil, og venstre starter "Select" -funktionen, som opdaterer datanummeret. LCD-A0-porten læses og afhængigt af om op, ned, venstre eller højre knap trykkes, ændres datanummeret.

Seriekonsol kommandoen "test" genererer en firkantbølge på PWM3. Dette er nyttigt til test uden mikrofon og pre-amp..

Hvis PWM2 er taget højt, venter programmet ikke på en tidsstempel fra seriekonsollen. Dato og klokkeslæt vil ikke længere være aktuelle. Men det er nyttigt, hvis USB ikke er tilsluttet.

Trin 9: Programopdatering

Jeg har med succes øget datafangstfrekvensen til 19 kHz.

Dette har medført brug af to 512byte buffere (dobbelt buffering) og en omskrivning af afbrydelses og ugyldige sløjfe sektioner.

Lyden er meget renere.

Jeg testede også på 38 Khz, med meget lovende resultater. Imidlertid er der ved denne frekvens lejlighedsvise buffer ventetider til stede. Det er sandsynligt, at fremtidige forbedringer i SDCard-design og SD-bibliotekets funktionshastighed vil overvinde dette problem. For dem, der vil eksperimentere, ændrer prescalar variabel lige før tomgang setup.

Jeg har oprettet bufa og bufb.

I afbrydelsesrutinen indstillede jeg et flag kaldet aready - Det er sandt, når du skriver til bufa, falsk for bufb.

Flaget Skriv det er sandt, når en skrivning er påkrævet, og sæt falsk, når SdCard'en er færdig.

Når en buffer er fuld (buffcount == BUF_SIZE):

  • Jeg kontrollerer, om Sdcard er færdig med at skrive, i hvilket tilfælde writy == false og jeg nulstiller bufferpekeren tilbage til nul, skift bufferflagget aready og indstil writy flag true.
  • Hvis Sdcard stadig skriver, går jeg en læsning tilbage (bufcount--; og counter--;) og afslutter afbrydelsen.

Når jeg har det rigtige antal aflæsninger, lukker jeg afbrydelsen, skriver den sidste datablok og rydder op.

Størstedelen af ​​dataene er skrevet i ugyldige sløjfer:

if (wrheid) {// Data er klar til at blive skrevet

hvis (aready) {

tempfile.write (bufb, BUF_SIZE); // skriv datablokken fra bufb

} ellers {

// start blok skrive fra bufa

tempfile.write (bufa, BUF_SIZE); // skriv datablokken

}

writeit = false; // flag, at skrivningen er udført

}