oxurane
Van elk bezoek aan CO leer ik weer meer...
Graag wil ik audio afspelen via een microcontroller.
Hoe
Omdat ik onbekend ben op dit gebied, wou ik het via de volgende stappen uitvoeren :
Stap 1) Analoge audio naar digitaal
Per seconde wil ik graag 4.000 keer een AD-conversie uitvoeren op 8-bits nivo (dus mono 4 KHz, 8-bit).
Toelichting :
Zou ik dus 1 seconde geluid opnemen, dan zou dit 4.000 regels opleveren. Elke regel zou een 8-bit HEX-code opleveren. Een andere schrijfwijze is ook prima, bijvoorbeeld elke HEX-code scheiden met een dubbele punt, spatie, tab whatever.
Stap 2) HEX-codes in EEPROM
De HEX-codes wegschrijven in een EEPROM met voldoende capaciteit. Omdat menigeen waarschijnlijk gaat melden dat ik een grote geheugencapaciteit nodig heb, wil ik aangeven dat het om samples van maximaal 2 seconden gaat, die ik via een loop wil afspelen.
Stap 3) Met Atmega8 EEPROM uitlezen
Met de Atmega8 gekoppeld aan de EEPROM, wil ik de opgeslagen gegevens uitlezen. Indien de EEPROM te veel data-pinnen heeft, om extra IC's te gebruiken zoals een serial-to-parallel-shifter, of omgekeerd (CD4021 en / of CD4094).
Stap 4) AD-conversie met ATMega8
Uit een ver verleden staat mij een alternatieve Soundblaster voor de PC bij : Covox. Op Wikipedia kun je zelfs nog wat achtergrondinformatie terugvinden. Sterker nog, op www.instructables.com is zelfs een uitgewerkte versie voor een PIC te vinden.
Enfin Covox was een eenvoudige DA-converter, opgebouwd uit weerstandjes en die je koppelde tussen de LPT-poort van de PC en een audio-versterker. Ik dacht daarom aan de volgende toepassing :
---------,
Pin B.0 |---- 4K99 -----+
| |
Pin B.1 |---- 10K ------+
| |
Pin B.2 |---- 20K ------+
| |
Pin B.3 |---- 40K2 -----+
| |
Pin B.4 |---- 80K6 -----+
| |
Pin B.5 |---- 162K -----+
| |
Pin B.6 |---- 316K -----+
| | Audio OUT
Pin B.7 |---- 649K -----+---|(-------------0
---------' | 10uF
|
390
| Audio OUT (GND)
+------------------0
|
GND
Al zal het volgende eenvoudiger zijn om te bouwen :
---------, Audio OUT
Pin B.0 |---- 20K -----+----------+------0
| 10K |
Pin B.1 |---- 20K -----+ |
| 10K |
Pin B.2 |---- 20K -----+ |
| 10K |
Pin B.3 |---- 20K -----+ |
| 10K |
Pin B.4 |---- 20K -----+ |
| 10K |
Pin B.5 |---- 20K -----+ |
| 10K |
Pin B.6 |---- 20K -----+ |
| 10K |
Pin B.7 |---- 20K -----+ |
---------' | |
20K 10K
| |
+----------+------0
| Audio OUT (GND)
GND
Stap 5) Audio naar luidspreker
De audio OUT op een versterkertje aansluiten en vervolgens naar een luidspreker.
Schematisch overzicht
EEPROM ---- ATMega8 --- DAC --- OpAmp --- Luidspreker
Vraag
Mijn probleem is nu stap 1). Ik heb op CO gelezen dat er een softwareprogramma bestaat, dat zeer dicht in de buurt komt van wat ik zoek : BTc Encoder 2.0.
Daarnaast las ik dat het ook rechtstreeks met WAV-files zou kunnen. Iets van "headers" strippen. Dat is voor mij een beetje abracadabra.
Ik had ook al gedacht aan het aansluiten van een electret-microfoontje aan een ADC-pin van een Atmega8 om het ingelezen audiosignaal, vervolgens in een EEPROM te persen. Al zou daar natuurlijk wel wat electronica tussen moeten worden gezet om een voldoende sterk signaal te krijgen (met een Opamp).
Kan iemand me een beetje op weg helpen met stap 1) ?
Natuurlijk kan iemand je een beetje op weg helpen.
Zorg er eerst voor dat je werkende programma's in een microcontroller kunt zetten. Knipperlampje, drukknopje, etc.
Verdiep je vervolgens in timers en interrupts.
Ga vervolgens eens kijken hoe I2C werkt, en hoe je een I2C eeprom aan kunt sluiten op je controller. Als je dat aan de praat hebt ben je al een heel eind.
Ga je nu verdiepen in de AD converter van je controller, en gebruik deze om de stand van een potmeter uit te lezen. Nog even doorbijten, je bent er bijna
Maak een microfoonversterker met een uitgangssignaal tussen 0 en 5 volt. En sluit deze aan op de AD converter van je controller.
Nu is het simpel:
Maak een programma dat eerst een tijdje met vaste snelheid (samplerate) het microfoonsignaal samplet en opslaat in de eeprom.
Maak nu een programma dat met vaste snelheid de opgeslagen waarden afspeelt over zijn uitgang.
Jordi
Bier zonder alcohol is als een beha aan een waslijn: het beste is er uit!
Stap 4 is leuk om eens op die manier gedaan te hebben, maar het kan een stuk eenvoudiger: speel het af met PWM.
Kies de frequentie hoog genoeg (bijv 16KHz is voor jou zat) en zet een 2e orde rc filter erachter (op 4KHz dus). Duty 50% = stilte, de variatie daarin wordt je sinus.
Voordeel: je hebt maar 1 pin nodig op je uC, en het filter is simpel.
Voor de speaker zou ik geen opamp nemen, maar een fatsoenlijk TDA IC-tje.
Zo heb ik hier een Zilog 8 bitter die in een loop "ben jij een kerstbal ernie gegegege" afspeelt via PWM, tot je er knettergek van wordt.
Je kunt ook met 2 uc pinnetje en een RC combinatie goed geluid afspelen. Meer hier
Gerwin
An amplifier is just a modulator for a power supply |Toffe Gebruiker
Op 31 maart 2009 02:32:05 schreef oxurane:
[....]
Vraag
Mijn probleem is nu stap 1). Ik heb op CO gelezen dat er een softwareprogramma bestaat, dat zeer dicht in de buurt komt van wat ik zoek : [URL=www.RomanBlack.com/picsound]BTc Encoder 2.0[/URL].
Daarnaast las ik dat het ook rechtstreeks met WAV-files zou kunnen. Iets van "headers" strippen. Dat is voor mij een beetje abracadabra.
Ik had ook al gedacht aan het aansluiten van een electret-microfoontje aan een ADC-pin van een Atmega8 om het ingelezen audiosignaal, vervolgens in een EEPROM te persen. Al zou daar natuurlijk wel wat electronica tussen moeten worden gezet om een voldoende sterk signaal te krijgen (met een Opamp).Kan iemand me een beetje op weg helpen met stap 1) ?
Je hoeft niet eens perse de headers te strippen dat hoor je niet. Mocht je ze toch willen strippen? gewoon bij byte 44 beginnen met lezen.
WAV kun je prima gebruiken je moet alleen de juiste sample afspeel snelheid hebben.
[Bericht gewijzigd door Gerwin op (64%)]
elmowww
PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling
Bedenk eventjes of je niet direct de parallelle uitgang van je EEPROM aan een DAC hangt, evt icm, wat _CS lijnen.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Per seconde wil ik graag 4.000 keer een AD-conversie uitvoeren
Samplen op 4 KHz geeft wel een hele lage audiokwaliteit. (Max. zo'n 1800 Hz)
oxurane
Van elk bezoek aan CO leer ik weer meer...
Hartstikke leuk dat er zoveel reacties zijn.
@mbbneon : Ik ben zeer geinteresseerd in de door jou gesuggereerde oplossing van :
Maak een microfoonversterker met een uitgangssignaal tussen 0 en 5 volt. En sluit deze aan op de AD converter van je controller.
Heb je hier toevallig een schema van, of kun je me een link geven, waar ik hierover meer informatie kan vinden ?
@Jordi : Ik heb nog geen kennis van PWM opgedaan met een AVR. Daarnaast heb ik naast de geluidskwaliteit ook voor de lage samplerate gekozen, zodat ik de Atmega8 voldoende tijd kan geven om ook andere taken in de tussentijd af te kunnen handelen.
@2N3055 : Ik zal je tip zeker eens goed bestuderen. Want dit is zeer interessant.
@Gerwin : Ik veronderstel dat ik dan zoiezo een mono-geluidsopname met de juiste instellingen moet uitvoeren. Dus een mono-opname op 2 KHz en dan vanaf byte 44 alles naar tekst omzetten...
@Elmoww : Dank je voor de tip. Ik had hier ook al aan zitten denken, ware het niet dat de EEPROM die ik hier heb liggen, die een 16-bit output kent (HY29F800BG-70 Flash Memory).
@Arco : Bedankt voor je tip. Bij spraak zitten een mensenstem ergens tussen de 600 en 1200 Hz. Maar mijn projectje gaat juist geen mensenstemmen opnemen. Ik zit met geluiden van machines. Misschien dat dat inderdaad wel een hoger frequentieberiek heeft, om het zo natuurgetrouw mogelijk weer te kunnen geven.
Tot slot : Ik wist niet dat er al zoveel leden / hobbyisten waren, die al met een dergelijk onderwerp in de praktijk hadden gestoeid. Ik hoop zeker dat ik nog meer informatie van jullie zie, zodat ik een mooie oplossing voor mijn projectje kan bouwen.
Afspelen is vrij makkelijk en kan mer I2C of SPI Flash geheugen. SPI is wat sneller en daardoor makkelijker, ook grotere chips te verkrijgen.
Opnemen gaat je alleen lukken met SPI en dan nog met geheugentypes die een dubbele buffer hebben (Atmel heeft er een paar). Het schrijven van Flash is de bottle-neck.
Ik nam gewoon op met een PC, paste dan de samplerate/bits aan voor mijn micro (8bit, 8kHz,mono) en propte de WAV in een 24LC1024 (16 seconden)