This shows you the differences between two versions of the page.
pm:prj2023:apredescu:electronic_keyboard [2023/05/21 20:10] andreea.vodita [Hardware Design] |
pm:prj2023:apredescu:electronic_keyboard [2023/05/30 08:08] (current) andreea.vodita [Download] |
||
---|---|---|---|
Line 32: | Line 32: | ||
=== Schema electrică === | === Schema electrică === | ||
{{ :pm:prj2023:apredescu:hw_eagle_keyboard.png?700 |}} | {{ :pm:prj2023:apredescu:hw_eagle_keyboard.png?700 |}} | ||
+ | {{ :pm:prj2023:apredescu:arduino-piano-img2.jpeg?500 |}} | ||
- | ===== Software Design ===== | ||
+ | ===== Software Design ===== | ||
- | <note tip> | ||
Descrierea codului aplicaţiei (firmware): | Descrierea codului aplicaţiei (firmware): | ||
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * mediu de dezvoltare: Arduino IDE |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * bibliotecă 3-rd party: TMRpcm pentru redarea fișierelor WAV din cardul SD (folosește și biblioteca standard Arduino SD) |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | Implementarea constă în principal din codul pentru diferite întreruperi (butonul de switch, "clapele" și timer-ul pentru difuzor). |
- | </note> | + | |
+ | Întreruperea pentru **butonul de switch** presupune ca la apăsarea acestuia să se modifice starea lui, ciclând între 3 moduri: pian, flaut, vioară. | ||
+ | |||
+ | <code> | ||
+ | ISR(INT0_vect) { | ||
+ | // Increment switchState and wrap around if necessary | ||
+ | if (millis() - lastDebounceTime >= debounceDelay) { | ||
+ | if ((PIND & (1 << Switch)) == 0) { | ||
+ | lastDebounceTime = millis(); | ||
+ | switchState = (switchState + 1) % WAV_TYPE_COUNT; | ||
+ | Serial.println(switchState); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Pentru **clape**, la apăsarea lor se dă play la audio-ul corespondent butonului și activează variabila //soundEnabled// care este folosită pentru redarea sunetului de către difuzor. | ||
+ | |||
+ | <code> | ||
+ | ISR(PCINT2_vect) { | ||
+ | for (int i = 0; i < sizeof(buttonPins) / sizeof(buttonPins[0]); i++) { | ||
+ | if ((PIND & (1 << buttonPins[i])) == 0) { | ||
+ | // Button is pressed, play the corresponding WAV file | ||
+ | if (switchState == 0) { | ||
+ | playWavFile(pianoFiles[i]); | ||
+ | } else if (switchState == 1) { | ||
+ | playWavFile(fluteFiles[i]); | ||
+ | } else if (switchState == 2) { | ||
+ | playWavFile(violinFiles[i]); | ||
+ | } | ||
+ | soundEnabled = true; | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | soundEnabled = false; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Timer-ul **difuzorului** este de tipul Fast PWM și generează sunet atunci când primește semnal de la clape că una dintre ele este apăsată. | ||
+ | |||
+ | <code> | ||
+ | ISR(TIMER1_COMPA_vect) { | ||
+ | if (soundEnabled) { | ||
+ | // Generate sound | ||
+ | PORTB |= (1 << PB1); | ||
+ | } else { | ||
+ | // Stop sound | ||
+ | PORTB &= ~(1 << PB1); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | Cum TMRpcm nu are suport pentru redarea sunetului concurent și, în general, Arduino Uno este limitat în această privință din cauza memoriei necesare stocării mai multor fișiere audio în același timp și complexității mai mari a programului, se poate reda o singură notă în același timp. |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
+ | Dacă nu aș fi folosit fișiere audio, problema ar fi fost rezolvată. În loc ca fiecare buton să genereze un sunet la o anumită frecvență, aș fi adunat frecvențele tuturor pentru a compune o frecvență finală pe care o reda difuzorul. | ||
+ | |||
+ | O altă problemă întâmpinată a fost faptul că anumite întreruperi interferau unele cu altele. Astfel, în loc să folosesc PCINT0 pentru întreruperea specifică butonului de Switch, din cauză că nu funționa corect împreună cu TIMER1, folosit la difuzor, am modificat la o întrerupere externă, INT0. | ||
+ | |||
+ | Rezultatele sunt cele așteptate: la apăsarea butoanelor se redă sunetul corespunzător și ciclează printre fișierele audio prin folosirea butonului de Switch. Totuși, având în vedere difuzorul folosit, sunetele sunt neclare. Acesta este un lucru pe care l-aș schimba cu siguranță pentru a îmbunătăți proiectul. | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Proiectul demonstrează utilizarea modulului de card SD pentru a stoca si a prelua fișiere audio, biblioteca TMRpcm pentru redarea audio și utilizarea întreruperilor pentru a gestiona evenimentele de intrare. | ||
+ | |||
+ | Poate fi folosit în diverse aplicații în care este necesară redarea audio, cum ar fi playere muzicale, sisteme de efecte sonore, instalații interactive și proiecte educaționale. | ||
+ | |||
+ | Realizând acest proiect am învățat multe lucruri pe care nu le cunoșteam înainte și am întâmpinat probleme atât hardware, cât și software pe care nu le anticipasem. M-a făcut să am mai multă apreciere și respect pentru persoanele care lucrează cu astfel de module. | ||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | Arhiva conține codul sursă și sample-urile de note. |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
+ | {{:pm:prj2023:apredescu:piano.zip|}} | ||
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | ||
- | </note> | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
- | <note tip> | + | * 7.05.2023 - Introducere + Descriere generală |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | * 21.05.2023 - Hardware |
- | </note> | + | * 28.05.2023 - Software |
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | Resurse Hardware: |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * Set-up inițial al unui mini-pian: https://projecthub.arduino.cc/rahulkhanna/arduino-tutorial-mini-piano-0c7ec5 |
- | </note> | + | * Laboratoare de PM (în special SPI pentru conectarea corectă a modulului SD) |
+ | |||
+ | Resurse Software: | ||
+ | * Sample de note pentru vioară: https://depositonce.tu-berlin.de/items/f81ba73c-4d9b-48de-9fbc-31cb03d5b9bc | ||
+ | * Sample de note pentru flaut: https://freesound.org/people/MTG/packs/20209/ | ||
+ | * Sample de note pentru pian: https://pixabay.com/sound-effects/search/piano-notes/ | ||
+ | * Biblioteca TMRpcm: https://www.arduinolibraries.info/libraries/tm-rpcm | ||
+ | * Laboratoare de PM | ||
+ | * Forumuri Arduino | ||
+ | * Multe conversații cu ChatGPT | ||
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||