This shows you the differences between two versions of the page.
|
pm:prj2026:ciprian.popescu0411:clarisse.braviceanu [2026/05/18 23:42] 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 183: | Line 180: | ||
| **Descrierea Arhitecturii Hardware** | **Descrierea Arhitecturii Hardware** | ||
| - | Inima sistemului este placa de dezvoltare ATmega328P Xplained Mini, care face prelucrarea semnalelor pentru detectarea loviturilor și trimiterea comenzilor audio. Placa furnizează atât tensiunea de 5V pentru alimentarea principală a modulelor, cât și tensiunea de 3.3V, folosită strict ca referință logică de adresare pentru unul dintre senzori. | + | Ne folosim de placa ATmega328P Xplained Mini ca microcontroller principal, aceasta e responsabilă cu procesarea semnalelor de la senzori, controlul redării audio, comunicația Bluetooth și afișarea pe ecran. |
| - | Pentru detectarea mișcărilor și a unghiurilor de înclinare ale bețelor, sistemul utilizează două module inerțiale MPU-6050 (giroscop și accelerometru). Deoarece ambele module folosesc protocolul I2C și împart aceleași linii fizice de date (SDA pe PC4 și SCL pe PC5), a fost necesară configurarea unor adrese hardware diferite: pinul AD0 al senzorului de pe bâta stângă este conectat la GND (setând adresa la 0x68), în timp ce pinul AD0 al senzorului de pe bâta dreaptă este conectat la 3.3V (setând adresa la 0x69). Acest procedeu permite microcontrolerului să comunice independent cu ambele bețe în timp real, pe aceeași magistrală. | + | Detectarea loviturilor se realizează cu două module IMU MPU-6050 montate pe vârful bețelor, conectate pe același bus I2C (SDA/PC4, SCL/PC5). Diferențierea lor se face prin pinul AD0: senzorul bâtei stângi are AD0 la GND (adresă 0x68), cel al bâtei drepte la 3.3V (adresă 0x69). Pe același bus I2C este conectat și ecranul LCD 16x2 (adresă 0x27), care afișează stilul curent și ultima lovitură detectată. |
| - | Generarea și redarea sunetelor sunt realizate de un modul DFPlayer Mini cu card SD. Acesta comunică asincron prin interfața UART hardware cu ATmega328P (folosind pinii PD4 și PD5). Pentru a proteja pinul RX al DFPlayer-ului (care este conceput pentru niveluri logice de 3.3V) de semnalele logice de 5V emise de ATmega328P, a fost introdus un rezistor de protecție de 1kΩ pe linia de transmisie (TX spre RX). | + | Redarea sunetelor este asigurată de două module DFPlayer Mini cu card SD, câte unul per bâtă, permițând redarea simultană și independentă a sunetelor. Comunicația se face prin SoftwareSerial: DF1 pe PD4/PD5, DF2 pe PD6/PD7. Pe liniile TX ale microcontrolerului spre RX-ul DFPlayer-elor sunt plasate rezistoare de 1kΩ pentru protecția intrărilor de 3.3V față de logica de 5V a ATmega-ului. Ieșirile audio DAC_R și DAC_L ale ambelor module sunt mixate pasiv prin rezistoare de 1kΩ și dirijate spre jack-ul TRRS 3.5mm prin rezistoare de 100Ω. |
| - | Ieșirea audio analogică este preluată de la pinii DAC_R și DAC_L ai DFPlayer-ului și dirijată către un modul Jack TRRS de 3.5mm prin intermediul a două rezistoare de 100Ω. Aceste rezistoare au dublu rol: limitează curentul de ieșire și protejează convertorul digital-analog al modulului MP3. Pentru a elimina interferențele și a rezolva problema buclelor de masă (ground loops) la conectarea spre un amplificator de chitară extern, pinul GND (Sleeve) al jack-ului a fost rutat direct la pinul GND dedicat al DFPlayer-ului, izolând astfel masa de semnal audio de masa generală a microcontrolerului. | + | Transmiterea datelor despre loviturile detectate spre aplicația mobilă se realizează prin modulul Bluetooth HC-05, conectat pe PD2/PD3. Linia RXD a modulului este protejată printr-un divizor de tensiune 1kΩ+2kΩ. |
| - | În cadrul testelor, a fost identificată o a doua sursă de ground loop: diferența de potențial dintre masa laptopului conectat la priză (prin care era alimentat ATmega328P via USB) și masa amplificatorului de chitară conectat la acelasi prelungitor. Simptomul era un zgomot continuu de tip bip-bip prezent chiar și în absența loviturilor, dispărând complet în căști. Problema a fost reprodusă și diagnosticată sistematic, iar soluția aplicată a fost alimentarea plăcii ATmega din telefon sau power bank în loc de laptopul conectat la priză, eliminând astfel bucla de masă parazită dintre cele două surse. Ca alternativă permanentă pentru o versiune viitoare a circuitului, se pot adăuga condensatoare de cuplaj de 10µF pe liniile DAC_R și DAC_L, care blochează componenta DC și elimină zgomotul indiferent de sursa de alimentare. | + | Î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. |
| - | + | ||
| - | Sistemul hardware este scalabil și include deja alocarea pinilor (PD6/PD7) pentru implementarea unui modul Bluetooth HC-05 și folosirea pinilor existenți I2C pentru adăugarea unui ecran LCD 1602. | + | |
| ===== 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 224: | Line 255: | ||
| </note> | </note> | ||
| + | Link github: https://github.com/cclaryc/Aero_Beat.git | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| <note tip> | <note tip> | ||
| Line 231: | 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> | ||