This shows you the differences between two versions of the page.
|
pm:prj2026:ciprian.popescu0411:clarisse.braviceanu [2026/05/18 23:44] clarisse.braviceanu [Hardware Design] |
pm:prj2026:ciprian.popescu0411:clarisse.braviceanu [2026/05/25 04:23] (current) clarisse.braviceanu [Rezultate Obţinute] |
||
|---|---|---|---|
| Line 15: | Line 15: | ||
| una dintre cele 3 tobe virtuale asociate fiecărei bețe (stânga, mijloc, dreapta) și | una dintre cele 3 tobe virtuale asociate fiecărei bețe (stânga, mijloc, dreapta) și | ||
| redă în timp real sunetul corespunzător printr-un amplificator de chitară. Simultan, un LED RGB se | redă în timp real sunetul corespunzător printr-un amplificator de chitară. Simultan, un LED RGB se | ||
| - | aprinde și o aplicație mobilă evidențiază vizual toba lovită sau chiar oferind un joc de tip wack-a-mole sau PianoTiles. | + | aprinde și o aplicație mobilă evidențiază vizual toba lovită sau chiar un visualiser. |
| **Ce face:** | **Ce face:** | ||
| Line 21: | Line 21: | ||
| Sistemul detectează lovitura, identifică toba vizată pe baza direcției de mișcare, | Sistemul detectează lovitura, identifică toba vizată pe baza direcției de mișcare, | ||
| redă sunetul corespunzător, aprinde LED-ul RGB și trimite informația către o aplicație | redă sunetul corespunzător, aprinde LED-ul RGB și trimite informația către o aplicație | ||
| - | mobilă care afișează vizual toba activată. Exista si un buton care schimba genul tobelor (jazz, rock etc.) | + | mobilă care afișează vizual toba activată. Exista si un buton care schimba genul tobelor (metal, rock etc.) si unu care pune pauza. |
| **Scopul proiectului:** | **Scopul proiectului:** | ||
| Crearea unui instrument de percuție virtual care să ofere experiența cântatului la | Crearea unui instrument de percuție virtual care să ofere experiența cântatului la | ||
| - | tobe fără a necesita o baterie fizică — fără zgomot mecanic, fără spațiu ocupat și | + | tobe fără a necesita o baterie fizică, fără zgomot mecanic, fără spațiu ocupat și |
| fără a deranja pe nimeni din jur. | fără a deranja pe nimeni din jur. | ||
| Line 35: | Line 35: | ||
| **De ce este util:** | **De ce este util:** | ||
| - | * Pentru muzicieni începători sau avansați care vor să exerseze fără investiție | + | * Pentru muzicieni începători sau avansați care vor să exerseze fără investiție majoră în echipament și fără probleme de zgomot |
| - | majoră în echipament și fără probleme de zgomot | + | * Pentru persoanele care locuiesc la apartament sau în spații unde zgomotul este o problemă reală (copii mici, vecini, program de noapte) |
| - | * Pentru persoanele care locuiesc la apartament sau în spații unde zgomotul este | + | |
| - | o problemă reală (copii mici, vecini, program de noapte) | + | |
| | | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| Line 45: | Line 43: | ||
| Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | ||
| </note> | </note> | ||
| - | {{:pm:prj2026:ciprian.popescu0411:image_2026-05-09_042252584.png?600|}} | + | {{:pm:prj2026:ciprian.popescu0411:schemabloc.png?700|}} |
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| Line 68: | Line 65: | ||
| * 2 x bețe de tobă (suport fizic pentru senzori) | * 2 x bețe de tobă (suport fizic pentru senzori) | ||
| * 2 x Modul de buton fara retinere | * 2 x Modul de buton fara retinere | ||
| - | * Rezistoare, fire, breadboard | + | * Rezistoare, fire, breadboard, 2 carduri de memorie microSD |
| **Schema electrica:** | **Schema electrica:** | ||
| - | {{:pm:prj2026:ciprian.popescu0411:sch_schematic1_1-p1_2026-05-18_2_.png?500|}} | + | {{:pm:prj2026:ciprian.popescu0411:sch_schematic1_1-p1_2026-05-18_2_.png?800|}} |
| Line 193: | Line 190: | ||
| În cadrul testelor a fost identificată și rezolvată o problemă de ground loop audio: alimentarea ATmega-ului din laptopul conectat la priză, simultan cu amplificatorul de chitară, genera un zgomot continuu cauzat de diferența de potențial dintre cele două mase. Soluția aplicată a fost alimentarea plăcii din telefon sau power bank. GND-ul jack-ului audio este rutat direct la GND-ul DFPlayer-ului, izolând masa de semnal audio de restul circuitului. | În cadrul testelor a fost identificată și rezolvată o problemă de ground loop audio: alimentarea ATmega-ului din laptopul conectat la priză, simultan cu amplificatorul de chitară, genera un zgomot continuu cauzat de diferența de potențial dintre cele două mase. Soluția aplicată a fost alimentarea plăcii din telefon sau power bank. GND-ul jack-ului audio este rutat direct la GND-ul DFPlayer-ului, izolând masa de semnal audio de restul circuitului. | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | <note tip> | ||
| - | Descrierea codului aplicaţiei (firmware): | ||
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | ||
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | ||
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | ||
| - | * (etapa 3) surse şi funcţii implementate | ||
| - | </note> | ||
| **Mediu de dezvoltare:** | **Mediu de dezvoltare:** | ||
| * PlatformIO (VS Code) cu framework Arduino pentru ATmega328P | * PlatformIO (VS Code) cu framework Arduino pentru ATmega328P | ||
| * Board: ATmega328P Xplained Mini, upload via xplainedmini programmer | * Board: ATmega328P Xplained Mini, upload via xplainedmini programmer | ||
| + | * Monitor serial la 57600 baud pentru debug în timp real | ||
| **Librării folosite:** | **Librării folosite:** | ||
| - | * Wire.h — comunicație I2C cu MPU-6050 (Lab 6) | + | * Wire.h — comunicație I2C nativă cu MPU-6050 #1, #2 și LCD |
| - | * Arduino.h — framework de bază | + | * SoftwareSerial.h — emulare UART pe pini digitali pentru DFPlayer #1, DFPlayer #2 și HC-05 Bluetooth |
| + | * DFRobotDFPlayerMini — librărie 3rd-party pentru controlul modulelor MP3 prin protocolul serial DFPlayer (comenzi play, stop, loop, volume, EQ) | ||
| + | * LiquidCrystal_I2C — librărie 3rd-party pentru controlul ecranului LCD 16x2 prin interfața I2C | ||
| + | |||
| + | **Algoritmi și structuri de date:** | ||
| + | |||
| + | Detectarea loviturilor se bazează pe o mașină de stări cu trei stări per bâtă (READY → DETECTING → COOLING), implementată în funcția process(). La fiecare iterație de 5ms, microcontrolerul citește accelerația brută de la MPU-6050 și calculează magnitudinea vectorului de accelerație (|dx| + |dy| + |dz|). Dacă aceasta depășește pragul HIT_THRESHOLD (6000 LSB, corespunzând la aproximativ 1.5g în modul ±8g), starea trece în DETECTING. În fereastra de detecție (6 samples × 5ms = 30ms), firmware-ul urmărește peak-ul pozitiv și negativ pe axa Y. Direcția loviturii (STANGA, MIJLOC, DREAPTA) se determină prin compararea celor două peak-uri la finalul ferestrei. Starea COOLING previne detectarea multiplă a aceleiași lovituri, cu un timeout de 250ms sau 2 samples calme consecutive. | ||
| + | |||
| + | Fiecare bâtă este reprezentată printr-o structură Bat care grupează adresa I2C, un pointer la instanța DFPlayer corespunzătoare, offset-urile de calibrare, starea mașinii și valorile de peak. | ||
| + | |||
| + | Sunetele redate depind de stilul activ (ROCK sau METAL), calculat dinamic ca offset față de numărul de fișier de bază: stilul ROCK folosește fișierele 1-3 pe ambele carduri, stilul METAL folosește fișierele 4-6 pe DF1 și 5-7 pe DF2. | ||
| + | |||
| + | LED-ul RGB este controlat printr-un algoritm de fade non-blocant bazat pe funcția stepTo(), care interpolează liniar valorile curente spre valorile țintă cu 8 pași per iterație (aproximativ 160ms per tranziție completă). | ||
| + | |||
| + | **Surse și funcții implementate:** | ||
| + | |||
| + | * mpu_init(addr) — inițializează MPU-6050: dezactivare sleep, configurare ±8g, DLPF 44Hz | ||
| + | * calibrate(bat) — calculează offset-urile de repaus prin medierea a 200 de samples la pornire | ||
| + | * mpu_read(addr, ax, ay, az) — citește cei 6 bytes de accelerometru prin I2C | ||
| + | * process(bat) — rulează mașina de stări de detecție pentru o bâtă | ||
| + | * classify(bat) — determină direcția loviturii, redă sunetul corespunzător, actualizează LCD, trimite date pe Bluetooth și setează culoarea LED-ului | ||
| + | * setLedColor(r, g, b) / updateLed() — controlul non-blocant al LED-ului RGB cu fade smooth | ||
| + | * setup() — inițializare hardware: LED, butoane, I2C, LCD, ambele DFPlayer-e cu debug complet, Bluetooth, MPU-uri, calibrare | ||
| + | * loop() — buton pauză/resume cu melodie pe loop, buton schimbare stil, procesare senzori, actualizare LED | ||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| - | <note tip> | ||
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | ||
| - | </note> | ||
| + | Proiectul funcționează. Lovești în aer cu două bețe și se aude ca și cum ai fi un toboșar, doar că nu ești, și nici nu ai fi fără acest sistem. | ||
| + | |||
| + | Concret: | ||
| + | * Ambele bâte detectează corect direcția loviturii (stânga, mijloc, dreapta) în timp real | ||
| + | * Sunetele celor două bâte se redau simultan fără interferențe | ||
| + | * Schimbarea stilului între ROCK și METAL funcționează instantaneu | ||
| + | * LED-ul RGB confirmă vizual fiecare lovitură cu tranziții de culoare smooth | ||
| + | * Aplicația Android afișează în timp real toba lovită și vizualizatorul audio reacționează la fiecare impact | ||
| + | * Ecranul LCD afișează stilul activ și ultima lovitură detectată | ||
| + | * Butonul de pauză oprește detecția și pornește o melodie pe loop, util când vrei să te prefaci că știi să cânți la chitară | ||
| + | |||
| + | |||
| + | Scheletul produsului final: | ||
| + | |||
| + | {{:pm:prj2026:ciprian.popescu0411:aerobeatfinal.jpeg?800|}} | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | Proiectul demonstrează că un instrument muzical de percuție virtual poate fi construit cu componente accesibile și un microcontroler de clasă entry-level. ATmega328P s-a dovedit suficient pentru a gestiona simultan două magistrale I2C, trei instanțe SoftwareSerial și un algoritm de detecție în timp real, fără întârzieri perceptibile. | ||
| + | |||
| + | Principalele provocări tehnice întâlnite au fost gestionarea conflictelor dintre instanțele SoftwareSerial, eliminarea ground loop-ului audio și calibrarea pragurilor de detecție pentru a obține un echilibru între sensibilitate și rata de detecții false. Fiecare problemă a fost diagnosticată și rezolvată iterativ direct pe hardware. | ||
| + | |||
| + | Ca direcții de dezvoltare ulterioară, sistemul poate fi extins cu un al doilea canal Bluetooth dedicat transmisiei audio wireless, înlocuirea SoftwareSerial cu hardware UART pentru o comunicație mai robustă și adăugarea unui mod de înregistrare a secvențelor de lovituri. | ||
| + | |||
| + | În ansamblu, proiectul acoperă cu succes noțiunile din laboratoarele de GPIO, UART, Timere/PWM și I2C, integrându-le într-un sistem funcțional și, cel mai important, unul pe care îl poți folosi efectiv la o petrecere dacă oamenii sunt suficient de politicoși să nu comenteze. | ||
| ===== Download ===== | ===== Download ===== | ||
| <note warning> | <note warning> | ||
| Line 222: | Line 255: | ||
| </note> | </note> | ||
| + | Link github: https://github.com/cclaryc/Aero_Beat.git | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| <note tip> | <note tip> | ||
| Line 229: | Line 263: | ||
| * Săptămâna 1: Alegerea componentelor, testare conectivitate I2C cu MPU-6050 | * Săptămâna 1: Alegerea componentelor, testare conectivitate I2C cu MPU-6050 | ||
| * Săptămâna 2: Implementare algoritm de detecție lovitură, calibrare pe axa Y | * Săptămâna 2: Implementare algoritm de detecție lovitură, calibrare pe axa Y | ||
| - | * Săptămâna 4: Integrare DFPlayer Mini, LED RGB, aplicație mobilă (în progres, 50% done) | + | * Săptămâna 4: Integrare DFPlayer Mini, LED RGB, aplicație mobilă |
| - | * Săptămâna 5: Integrare Ecran LED, buton pentru schimbarea genului tobelor, modul Bluetooth pentru conectivitate mai usoara intre boxa sau telefon (în progres) | + | * Săptămâna 5: Integrare Ecran LED, buton pentru schimbarea genului tobelor. |
| + | * Last 100m : Buton pentru pause/start, muzica de fundal pause | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| - | <note> | ||
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | ||
| - | </note> | ||
| **Resurse Hardware:** | **Resurse Hardware:** | ||
| * MPU-6050 Product Specification — InvenSense | * MPU-6050 Product Specification — InvenSense | ||
| + | * MPU-6050 Register Map and Descriptions — InvenSense (RM-MPU-6000A) | ||
| * ATmega328P Xplained Mini User Guide — Microchip (DS50002659B) | * ATmega328P Xplained Mini User Guide — Microchip (DS50002659B) | ||
| + | * ATmega328P Datasheet — Microchip | ||
| * DFPlayer Mini Datasheet — DFRobot | * DFPlayer Mini Datasheet — DFRobot | ||
| * GY-521 Module Schematic | * GY-521 Module Schematic | ||
| + | * HC-05 Bluetooth Module AT Command Set | ||
| + | * LiquidCrystal I2C — HD44780 Controller Datasheet | ||
| **Resurse Software:** | **Resurse Software:** | ||
| * Arduino Wire Library Documentation — https://www.arduino.cc/en/reference/wire | * Arduino Wire Library Documentation — https://www.arduino.cc/en/reference/wire | ||
| + | * Arduino SoftwareSerial Library — https://www.arduino.cc/en/Reference/SoftwareSerial | ||
| * PlatformIO Documentation — https://docs.platformio.org | * PlatformIO Documentation — https://docs.platformio.org | ||
| - | * MPU-6050 Register Map — InvenSense RM-MPU-6000A | + | * DFRobotDFPlayerMini Library — https://github.com/DFRobot/DFRobotDFPlayerMini |
| + | * LiquidCrystal_I2C Library — https://github.com/johnrickman/LiquidCrystal_I2C | ||
| + | * Android Bluetooth SPP Development — https://developer.android.com/guide/topics/connectivity/bluetooth | ||
| + | * ATmega328P PWM and Timer Registers — https://www.arduino.cc/en/Reference/AnalogWrite | ||
| <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> | ||