MiniPian

Introducere

  • Proiectul consta in realizarea unui pian in miniatura, extinzand placuta de baza printr-un modul cu 8 butoane si cu un difuzor. La apasarea unui buton, va fi redata nota corespunzatoare lui.
  • Proiectul are drept scop simularea unui instrument muzical rudimentar.

Descriere generală

Minipianul se poate afla in una din urmatoarele stari:

1. Redare note introduse de utilizator:

  • starea initiala
  • reda notele tastate de utilizator, schimband starea unui LED la fiecare apasare (astfel incat LED-ul va clipi daca este tinut apasat butonul)

2. Selectare cantec:

  • asteapta ca utilizatorul sa aleaga unul dintre cele 3 cantece demo, scrise in memoria microcontroller-ului
  • selectarea se face cu butoanele corespunzatoare notelor C4, D4, E4 (primele 3 note)

3. Redare cantec:

  • reda cantecul selectat

Trecerea intre tipurile de functionare se face astfel:

Hardware Design

Componente folosite pentru placuta extensie:

  • 8 butoane push-down
  • 1 condensator de 100 uF, 25V
  • 1 difuzor 0.5W

Nu am avut nevoie de rezistente pentru butoane, deoarece am folosit rezistentele de Pull-up integrate in microcontroller. Placutele se alimenteaza prin USB. Mai jos este schema electrica, realizata in Isis 6. Dintre componentele placutei de baza, am inclus doar microcontrollerul.

Software Design

Pentru generarea notelor, am folosit Timer1, channel A. Am setat ca mod de functionare Pulse Width Modulation, Phase & Frequency Correct, luand valoarea TOP din registrul ICR1. Folosind datele de la link-ul [3], am memorat un vector cu frecventa notelor. Pe baza acestor frecvente, am calculat in functia generateICRValues(), valorile ICR1 corespunzatoare fiecarei note.

Nota Frecventa
C4 261.63 Hz
D4 293.66 Hz
E4 329.63 Hz
F4 349.23 Hz
G4 392.00 Hz
A4 440.00 Hz
B4 493.88 Hz
C5 523.25 Hz

ICR1 = F_CPU / (fnota * 2 * prescaler), unde

  • F_CPU = frecventa ceasului, 16 MHz
  • fnota = frecventa notei
  • prescaler = 1 (nu folosesc prescaler)

Se poate opri redarea cantecelor, apasand din nou butonul de selectie. Am implementat aceasta facilitate in functia playSong(short int *song), verificand, dupa fiecare nota redata, starea butonului.

Pentru a nu schimba haotic modul de functionare in cazul in care butonul se tine apasat mai mult timp, am folosit urmatorul cod:

modified = 0;
while(!(PIND & (1<<PD6))) // cat timp este tinut apasat butonul de selectie mod functionare
{ 
    modified = 1;
}
if(modified)
{
    mode = (mode+1)%2;
}

Rezultate Obţinute

Proiectul functioneaza conform descrierii anterioare, desi uneori trebuie sa fii putin mai insistent cand vine vorba de selectarea modului de functionare.

Concluzii

  • Datorita dimensiunii mici a difuzorului, nu am avut nevoie de amplificator.
  • Proiectul este usor extensibil. Se pot adauga butoane cu diferite functionalitati si un LCD pentru afisare informatii. O idee de functionalitate aditionala este ajustarea volumului, pe care o implementasem initial in locul redarii celor 3 cantece demo.

Download

De aici puteti descarca programul, impreuna cu fisierul Makefile si cu schema .DSN: lecu_marina_minipian.zip

Bibliografie/Resurse

pm/prj2011/rtataroiu/minipian.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