This is an old revision of the document!


Harpă Optică

Introducere

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.

Descriere generală

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.

Hardware Design

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.

Software Design

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.

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

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ă ;-).

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.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Pentru a respecta cerințele stricte legate de plagiat și surse, adaugă următoarele link-uri oficiale:

1. Microchip Technology, ATmega328P Datasheet - pentru configurarea regiștrilor ADC, SPI, Timere și PWM.

2. Sitronix, ST7735 Color TFT Controller Datasheet - pentru secvențele de inițializare și comenzi SPI.

3. Microchip Technology, ATmega328P Xplained Mini Hardware User Guide - pentru pinout-ul și capabilitățile plăcii de dezvoltare.

4. Documentație tehnică senzori fotorezistivi (LDR GL5528) - pentru curba de răspuns la lumină și calculul divizorului de tensiune.

Export to PDF

pm/prj2026/ciprian.popescu0411/andrei.chiscaru.1779526785.txt.gz · Last modified: 2026/05/23 11:59 by andrei.chiscaru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0