Proiectul constă într-un mini pian digital care folosește butoane pentru a simula clapele unui pian. La apăsarea fiecărui buton, un sunet specific notei muzicale este generat, iar nota muzicală este afișată pe un display LCD. În plus, instrumentul poate reda melodii preîncărcate de pe un card SD.
Scopul acestui proiect este de a oferi o interfață interactivă și educativă pentru învățarea notelor muzicale și pentru experimentarea cu tehnologia electronică și programarea. Este destinat atât începătorilor în muzică, cât și entuziaștilor de tehnologie.
Am pornit de la ideea de a crea un instrument muzical accesibil și portabil care să încurajeze învățarea muzicii într-un mod plăcut și interactiv. Pentru alții, acest mini pian servește ca o resursă educativă excelentă pentru a înțelege și a practica fundamentalele muzicii. Pentru noi, proiectul este o oportunitate de a dezvolta competențe în designul electronic, programarea microcontrolerelor și gestionarea dispozitivelor periferice.
Când un utilizator apasă un buton, această acțiune este detectată de microcontrollerul integrat în dispozitiv. Fiecare buton este mapat la o notă muzicală specifică, iar microcontrollerul, recunoscând butonul activat, inițiază redarea sunetului corespunzător acelei note. Concomitent, pe ecranul LCD se afișează nota care este redată. Sunetul persistă pentru durata în care butonul este menținut apăsat.
Un buton dedicat, distinct de celelalte, activează redarea unei melodii de pe cardul SD. La apăsare, melodia se redă complet, iar pe ecranul LCD se afișează „Play music!” cand este apasat butonul apoi pe LCD se pot observa notele din care este compusă melodia și duratele lor, iar la final se afișează mesajul “Melody finished!”.În timpul redării unei melodii, apăsările altor butoane sunt ignorate, asigurând astfel o experiență auditivă neîntreruptă și clară.
5V și GND (masa): Acești pini sunt folosiți pentru a alimenta alte componente care necesită 5V.
Display LCD:
VCC la 5V de pe Arduino pentru alimentare.
GND la GND de pe Arduino.
SDA la pinul A4 (SDA) pe Arduino.
SCL la pinul A5 (SCL) pe Arduino.
Buzzer:
Un pin se conectează la pinul digital 2 pe Arduino
Celălalt pin se conectează la GND.
Modul de citire card SD:
CS (Chip Select) - pinul 10
MOSI (Master Out Slave In)- pinul 11.
MISO (Master In Slave Out) - pinul 12.
SCK (Serial Clock) - pinul 13.
VCC se conectează la 5V.
Butoanele sunt conectate la pinii digitali 3, 4, 5, 6, 7, 8, 9 si pinii analogici A1 si A3
Cont de Github: https://github.com/anaMD20/Proiect_PM_Pian_digital
Se inițializează comunicarea serială pentru debug. Se încearcă inițializarea cardului SD și se afișează statusul acesteia pe Serial și LCD. Se configurează pinii butoanelor ca fiind intrări cu rezistență de pull-up, ceea ce înseamnă că citirea va fi LOW când butonul este apăsat. Se configurează pinul buzzerului ca ieșire.
2. playMelodyFromSD() Această funcție este responsabilă pentru redarea unei melodii stocate într-un fișier melody.txt de pe cardul SD. Ea:
Deschide fișierul și citește notele și duratele acestora. Folosește funcția tone() pentru a reda fiecare notă pe buzzer. Afișează notele și duratele pe LCD pe măsură ce sunt redare. Închide fișierul și afișează un mesaj final pe LCD când melodia este terminată.
3. loop() Această funcție este inima programului și se execută repetitiv. Ea:
Verifică starea fiecărui buton și, în funcție de apăsare, inițiază un timer sau decide durata apăsării. Actualizează LCD-ul la fiecare 500 ms pentru a afișa cât timp a fost apăsat un buton. Dacă butonul este eliberat, calculează durata totală a apăsării și apoi decide ce ton să redă pe buzzer.
4. evaluatePressDuration(int buttonIndex, unsigned long duration) Această funcție determină tipul de presiune realizată pe buton (scurtă, medie, lungă) și:
Alege o notă specifică în funcție de durata apăsării și indexul butonului. Apoi apelează playTone() pentru a reda nota corespunzătoare.
5. playTone(int buttonIndex, int pressType) Aceasta redă un ton specificat prin buzzer și:
Afișează nota corespunzătoare pe LCD. Dacă apăsarea a fost destul de lungă și pentru butonul specific, poate iniția redarea unei melodii de pe SD.
1. SPI (Serial Peripheral Interface): Aceasta este folosită implicit prin includerea bibliotecii <SPI.h> și utilizarea modulului SD, care comunica prin protocolul SPI cu microcontrolerul.
2. I2C (Inter-Integrated Circuit): Utilizarea unui display LCD cu control I2C (LiquidCrystal_I2C lcd(0x27, 16, 2);), care se bazează pe comunicația I2C pentru a trimite comenzi și date către display.
3. UART (Universal Asynchronous Receiver/Transmitter): Comunicarea serială prin Serial.begin(9600); este un exemplu de utilizare UART, unde microcontrolerul trimite datele la un terminal sau la un alt dispozitiv pentru debug sau afișare.
4. GPIO (General Purpose Input/Output): Se utilizează pentru citirea stării butoanelor și controlul buzzerului. Pinii sunt setați ca intrări pentru butoane cu rezistențe de pull-up și ca ieșire pentru buzzer.
5. Timere: Utilizarea funcției millis() pentru a măsura intervalul de timp în care un buton este apăsat și pentru a determina când să actualizeze afișajul LCD este un exemplu de utilizare a timerelor interne ale microcontrolerului.