Răzvan-Ștefan BRÎNZEA (66834) - Profesorul de pian
Autorul poate fi contactat la adresa: Login pentru adresa
Introducere
Scopul acestui proiect este de a crea un pian electric simplu care poate să și învețe utilizatorul să cânte diferite melodii. Deși nu este menit să fie un înlocuitor pentru un pian adevărat și pentru lecții de pian oferite de un profesor uman, ar putea fi o „jucărie” destul de interesantă, indiferent de înclinația muzicală a fiecăruia.
Descriere generală
Pe lângă funcționalitatea sa de bază, anume redarea unor note la apăsarea unor butoane de pe claviatură, pianul va putea reda secvențe de melodii, la tempo-uri diferite, indicând notele prin intermediul unor LED-uri plasate lângă butoane. Astfel, crescând tempo-ul până la nivelul real și exersând, oricine ar putea învăța să cânte câteva melodii simple.
Butoanele disponibile (și notele aferente) vor reprezenta 8 note dintr-o singură octavă, practic o „porțiune” de pian echivalentă cu cele 8 clape albe din următoarea imagine:
Schema bloc
*revizuit pe 24.05.2017
Câteva detalii despre fiecare modul și felul în care interacționează:
Modulul „Butoane de control” va avea o serie de butoane care controlează funcționarea pianului. Un buton, MODE, va cicla printre diferitele seturi de opțiuni reglabile: listă de melodii, tempo, secțiune a melodiei, octavă și durata pauzei dintre note. Două butoane, UP și DOWN vor modifica valoarea opțiunii curente (de exemplu, dacă primul buton a fost folosit pentru a alege lista de cântece, aceste butoane vor permite ciclarea prin listă). În plus, va exista un buton PLAY care va reda secțiunea curentă a cântecului selectat (sau cântecul întreg, dacă a fost selectată această opțiune).
Modulul „Claviatură” va cuprinde 8 butoane și 8 LED-uri (corespunzătoare 8 tonuri dintr-o octavă). La apăsarea unui buton, difuzorul va emite o notă muzicală. În plus, atunci când pianul redă o secvență dintr-o melodie, LED-urile corespunzătoare notelor care sunt redate vor fi aprinse pentru a îi indica utilizatorului pe ce butoane trebuie să apese pentru a repeta secțiunea din melodie.
Difuzorul va emite note muzicale atunci când sunt apăsate butoane de pe claviatură sau când se redau porțiuni de melodii
Pe ecranul LCD vor fi afișate informații despre melodia curentă, tempo-ul curent și secțiunea din melodie care este selectată
*revizuit pe 24.05.2017
Hardware Design
Listă finală de piese
Nume | Număr de piese |
Placa de bază cu ATMega324A-PU | 1 |
LED-uri claviatură | 8 |
Butoane (control + claviatură) | 12 |
Rezistențe 1KΩ | 6 |
Difuzor 8Ω | 1 |
Condensator 100 uF | 1 |
Ecran LCD text | 1 |
*revizuit pe 24.05.2017
Scheme electrice
Later Edit: Plecând de la sugestiile oferite de Dan, am modificat câteva dintre schemele electrice pentru a folosi alți pini de intrare/ieșire.
Pe lângă placa de bază, am structurat proiectul în câteva module ale căror scheme le voi prezenta independent.
Interfațarea cu ecranul LCD: ecranul pe care l-am cumpărat este un PC1602A, pe care îl conectez foarte simplu la Header-ul LCD de pe placă. Pinii 15 și 16 ai ecranului (17 și 18 în figură, pentru că nu am găsit exact schema de care aveam nevoie) îi conectez la VCC și, respectiv, la GND, pentru a porni backlight-ul ecranului.
*revizuit pe 24.05.2017, deși schemele electrice din pagină sunt momentan neschimbate. Urmând linkul oricărei dintre scheme, se poate vedea varianta actualizată.
Software Design
Mediul de dezvoltare
Mediul de dezvoltare a fost unul foarte simplu. Am lucrat pe Windows 10, folosind:
Biblioteci folosite
Singura bibliotecă externă pe care am folosit-o a fost una pentru interfațarea cu ecranul LCD text. Am preluat biblioteca lcd.c și lcd.h din scheletul laboratorului 0, modificând doar câteva definiții din biblioteca lcd.h, întrucât pe placa noastră sunt folosiți alți pini pentru header-ul LCD decât cei din laborator.
Alte mențiuni referitoare la cod
Pe scurt, voi enumera câteva dintre principalele decizii pe care le-am luat atunci când am scris codul pentru proiect:
difuzorul este legat la pinul PB4, motiv pentru care pentru redarea notelor se folosește timer-ul 0, cu întreruperi la OCRB și la overflow. Prin modificarea valorilor pentru OCR0A și OCR0B, stabilesc frecvența notei care trebuie redată.
cele patru butoane de control sunt tratate prin intermediul întreruperii externe corespunzătoare (PCINT1).
cele opt butoane pentru claviatură nu sunt tratate prin întreruperi, ci prin polling constant în main (un while(1) cu un delay de 1 ms). Am ales această soluție pentru a putea reacționa și la momentul în care un buton este eliberat, pentru a opri redarea notei respective.
aplicația funcționează ca un automat de stări, ciclarea printre aceste stări făcându-se folosind butonul MODE. Stările sunt INTRO (afișarea numelui și grupei), SONG_SELECT (selectarea unei melodii din listă), SECTION_SELECT (selectarea unei secțiuni din melodie), PAUSE_SELECT (selectarea lungimii pauzei dintre note), OCTAVE_SELECT (selectarea octavei, din cele 3 posibilități incluse), DURATION_SELECT (selectarea duratei unei note, pentru melodiile preîncărcate)
pentru melodiile care pot fi redate, am decis să reduc din complexitatea montajului, motiv pentru care am renunțat la ideea de a le citi de pe un card SD (care nu ar fi fost greu de realizat, ar fi trebuit doar să folosesc biblioteca din laborator și să citesc din fișiere informațiile despre melodii)
adăugarea de melodii noi nu este dificilă. Pentru a face acest lucru, trebuie declarată o nouă variabilă de tipul song_t, inițializată cu valorile corespunzătoare și adăugată în lista de melodii.
Rezultate Obţinute
Din cauza unor probleme cu contrastul ecranului LCD, scrisul de pe el nu este foarte vizibil în poze și în filmări. Totuși, se vede destul de clar în realitate.
Montajul final:
Redarea unei melodii întregi:
AljEVS83f2Y
Redarea unei secvențe de melodie, cu pauze mai mare între note:
ycO5TEXMgCI
Concluzii
Consider că proiectul a fost una dintre cele mai interesante și distractive experiențe de învățare oferite până acum de această facultate. Trecând prin toate etapele (lipirea pieselor pe placa de bază, creerea schemelor electrice, realizarea montajului pe baza schemelor), am învățat multe lucruri noi, m-am distrat, m-am fript cu letconul, și până la urmă am ajuns la un rezultat de care sunt foarte mulțumit. A fost pentru prima dată când am pus mâna pe multe dintre uneltele și piesele pe care le-am folosit, și probabil voi mai încerca să realizez și alte proiecte de acest gen în timpul meu liber.
În ceea ce privește părțile hardware și software, concluzia mea principală este că am avut așteptări destul de realiste, și că am ajuns la un rezultat final care este în proporție de 90% exact ceea ce speram să obțin.
Download
Scheme electrice
Cod sursă
Fișier .zip care conține:
proiect.c: codul efectiv scris de mine
lcd.h: preluat din laborator, cu mici modificări
lcd.c: preluat din laborator
Makefile
brinzearazvan_333cb_codsursa.zip
Bibliografie/Resurse
Documentația în format
PDF