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.

  • Butoanele de control: 4 butoane conectate la 4 pini de pe portul B. Rezistențele de pull-up nu mai sunt prezentate, întrucât sunt parte din ATmega324.

  • Butoanele de la claviatură: 8 butoane conectate la 5 pini de pe portul A și 3 pini de pe portul C. La fel, rezistențele de pull-up nu mai sunt prezentate.

  • LED-urile de la claviatură: sunt multiplexate pentru a economisi 2 pini I/O (aș fi folosit 8 dacă aș fi legat fiecare LED la un pin) și sunt conectate la 6 pini de pe portul D.

  • Difuzorul: conectat la unul din pinii PWM ai microcontroller-ului, anume PD7.

*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

Fișier .zip cu schemele electrice:

brinzearazvan_333cb_schemeelectrice.zip

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
pm/prj2017/ddragomir/razvan.brinzea.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