Proiectul constă în realizarea unui instrument muzical interactiv de tip harpă, care utilizează fotorezistențe (LDR) pe post de corzi. Prin întreruperea razei de lumină ce cade pe senzori, microcontrolerul detectează „ciupirea” corzii și generează nota muzicală corespunzătoare.
Proiectul integrează un display color LCD TFT (ST7735) comunicând prin protocolul SPI. Acesta oferă o interfață grafică (meniu) controlată prin 3 butoane tactile, permițând utilizatorului să:
• Schimbe gama muzicală (ex. Do major, La minor).
• Modifice octava curentă.
• Ajusteze pragul de sensibilitate al senzorilor (pragul ADC).
Implementarea software va fi realizată exclusiv prin lucru direct cu regiștrii ATmega328P, utilizând Timere pentru generarea semnalului sonor (Hardware PWM), ADC în mod multiplexat pentru citirea rapidă a senzorilor și protocolul SPI pentru controlul ecranului.
Lista de componente hardware Sistemul este compus din următoarele elemente hardware:
• 1 x Placă de dezvoltare ATmega328P Xplained Mini
• 1 x Display LCD TFT ST7735 1.8” SPI
• 4 x Fotorezistor (GL5528) 5mm
• 1 x Modul Buzzer pasiv
• 3 x Buton tactil PCB 6x6mm
• Componente pasive de bază: breadboard 400 puncte, set fire Dupont (Tată-Tată, Tată-Mamă), rezistoare 10kΩ pentru divizoarele de tensiune.
Schema electrică și conexiuni
Circuitul a fost proiectat pentru a minimiza latența și a asigura o citire precisă a senzorilor. Conexiunile principale sunt structurate astfel:
Sistemul de achiziție (Corzile optice): Este format din 4 fotorezistoare conectate în configurație de divizor de tensiune cu 4 rezistoare de 10kΩ. Punctul median al fiecărui divizor este conectat la pinii analogici ai microcontrolerului (PC0 - PC3 corespunzători A0 - A3). La acoperirea senzorului, valoarea rezistenței LDR crește, determinând o scădere a tensiunii citite de modulul ADC.
Interfața de control (Butoanele): Cele 3 butoane tactile sunt conectate la pinii digitali PD2, PD3 și PD4. Acestea au fost configurate folosind rezistențele interne de tragere la pozitiv (pull-up) ale microcontrolerului (INPUT_PULLUP), circuitul închizându-se la masă (GND) în momentul apăsării (logic LOW).
Feedback-ul vizual (Display ST7735): Ecranul TFT comunică prin protocolul hardware SPI pentru a asigura un refresh rapid al meniului. Au fost utilizați pinii dedicați: PB5 (SCK), PB3 (MOSI), PB2 (CS), PB1 (RES) și PB0 (DC).
Feedback-ul auditiv (Buzzer): Modulul buzzer este conectat la pinul PD5. Sunetul este generat strict hardware, controlând frecvența prin modularea lățimii impulsurilor (PWM) via Timer intern.
Validare și simulare
Validarea funcționării componentelor și calibrarea pragurilor ADC (sensibilitatea la lumină) au fost realizate empiric, direct pe breadboard, prin testare succesivă și monitorizarea valorilor via UART / Ecran. Această metodă a permis o ajustare fină a răspunsului senzorilor în condiții reale de iluminare ambientală, eliminând necesitatea unei simulări software preliminare (precum Proteus) pentru calibrarea divizoarelor de tensiune.
Acest capitol detaliază arhitectura firmware-ului dezvoltat pentru proiectul „Harpa Optică”, incluzând mediul de dezvoltare, librăriile externe utilizate, precum și descrierea algoritmilor și a funcțiilor implementate pentru controlul componentelor hardware.
Mediul de dezvoltare
Proiectul a fost dezvoltat și compilat folosind:
IDE: Visual Studio Code cu extensia PlatformIO. Acest mediu oferă un control mai precis asupra procesului de compilare (toolchain-ul avr-gcc) și a gestionării dependențelor comparativ cu Arduino IDE.
Framework: Arduino Core pentru AVR, facilitând abstractizarea de bază a unor pini, deși pentru funcțiile critice de timp s-a apelat la manipularea directă a regiștrilor.
Upload Protocol: Programarea microcontrolerului ATmega328P de pe placa Xplained Mini s-a realizat direct prin interfața USB folosind utilitarul integrat (upload_flags = -Pusb).
Integrarea cunoștințelor din laboratoare
Dezvoltarea aplicației se bazează puternic pe conceptele studiate pe parcursul semestrului. În mod specific, au fost aplicate cunoștințele din următoarele 3 laboratoare majore:
Laboratorul 3: Timere. PWM - Folosit pentru generarea semnalului audio. S-a renunțat la funcțiile blocante de software în favoarea configurării directe a Timer-ului 2 în modul Fast PWM, generând semnalul direct pe pinul hardware OC2B.
Laboratorul 4: ADC - Utilizat pentru preluarea datelor de la senzorii optici (LDR). Citirea celor 4 corzi se face într-o buclă, utilizând multiplexorul intern al modulului ADC pentru a scana secvențial pinii PC0-PC3 cu o latență minimă.
Laboratorul 5: SPI - Aplicat pentru comunicarea cu ecranul TFT ST7735. S-a folosit interfața SPI hardware a microcontrolerului (pinii MOSI, SCK, CS) pentru a asigura o lățime de bandă suficientă pentru redesenarea rapidă a meniului și a graficelor.
Librării și surse 3rd-party
Pentru a eficientiza dezvoltarea părții grafice și a comunicării SPI, au fost integrate următoarele librării open-source, gestionate prin fișierul platformio.ini:
Adafruit_GFX (de la Adafruit): O librărie grafică de bază, independentă de hardware, folosită pentru trasarea primitivelor geometrice (linii, dreptunghiuri) și randarea textului pe ecran.
Adafruit_ST7735 (de la Adafruit): Driver-ul specific pentru controller-ul ecranului TFT. Acesta preia comenzile din librăria GFX și le traduce în pachete de date SPI înțelese de display-ul fizic.
SPI.h (Standard Arduino): Inclusă pentru a inițializa bus-ul hardware SPI necesar librăriilor Adafruit.
Algoritmi și structuri de date implementate
Logica programului nu se bazează pe sisteme de operare în timp real (RTOS), ci pe o arhitectură de tip Super-Loop combinată cu un Automat cu Stări Finite (FSM - Finite State Machine):
State Machine pentru Meniu: Navigarea se face printr-o mașină de stări controlată de variabila paginaMeniu (cu valori de la 0 la 4). Aceasta dictează ce informații sunt randate pe ecran de funcția updateEcran() și cum sunt interpretate apăsările butoanelor.
Algoritm de calcul pentru Hardware PWM: Pentru funcția customTone, s-a implementat un algoritm care primește frecvența dorită (în Hz) și calculează dinamic valoarea TOP pentru registrul OCR2A folosind formula modului Fast PWM, ținând cont de frecvența procesorului ($16 MHz$) și de un prescaler de $256$. Factorul de umplere este menținut automat la $50\%$ prin setarea OCR2B = OCR2A / 2.
Debouncing Software: Apăsarea butoanelor este filtrată prin întârzieri scurte, prevenind înregistrările multiple false cauzate de imperfecțiunile mecanice ale contactelor.
Surse și funcții implementate
Aplicația principală (main.cpp) este modularizată în următoarele funcții cheie:
setup(): Rulează o singură dată la pornire. Inițializează comunicarea serială pentru debug, configurează pinii butoanelor cu rezistențe interne de pull-up și inițializează ecranul TFT (rotație, fundal, prim-plan).
loop(): Bucla principală de execuție. Pollează continuu starea butoanelor pentru modificarea stărilor, scanează array-ul de senzori ADC și verifică dacă vreunul a depășit pragul (umbră). În funcție de rezultat, declanșează sunetul și actualizează interfața grafică.
updateEcran(): Funcție responsabilă de desenarea meniului text. Evaluează starea curentă a variabilei paginaMeniu și randează elementele corespunzătoare (selecție gamă, setare prag sensibilitate, mute).
drawBars(int values[]): O funcție de nivel avansat grafic ce ia ca argument vectorul cu valorile brute ale senzorilor și randează un osciloscop/histogramă simplificată pe ecran. Înălțimea și culoarea barelor se modifică dinamic pentru a oferi un feedback vizual al atingerii corzilor.
customTone(float freq): Funcție proprie de generare a sunetului. Oprește Timer-ul 2, îl configurează în modul Mode 7 (Fast PWM cu TOP pe OCR2A), conectează pinul OC2B, setează regiștrii de frecvență și repornește timer-ul cu prescaler-ul adecvat.
customNoTone(): Oprește redarea notei deconectând fizic ieșirea Timer-ului 2 de pinul asociat buzzer-ului și forțând pinul în starea logică LOW pentru a preveni zgomotul rezidual.
În urma asamblării hardware și a dezvoltării firmware-ului, proiectul „Harpa Optică” a fost finalizat cu succes, rezultând un instrument muzical embedded autonom, complet funcțional, care nu mai depinde de un PC pentru configurare sau procesare.
Rezultatele finale pot fi împărțite pe următoarele direcții principale:
Răspunsul Senzorilor (Latență minimă): Datorită utilizării citirii ADC în mod multiplexat și a implementării algoritmului de tip Super-Loop fără funcții blocante (fără delay-uri majore), sistemul reacționează instantaneu la interacțiunea utilizatorului. Detecția umbrei peste fotorezistoare declanșează nota muzicală corespunzătoare fără o întârziere perceptibilă auditiv.
Generarea Sunetului (Hardware PWM): Înlocuirea funcțiilor software standard cu manipularea directă a Timer-ului 2 (modul Fast PWM) s-a dovedit un succes. Buzzer-ul pasiv redă clar frecvențele notelor muzicale din cele două game configurate (Do Major și La Minor), având un factor de umplere (Duty Cycle) stabil de 50%, ceea ce asigură o calitate optimă a sunetului fără a încărca procesorul.
Interfața Om-Mașină (HMI): Integrarea ecranului TFT ST7735 pe interfața hardware SPI a permis crearea unui meniu de configurare fluid. Utilizatorul poate modifica în timp real parametri critici ai sistemului, precum: Gama muzicală activă. Sensibilitatea (pragul ADC) fotorezistoarelor, permițând calibrarea instantanee a harpei indiferent de lumina ambientală din cameră. Activarea/dezactivarea sunetului (Mute).
Feedback Vizual Dinamic: Pe lângă meniul text, sistemul este capabil să redea pe ecran un grafic tip histogramă (bare verticale) care ilustrează în timp real valoarea analogică citită de pe fiecare coardă. Această vizualizare a fost obținută fără a compromite viteza de generare a sunetului.
Proiectul își atinge pe deplin scopul propus, demonstrând capabilitățile microcontrolerului ATmega328P de a gestiona simultan achiziție de date analogice, semnale de control digital (butoane), generare de semnale PWM și comunicare SPI rapidă, toate orchestrate de un firmware stabil și modular.
Faza de cercetare și achiziție componente
Stabilirea temei „Harpa Optică” și validarea ideii cu asistentul de laborator.
Achiziționarea componentelor (Placa Xplained Mini, 4x LDR, display ST7735, buzzer, butoane).
Realizarea primului montaj de test pe breadboard pentru divizoarele de tensiune aferente fotorezistoarelor.
Implementarea citirii ADC și a sunetului de bază
Scrierea codului pentru citirea multiplexată a pinilor analogici (A0-A3).
Conectarea buzzer-ului pasiv și testarea inițială folosind funcția standard tone().
Problemă întâmpinată: Latență la schimbarea notelor. Soluție: Trecerea de la delay-uri software la o citire rapidă în buclă (Super-Loop).
Integrarea display-ului ST7735 (SPI)
Conectarea ecranului TFT la pinii SPI hardware (PB2-PB5).
Problemă întâmpinată: Ecranul rămânea alb sau pâlpâia.
Soluție: Analiza schemei electrice a ecranului a relevat prezența unui regulator LDO (U4), permițând alimentarea sigură la 5V. S-au reverificat lipiturile firelor de semnal pentru a asigura un contact ferm, rezolvând blocajul de inițializare.
Adăugarea interfeței de control (Butoane)
Montarea celor 3 butoane tactile pe pinii PD2, PD3, PD4 folosind rezistențele interne de pull-up.
Problemă întâmpinată: Butoanele citeau constant LOW sau HIGH fără a schimba starea la apăsare.
Soluție: Reconfigurarea hardware a butoanelor folosind „regula diagonalei” pe breadboard pentru a asigura închiderea corectă a circuitului către GND.
Dezvoltarea mașinii de stări (FSM) pentru meniul grafic (Schimbare Gamă, Setare Sensibilitate, Mute, Vizualizare bare analogice).
Optimizare avansată (Hardware PWM) și finalizare
La recomandarea laborantului, funcția blocantă tone() a fost complet eliminată.
Implementarea funcției customTone() prin configurarea directă a Timer-ului 2 în modul Fast PWM (Mode 7) pe pinul OC2B (D3).
Testarea finală a întregului sistem, calibrarea valorilor de sensibilitate la lumina ambientală, redactarea documentației hardware/software și generarea arhivei finale.
Pentru proiectarea hardware-ului și dezvoltarea firmware-ului la nivel de regiștri, au fost consultate următoarele documentații tehnice oficiale și manuale de utilizare:
Microchip Technology, ATmega328P Datasheet
Scop: Înțelegerea arhitecturii interne, configurarea regiștrilor ADC pentru citirea multiplexată, setarea interfeței hardware SPI și manipularea Timer-ului 2 pentru generarea semnalului Fast PWM (Hardware PWM).
Sitronix, ST7735 Color TFT Controller Datasheet
Scop: Consultat pentru secvențele de inițializare, formatul pachetelor de date pe magistrala SPI și înțelegerea setului de comenzi necesar pentru randarea grafică pe display.
Microchip Technology, ATmega328P Xplained Mini Hardware User Guide
Scop: Identificarea corectă a pinout-ului fizic (porturile PB, PC, PD) și a capabilităților de alimentare/conectare ale plăcii de dezvoltare pentru integrarea componentelor externe.
Datasheet Senzori Fotorezistivi (LDR GL5528)
Scop: Analiza curbei de răspuns la lumină (rezistență în funcție de lux) necesară pentru dimensionarea corectă a rezistoarelor fixe (10kΩ) și calculul matematic al divizoarelor de tensiune.