Reportofon

Student: Purcareata Bogdan 331CA

Introducere

Functiile proiectului sunt:

  • redarea de fisiere .WAV stocate pe suport SD
  • inregistrarea vocii sub forma de fisier .WAV pe suport SD
  • conectarea de dispozitive audio proprii (microfon, boxe) prin jack-uri de 3.5 mm
  • selectia dintre fisierele stocate pe cardul SD prin intermediul unor butoane
  • feedback vizual cu privire la starea dispozitivului printr-un LCD
  • feedback vizual cu privire la volumul semnalului audio printr-un VU-metru

Ideea de la care a pornit proiectul a fost inregistrarea si redarea vocii umane. Apoi m-am gandit sa ii fac si o interfatare cu un card SD, pentru a putea stoca mai multa informatie. Pentru ca fisierele sa fie compatibile si in exterior, am ales sa salvez fisierele in format .WAV. Ca sa nu fiu nevoit sa interactionez tot timpul cu un singur fisier audio, am pus si doua butoane de navigare - inainte, inapoi - pe langa cele doua de inregistrare si playback. Pentru a obtine un feedback din referitor la starea curenta, am interfatat si un display LCD de 16×2. In final, m-am gandit ca ar fi dragut sa ii pun si niste leduri care sa arate volumul streamului audio (la inregistrare sau playback).

Descriere generală

Inregistrarea vocii presupune conversia in digital a unui semnal analogic - cel produs de vibratiile corzilor vocale. Frecventele emise de vocea umana se incadreaza in spectrul 300 - 4000 Hz, si conform teoremei de esantionare, pentru a putea fi inregistrata corect, este necesara o frecventa de esantionare de cel putin 8000 de Hz. In aplicatie, pentru a mai compensa din pierderile de precizie datorate folosirii unei dimensiuni de 8 biti pe esantion, vocea se va inregistra cu o frecventa de 16kHz.

Proiectul urmareste pas cu pas specificatiile din Application Note AVR335: Digital Sound Recorder with AVR and DataFlash. Difera insa modalitatea de stocare a inregistrarii. Eu am optat pentru varianta unui card SD, intrucat mi-a fost mai usor sa il integrez pe placa de baza a proiectului.

Schema bloc:

Proiectul simuleaza functionalitatea unui player WAV cu optiune de inregistrare. Pe ecranul LCD va fi specificat titlul melodiei care este selectata, initial prima gasita pe cardul SD. VU-metrul va fi activ doar cand se inregistreaza sau se face playback, indicand nivelul semnalului transmis pe boxe / captat de la microfon. Pe parcursul executiei aplicatiei, userul interactioneaza cu butoanele de control pentru comanda acesteia.

Fiecare modul extern microcontroller-ului comunica direct cu acesta.

  • Butoanele de control - declanseaza anumite actiuni in microcontroller
    • previous - marcheaza ca selectata melodia precedenta celei curente
    • next - marcheaza ca selectata melodia succesoare celei curente
    • play - initiaza playback-ul melodiei selectate curent. Playback-ul continua pana cand acest buton nu mai este apasat sau melodia s-a terminat
    • record - initiaza inregistrarea peste melodia selectata curent. Inregistrarea continua pana cand acest buton nu mai este apasat.Inregistrarea suprascrie (partial sau total) melodia selectata curent.
  • LCD-ul - afiseaza melodia selectata curent si un mesaj corespunzator daca este in modul de playback sau de inregistrare
  • VU-metrul - aprinde un grup de leduri din cele 8 disponibile in functie de nivelul semnalului audio, in modurile de inregistrare si playback.
  • Microfonul - ofera semnalul analogic de inregistrat. Acesta trece printr-un etaj de amplificare si se leaga de un pin al microcontroller-ului. Se poate folosi orice microfon cu jack de 3.5 mm, insa de calitatea microfonului depinde si calitatea inregistrarii.
  • Boxele / Castile - suportul pentru semnalul audio emis de microcontroller in modul de playback. Semnalul trece printr-un filtru trece-jos de tip Chebyshev de ordinul 5 si printr-un amplificator cu intrare pe un singur canal.
  • Cardul SD - ofera suportul de memorie pentru fisierele cu care utilizatorul interactioneaza. Este conectat prin SPI la microcontroller. Cardul este formatat FAT32, iar ca sistem de fisiere este folosit Petit FAT Filesystem.

