This is an old revision of the document!
Boxa prezinta o lista de cantece preincarcate pe cardul SD. Cantecele sunt scrise bare-metal, direct pe cardul SD, folosind un script in Python de pe Laptop si interfata seriala. Aceasta este afisata pe ecran de unde utilizatorul poate, folosind encoderul rotativ, selecta piesa dorita. Odata ce este selectata o piesa, se poate regla volumul, pune pauza, sau se poate reveni la meniul anterior.
Deoarece microcontroller-ul Atmega328p nu prezinta periferice cu iesiri analogice, sunetul este generat folosind un semnal modulat PWM. Frecventa este de 65kHz pentru a putea include banda sonora (20Hz - 22kHz). Semnalul este trecut printr-un filtru trece jos pentru a pastra doar componenta continua. Alegem frecventa de taiere ~ 7 kHz si punem un filtru de ordin 2 pentru a obtine o rejectie mai buna a armonicelor.
Simulare unde se alterneaza duty-cycle-ul PWM pentru a genera un semnal alternativ la iesire. Se poate observa ca filtrarea nu elimina zgomotul in totalitate insa difuzorul in sine functioneaza ca un filtru trece jos, deci rezultatul este acceptabil.
Incepand cu interfata hardware, am programat comunicarea prin I2C (i2c.h) cu display-ul cu controller SSD1306 (ssd1306.h), si am implementat o functii pentru afisarea liniilor text. Am creat propriul font, cu caractere de 6×8 pixeli, pentru a putea afisa text si imagini pe ecran. Fontul este realizat in excel si tradus ulterior in octeti.
Pentru a stoca piesele, am programat o interfata SPI (spi.h), precum si instructiunile necesare comunicarii cu cardul SD (sd.h), conform SD Card Physical Specification. Fiecare fisier stocat are un header ce contine nr. total de esantioane si titlul piesei, urmat de esantioanele cantecului. Acestea sunt codificate la o rezolutie de 8 biti, 20k sample-uri pe secunda. Fiecare fisier este localizat la o locatie specifica in memorie, pentru a putea fi gasit usor.
Utilizatorul are nevoie de o metoda de a interactiona cu dispozitivul, iar aceasta este facilitata folosind encoderul KY040. Acesta are un buton ce se poate apasa si roti pentru a realiza 3 comenzi diferite. Directia de rotatie este determinata folosind intreruperi si un automat pe stari finite (encoder.h).
Pentru a genera sunetul, folosim 2 timere. Primul genereaza semnalul PWM si este setat la 65kHz. Al doilea provoaca executarea unei intreruperi ce modifica duty-cycle-ul pentru semnalul PWM (0 - 255). Acesta este configurat sa ruleze la 20kHz. Cu aceste 2 timere putem genera un semnal sonor plecand de la o lista de esantioane.
O alta limitare a microcontroller-ului este faptul ca contine doar 2KB de memorie RAM, insa fisierele contin milioane de esantioane. Pentru a putea reda sunetul trebuie sa citim sunetul in timp ce il difuzam. Folosim 2 buffere de 512B. La fiecare moment de timp, intr-unul citim esantioanele de pe cardul SD si din celalalt extragem valoarea necesara setarii duty-cycle-ului pentru timer-ul PWM. Odata ce buffer-ul de citire devine gol, acesta este interschimbat cu buffer-ul de scrie si programul continua.
===== Rezultate Obţinute =====
===== Concluzii =====
===== Download =====
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
===== Jurnal =====
===== Bibliografie/Resurse =====