This shows you the differences between two versions of the page.
pm:prj2024:ccontasel:ana_maria.diaconu02 [2024/05/27 04:10] ana_maria.diaconu02 [Hardware Design] |
pm:prj2024:ccontasel:ana_maria.diaconu02 [2024/05/27 09:19] (current) ana_maria.diaconu02 [Rezultate obținute] |
||
---|---|---|---|
Line 22: | Line 22: | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | 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. În absența oricărei acțiuni, ecranul LCD afișează mesajul „I want to sing!”. | + | 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!” cu un contor regresiv de la 1000 ms. Dacă timpul expiră înainte de finalul melodiei, apare mesajul „Time is up!”.În timpul redării unei melodii, apăsările altor butoane sunt ignorate, asigurând astfel o experiență auditivă neîntreruptă și clară. | + | 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ă. |
<note> | <note> | ||
Line 59: | Line 59: | ||
{{:pm:prj2024:ccontasel:sch_elec_amd.png?700 |}} | {{:pm:prj2024:ccontasel:sch_elec_amd.png?700 |}} | ||
<note important>Mod de conectare pini</note> | <note important>Mod de conectare pini</note> | ||
- | Arduino Uno: 5V și GND (masa): Acești pini sunt folosiți pentru a alimenta alte componente care necesită 5V. | + | **Arduino Uno:** |
- | Display LCD: | + | |
+ | 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. | VCC la 5V de pe Arduino pentru alimentare. | ||
+ | |||
GND la GND de pe Arduino. | GND la GND de pe Arduino. | ||
+ | |||
SDA la pinul A4 (SDA) pe Arduino. | SDA la pinul A4 (SDA) pe Arduino. | ||
+ | |||
SCL la pinul A5 (SCL) pe Arduino. | SCL la pinul A5 (SCL) pe Arduino. | ||
- | Buzzer: | + | |
+ | **Buzzer:** | ||
Un pin se conectează la pinul digital 2 pe Arduino | Un pin se conectează la pinul digital 2 pe Arduino | ||
+ | |||
Celălalt pin se conectează la GND. | Celălalt pin se conectează la GND. | ||
- | Modul de citire card SD: | + | |
+ | **Modul de citire card SD:** | ||
CS (Chip Select) - pinul 10 | CS (Chip Select) - pinul 10 | ||
+ | |||
MOSI (Master Out Slave In)- pinul 11. | MOSI (Master Out Slave In)- pinul 11. | ||
+ | |||
MISO (Master In Slave Out) - pinul 12. | MISO (Master In Slave Out) - pinul 12. | ||
+ | |||
SCK (Serial Clock) - pinul 13. | SCK (Serial Clock) - pinul 13. | ||
+ | |||
VCC se conectează la 5V. | VCC se conectează la 5V. | ||
- | Butoanele sunt conectate la pinii digitali 3, 4, 5, 6, 7, 8, 9 si pinii analogici A1 si A3 | + | |
+ | **Butoanele** sunt conectate la pinii digitali 3, 4, 5, 6, 7, 8, 9 si pinii analogici A1 si A3 | ||
Line 85: | Line 102: | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | <note important>Biblioteci utilizate:<Wire.h>, <LiquidCrystal_I2C.h>, <SPI.h>, <SD.h> | ||
+ | Cont de Github: https://github.com/anaMD20/Proiect_PM_Pian_digital | ||
+ | </note> | ||
+ | === Descrierea functiilor === | ||
+ | <note tip> | ||
+ | 1. setup() | ||
+ | Această funcție este apelată o singură dată la pornirea microcontrolerului. În aceasta: | ||
+ | |||
+ | 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. | ||
+ | </note> | ||
+ | |||
+ | <note important> Mai jos se regăsesc conceptele software folosite</note> | ||
+ | <note tip> | ||
+ | |||
+ | 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. | ||
+ | </note> | ||
===== Rezultate obținute ===== | ===== Rezultate obținute ===== | ||
+ | <note tip> Modul de functionare al proiectului se poate vedea in videoclipul de mai jos</note> | ||
+ | <html> <iframe width="640" height="360" src="https://youtube.com/embed/shorts/eAchCWtF-4E" title="Proiect PM Pian Digital" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> </html> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||