Toata logica de interactiune a modelelor este realizata in microcontroller.

Hardware Design

Design-ul hardware al proiectului porneste de la cablajul imprimat al primei etape. Pe acest montaj am adaugat cateva extensii pentru a implementa functionalitatile suplimentare.

VU metru

Componente:

  • 8 LED-uri
  • 8 rezistente de 1K

LED-urile ocupa tot portul C al microcontroller-ului si sunt comandate in modul clasic, invatat la laborator.

LCD

Componente:

  • 1 LCD 16×2 model AC-162B

LCD-ul are un controller SED1278 si suporta modul de transmisie a datelor pe 4 biti. Are aceiasi pini ca si LCD-ul folosit la laborator. API-ul este acelasi cu cel de la laborator, cu mici diferente la sectiunea de initializare (este specificata in datasheet). Este mapat peste portul A al microcontroller-ului.

Atentie! La conectarea pinilor LCD-ului, pinul VO (Contrast Adjustement) trebuie legat la masa. Daca e lasat in aer, contrastul pe LCD este 0 si practic nu se va afisa nimic. E scris si in laborator, dar merita un reminder (eu nu am fost atent la acest aspect si asta m-a costat vreo 7 ore de debug).

Interfata de control

Componente:

  • 4 butoane
  • 4 rezistente de 100 ohmi
  • 1 LED
  • 1 rezistenta de 1K

Butoanele si LED-ul (care este aprins in modul de inregistrare) ocupa partial portul D. Pe placa de baza, pe portul D este conectata si interfata USB, deci trebuie de avut grija sa nu se foloseasca si acei pini, pentru ca acolo vine alimentarea placii.

Circuitele pentru amplificare si redare

Ambele folosesc un Quad Amplifier LM324, conform cu specificatia AVR335. Acesta este un integrat cu 14 pini, iar in circuitele de mai jos sunt numerotati pe intrarile si iesirile amplificatoarelor operationale.

Circuitul pentru microfon

Componente:

  • 2 rezistente de 1K
  • 2 rezistente de 10K
  • 1 rezistenta de 12K
  • 1 condensator de 1uF
  • 1 condensator de 4.7nF

Amplificatorul pentru microfon este un inversor.

Circuitul pentru boxe

Componente:

  • 1 rezistenta de 470 de ohmi
  • 1 rezistenta de 1K
  • 1 rezistenta de 5K
  • 1 rezistenta de 12K
  • 1 rezistenta de 15K
  • 1 condensator de 1nF
  • 1 condensator de 2.2nF
  • 1 condensator de 22 nF
  • 1 condensator de 100nF
  • 2 condensatoare de 1uF

Software Design

Software-ul a fost scris in Programmer's Notepad si compilat cu avr-gcc. Sistemul de operare a fost un Windows XP pe masina virtuala.

Module:

  • vumeter.h - implementeaza functiile de initializare a vumetrului si de afisare a unei valori prin intermediul acestuia.
  • LCD.h - API-ul LCD de la laborator, cu micile modificari aduse pentru modelul de LCD folosit.
  • pff.h - sistemul de fisiere Petit FAT Filesystem, dezvoltat de cei de la ELM.
  • mmc.c - implementearea functiilor de interactiune cu cardul SD (nivelul I/O pentru filesystem).
  • reportofon.c - modulul principal al aplicatiei, care implementeaza urmatoarele metode:
    • next_file() - intoarce fisierul .WAV succesor celui selectat curent
    • prev_file() - intoarce fisierul .WAV precedent celui selectat curent
    • load_header() - citeste headerul unui fisier .WAV si il analizeaza (functie din laborator)
    • build_header() - construieste un header pentru un fisier .WAV in formatul standard
    • play_button_event() - redarea fisierului .WAV selectat curent. Se iese din aceasta functie cand s-a terminat fisierul sau butonul de play nu mai este apasat.
    • rec_button_event() - inregistrarea peste fisierul .WAV selectat curent. Inregistrarea se opreste cand butonul de record nu mai este apasat.
    • main - functie care apeleaza functiile de initializare ale componentelor si intra intr-o bucla infinita in care analizeaza starea butoanelor si apeleaza alte functii conform cu acestea.

