This shows you the differences between two versions of the page.
|
pm:prj2026:ciprian.popescu0411:andrei.chiscaru [2026/05/06 13:23] andrei.chiscaru [Hardware Design] |
pm:prj2026:ciprian.popescu0411:andrei.chiscaru [2026/05/23 12:20] (current) andrei.chiscaru [Bibliografie/Resurse] |
||
|---|---|---|---|
| Line 25: | Line 25: | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | <note tip> | ||
| - | Aici puneţi tot ce ţine de hardware design: | ||
| - | * listă de piese | ||
| - | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | ||
| - | * diagrame de semnal | ||
| - | * rezultatele simulării | ||
| - | |||
| - | </note> | ||
| Lista de componente hardware | Lista de componente hardware | ||
| Line 50: | Line 42: | ||
| + | Schema electrică și conexiuni | ||
| + | |||
| + | {{ :pm:prj2026:ciprian.popescu0411:screenshot_2026-05-15_103910.png?300 |}} | ||
| + | |||
| + | |||
| + | {{ :pm:prj2026:ciprian.popescu0411:whatsapp_image_2026-05-15_at_10.42.46.jpeg?300 |}} | ||
| + | |||
| + | |||
| + | 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 ===== | ===== 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. | ||
| - | <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> | ||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| - | <note tip> | + | Î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. |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | 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. | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | 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. | ||
| ===== Download ===== | ===== Download ===== | ||
| - | <note warning> | ||
| - | 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**. | ||
| - | </note> | ||
| + | {{:pm:prj2026:ciprian.popescu0411:chiscaru_andrei_332cb_proiect.zip|}} | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| - | <note tip> | + | Faza de cercetare și achiziție componente |
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
| - | </note> | + | |
| + | 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. | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| - | <note> | + | 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: |
| - | Pentru a respecta cerințele stricte legate de plagiat și surse, adaugă următoarele link-uri oficiale: | + | |
| + | 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 | ||
| - | 1. Microchip Technology, ATmega328P Datasheet - pentru configurarea regiștrilor ADC, SPI, Timere și PWM. | + | 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. |
| - | 2. Sitronix, ST7735 Color TFT Controller Datasheet - pentru secvențele de inițializare și comenzi SPI. | + | Microchip Technology, ATmega328P Xplained Mini Hardware User Guide |
| - | 3. Microchip Technology, ATmega328P Xplained Mini Hardware User Guide - pentru pinout-ul și capabilitățile plăcii de dezvoltare. | + | 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. |
| - | 4. Documentație tehnică senzori fotorezistivi (LDR GL5528) - pentru curba de răspuns la lumină și calculul divizorului de tensiune. | + | Datasheet Senzori Fotorezistivi (LDR GL5528) |
| - | </note> | + | 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. |
| <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> | ||