Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul meu este un mini-pian elelectric cu posibilitatea de înregistarea a melodiilor și redare a ultimei melodii înregistrate de oricâte ori. Pianul are o “claviatură” formată din 8 butoane, reprezentând o octavă (gama DO major). Deasemenea, are 2 butoane, REC și PLAY care permit înregistrarea și redarea unei melodii.
Scopul proiectului este pentru mine acela de a învăța și a mă juca în același timp.
Ideea mi-a venit uitându-mă pe listele cu proiecte din anii trecuți. Acesta mi-a atras atenția în mod special pentru că aveam câteva noținui de bază legate de cântatul la pian și mi s-a părut interesant să pot să îmbin aceste cunoștințe cu partea tehnică.
Este util pentru a te juca cu el și, eventual, a învăța cântece simple, care se pot interpreta într-o octavă.
Pentru mine, a fost deasemenea util pentru a învăța mai multe despre circuitele electrice. Am văzut ce probleme pot apărea, atât hardware, (lipituri greșite, scurt-uri) cât și software (folosirea greșită a regiștrilor, alte bug-uri) și am reușit să găsesc rezolvări pentru acestea.
Mai sus, se poate vedea schema bloc a proiectului. Practic proiectul este constituit din:
Componentă | Cantitate | Preț total |
Placă | 1 | 10 lei |
Speaker | 1 | 7.5 lei |
Led roșu | 1 | 0.5 lei |
Fire legătură | 1m | 0.5 lei |
Condensator | 1 | 1 leu |
Butoane | 10 | 6 lei |
În implemntarea mea, proiectul se poate alfa în una dintre cele 3 stări la un moment de timp:
Starea ințială este SING
, iar aceasta se modifică în funcție de secvențele de control primite. Mai jos se poate vedea diagrama de stări:
Pentru implementare am folosit porțiuni de cod din laborator. Deasemenea, pentru a-mi face o idee mai clară și a vedea care sunt frecvențele pentu gama DO major, m-am uitat și pe implemntările din anii trecuți.
Am setat un timer care se declanșează la 10ms și execută codul de întrerupere. Acolo se găsește toată logica programului.
Pentru a cânta o notă, la fiecare înterupere se vede care dintre butoanele din claviatură au fost apăsate și se setează în PWM frecvența corespunzătoare dintr-un vector predefinit de frecvențe.
Intern, soft-ul va trebui să rețină ultima melodie înregistrată. Pentru a codifica o melodie am folosit vectori de structuri de forma:
struct sound { uint8_t note; uint32_t count; };
unde:
note
reprezintă indicele notei, poate fi un număr întreg în intervalul [0, 7] pentru o notă din gama DO major. Deasemenea, mai poate avea valorile PAUSE_NOTE și UNDEFINED_NOTE.count
reprezintă numărul de “întreruperi” pentru care nota este cântată
În starea de RECORD
se ia nota curentă (poate fi și PAUSE_NOTE) și se verifică dacă ultima notă salvată este aceeași cu nota curentă. Dacă da, se incrementează count-ul. Dacă nu, se adaugă nota pe poziția următoare a vectorului de record.
Când se activează starea de PLAY
, întreg vectorul de record este copiat într-un vector de play. La fiecare întrerupere, se cântă nota curentă din vectorul de play, până la finalul înregistrării, când se trece înapoi instarea de SING.
Partea de software a fost făcută pe un sistem Debian
GNU/Linux utilizând Vim
.
Am folosit bibliotecile precizate în laborator, și anume:
Am folosit Bootloader-ul pus la dispoziție pe wiki pe care l-am compilat din surse.
A fost prima dată când am lucrat la un proiect de genul acesta și sunt foarte fericită că am reușit să-l duc la final. Am făcut design-ul circuitului intuitiv (fără prea multe cunoștințe de elecrtonică) și chiar a mers din prima. Partea de software a mers foarte bine, am plecat de la scheletul de laborator și am adăugat funcționalități.
Singura parte proastă este că nu am avut conectori, am căutat la mai multe magazine dar nu am găsit, și a trebuit să lipesc toate firele pe placă. Din această cauză, proiectul nu este atât de estetic cum aș fi vrut să fie.
În concluzie, eu sunt foarte mulțumită de rezultatele obținute.