Algoritmul este prezentat in detaliu in Application Note AVR335.

Rezultate Obţinute

Proiectul este functional si “vrea sa fie” un reportofon cu afisaj LCD, vumetru si butoane de navigare.

Probleme aparute

  1. Sistemul de fisiere Petit FAT Filesystem nu are declarata o functie pentru crearea unui fisier. In comentariile din codul sursa al bibliotecii este mentionat in dreptul metodei pf_open() ca se pot crea noi fisiere folosind aceasta metoda. Cu toate acestea, cazul de utilizare nu este tratat in implementare, iar informatii pe site-ul oficial, pe forumul userilor sau oriunde altundeva on-line legate de acest subiect nu exista. Solutia pe care o doream pentru inregistrarea unei melodii era initial creearea unui fisier nou pe cardul SD. Intrucat sistemul de fisiere nu imi ofera aceasta facilitate, nu am posibilitatea sa pun unul mai elaborat pe microcontroller (nu se incadreaza in 16K) si problema a fost depistata prea tarziu, am gasit o solutie folosind suprascrierea. Astfel, cum in aplicatie in orice moment un fisier de pe card este selectat, la inregistrare continutul acestui fisier va fi (partial) inlocuit cu un nou continut. Este posibil ca aceste fisiere sa fie corupte - sa ramana date vechi la sfarsitul fisierului dupa ce s-a terminat scrierea noului continut. Daca aceste fisiere sunt deschise pe PC, va fi redat doar acest nou continut. Pe microcontroller, nu se tine cont de dimensiunea totala a fisierului (inclusa in header) si acesta se reda cat timp nu s-a ajuns la sfarsitul de fisier.
  2. O problema mai grava tine de latenta aparuta la scrierea pe cardul SD prin intermediul functiei pf_write() a sistemului de fisiere Petit FAT Filesystem. Datorita costului acestei operatii, la inregistrare se pierd cadre din bufferele locale (de dimensiune redusa), iar fisierul se inregistreaza intrerupt. La frecventa de 16kHz, proportia de buffere (a cate 256 de esantioane) scrise propriu-zis pe card este de 42%, iar la 4kHz de 61% (aici output-ul fiind neinteligibil). Problema a fost constatata tarziu si nu a fost remediata. O solutie ar fi ca, la inregistrare, esantioanele sa fie scrise intr-o zona de pe cardul SD separata de sistemul de fisiere (buffer temporar de dimensiune mare), unde acestea sa fie accesate direct prin SPI. Dupa ce inregistrarea s-a finalizat, datele vor fi copiate in sistemul de fisiere, fara niciun risc de pierdere. O alta solutie este montarea pe PCB a unui registru intre cardul SD si microcontroller, care sa implementeze hardware aceasta facilitate. Timpul scurt nu mi-a permis sa finalizez niciuna din aceste solutii.

Concluzii

Proiectul m-a ajutat sa fac un montaj propriu de la inceput pana la sfarsit. A fost primul meu pas in domeniul de procesare de semnale. Totodata, am atins multe din subiectele prezentate la laborator (LCD, intreruperi, timere, PWM, SPI, filesystem, fisiere WAV, UART - in faza initiala de debug, ADC), deci a fost o consolidare a acestor cunostinte care, foarte probabil, o sa ma ajute mult la examen. In plus, bucuria de a avea un reportofon / player WAV construit si programat de unul singur este infinita :-).

Download

Bibliografie/Resurse

pm/prj2011/dtudose/reportofon.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0