Table of Contents

MiniPiano

Autorul poate fi contactat la adresa : daniel.nicolescu97@stud.acs.upb.ro

Introducere

Proiectul constă în crearea unui pian electronic cu 8 clape cu afișaj al modului în care se află și al notelor cântate. Acesta dispune de mai multe preset-uri din care utilizatorul poate alege. Astfel se pot schimba sunetele generate de pian. De asemenea, pianul are și funcție de metronom.

Mereu mi-am dorit să am un mini instrument muzical cu care să mă pot juca și se pare că PM-ul mi-a oferit șansa să îmi construiesc singur unul.

Descriere generală

Pentru a ușura implementarea am ales ca cele opt clape ale pianului eletrconic să fie butoane. Pe lângă cele 8 butoane ce corespund claviaturii, pianul mai dispune și de alte patru butoane de control. Cele patru butoane au următoarele funcții:

Pianul dispune și de un LCD alfanumeric 2×16 pentru a afișa nota curentă care este cântată, octava curentă și dacă funcția de metronom este activată.

Sunetele sunt generate folosind capabilitățile mictrocontroller-ului de a genera semnale PWM.

Schema bloc

Hardware Design

Lista de piese

Schema electrică

Claviatura

Butoanele de Control

Display-ul LCD

Difuzorul

Software Design

Redarea sunetelor este realizată folosind 4 sample-uri. 3 dintre ele sunt pentru claviatură, iar cel de-al patrulea pentru funcția de tobă. Din cauza limitării de spațiu (doar 32k) nu am putut folosi câte un sample pentru fiecare buton în parte. Fiecare sample de pian are aproximativ 8k, ce corespunde unui timp de redare de 1s la un sampling rate de 8kHz, iar sample-ul de tobă are 1.6k, ce corespunde unui timp de redare de 0.2s, tot la un sampling rate de 8k. Pentru a reda 8 sunete diferite folosind doar 3 sample-uri de pian, sample-urile 1 și 3 sunt folosite pentru a reda câte 2 note fiecare prin creșterea sampling rate-ului de la 8kHz la 13kHz, respectiv 11kHz. Sample-ul 2 este folosit petru redarea a 4 sunete diferite prin creșterea sampling rate-ului de la 8khz la 11kHz, 14kHz, respectiv 16kHz. Pentru verificarea apăsării butoanelor claviaturii și butoanelor de control am folosit timer-ul 2, astfel, la fiecare 0.02s se verifică dacă vreun buton a fost apăsat.

Timer-ele 0 și 1 sunt folosite pentru redarea sunetelor. Timer-ul 0 este folosit pentru sampling rate. Acesta la fiecare întrerupere modifcă valoarea lui OCR1B cu următoarea valoare din vectorul ce corespunde sample-ului ce trebuie redat. Timer-ul 1 este folosit în mod PWM. Deoarece microcontroller-ul are doar 2kB de ram sample-urile au fost puse în memoria Flash foloind directiva PROGMEM.

Rezultate Obținute

Concluzii

Din cauza resurselor limitate nu am putut mări numărul de sample-uri (programul curent ocupă deja 27kB).

Inițial pentru sample-ul de tobă foloseam un sample mai lung care făcea ca programul să ocupe 30kB, dar plăcuța nu mai funcționa, așa că a trebuit să îl mai scurtez.

Mă gândeam la un moment dat să încorporez și un buton care să schimbe octava. Schimbarea de octavă aș fi putut să o fac mărind și mai mult sampling rate-ul, însă testele pe care le-am făcut mi-au arătat că nu e o idee prea bună, deoarece se produc distorsiuni ale sunetelor prea mari.

A fost interesant să trebuiască să scriu cod care să ocupe cât mai puțin spațiu, lucru pe care nu l-am mai făcut până acum.

O posibilă dezvoltare a proiectului este folosirea unei memorii flash externe pentru a putea folosi mai multe sample-uri și adăugarea capabilității de a genera sunete pe 2 voci (să poată reda 2 sunete diferite în același timp).

Download

daniel_marian_nicolescu_pm.zip

Jurnal

Bibliografie/Resurse

Laboratorul 1 pentru LCD
Laboratorul 3 pentru PWM
Laboratorul 4 pentru generarea de sunete
watch pentru crearea de sample-uri
tut-c-gcc-and-progmem-attribute pentru PROGMEM
Audacity pentru modificarea sample-urilor
bin2h pentru crearea de array-uri din fișiere raw

Documentație