This shows you the differences between two versions of the page.
|
pm:prj2026:victor.stoica0203:ergodeskassistant [2026/05/23 16:36] ionut_gabriel.mantu [Software Design] |
pm:prj2026:victor.stoica0203:ergodeskassistant [2026/05/23 17:41] (current) ionut_gabriel.mantu [Conexiuni principale] |
||
|---|---|---|---|
| Line 94: | Line 94: | ||
| * citit folosind INPUT_PULLUP | * citit folosind INPUT_PULLUP | ||
| - | ===== Software Design ===== | + | ====Demonstrație video a funcționării hardware-ului:==== |
| - | Firmware-ul aplicatiei a fost dezvoltat pentru platforma Arduino Uno , in limbajul C/C++, folosind o combinatie de functii oferite de mediul Arduino si acces direct la registrele microcontroller-ului. Scopul acestei abordari a fost atat implementarea functionalitatii aplicatiei, cat si evidentierea clara a conceptelor studiate in laboratoare, precum GPIO, intreruperi, PWM, ADC si comunicatie I2C/TWI. | + | <html> |
| + | <iframe width="560" height="315" | ||
| + | src="https://www.youtube.com/embed/_LmXsJs1Yco" | ||
| + | title="Hardware demo" | ||
| + | frameborder="0" | ||
| + | allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" | ||
| + | allowfullscreen> | ||
| + | </iframe> | ||
| + | </html> | ||
| - | Codul sursa este organizat modular, pe mai multe fisiere, astfel incat logica aplicatiei sa fie separata de partea de acces la periferice. Structura proiectului urmareste o impartire clara a responsabilitatilor: configurarea pinilor digitali, configurarea PWM pentru LED-uri, citirea valorilor analogice de la fotorezistor, implementarea comunicatiei I2C la nivel de registri, controlul LCD-ului, comunicarea cu MPU6050 si logica principala a aplicatiei. | ||
| - | Repository-ul proiectului: | + | ===== Software Design ===== |
| - | https://github.com/ionutmantu8/ErgoDeskAssistant | + | |
| - | Mediul de dezvoltare folosit a fost Arduino IDE, utilizat pentru scrierea, compilarea si incarcarea firmware-ului pe placa. In implementare nu au fost folosite biblioteci third-party dedicate pentru LCD I2C sau MPU6050, aceste componente fiind controlate prin functii proprii construite peste acces direct la registrele perifericului TWI/I2C. Au fost folosite doar headerele standard necesare pentru lucru low-level si pentru functii de baza, precum Arduino.h, avr/io.h, avr/interrupt.h, util/twi.h, math.h si string.h. | + | - **Repository GitHub:** **https://github.com/ionutmantu8/ErgoDeskAssistant** |
| - | La nivel de organizare, aplicatia foloseste cateva structuri principale pentru stocarea starii curente. Valorile citite de la senzori sunt pastrate intr-o structura dedicata, care contine unghiul curent, abaterea fata de postura calibrata, distanta masurata de senzorul ultrasonic, validitatea acestei masuratori si valoarea bruta citita de la fotorezistor. Starea alertelor este memorata separat si indica daca exista alerta de postura, alerta de distanta sau un nivel critic pentru fiecare dintre acestea. Aceste informatii sunt reunite intr-o structura globala de stare a aplicatiei, care mai contine si unghiul de referinta obtinut la calibrare, starea de calibrare si modul curent de afisare pe LCD. | + | - **Mediu de dezvoltare:** **Arduino IDE**, folosit pentru scrierea, compilarea si incarcarea firmware-ului pe placa **Arduino Uno**. |
| - | Din punct de vedere al functionarii, firmware-ul este bazat pe o bucla principala care executa periodic trei tipuri de operatii: citirea senzorilor, actualizarea starii alertelor si actualizarea feedback-ului catre utilizator. Citirea senzorilor include trei surse de date: MPU6050 pentru determinarea inclinarii, HC-SR04 pentru determinarea distantei si LDR-ul conectat la ADC pentru estimarea luminii ambientale. Din valorile brute ale accelerometrului se calculeaza unghiul de inclinare, iar din diferenta dintre acesta si valoarea obtinuta la calibrare se determina abaterea posturii. Pentru senzorul ultrasonic se masoara durata impulsului de ecou si se calculeaza distanta in centimetri. Pentru fotorezistor se citeste valoarea analogica bruta si se transforma ulterior intr-un nivel de luminozitate PWM pentru LED-uri. | + | - **Tehnologii si surse folosite:** |
| + | - **C/C++** | ||
| + | - `Arduino.h` | ||
| + | - `avr/io.h` | ||
| + | - `avr/interrupt.h` | ||
| + | - `util/twi.h` | ||
| + | - `math.h` | ||
| + | - `string.h` | ||
| + | - Nu au fost folosite biblioteci externe dedicate pentru **LCD I2C** sau **MPU6050**; accesul la aceste componente a fost implementat manual, la nivel de registre. | ||
| - | Calibrarea posturii reprezinta un pas important in functionarea aplicatiei. La pornire, dar si la apasarea lunga a butonului, sistemul citeste mai multe mostre consecutive de la accelerometru si calculeaza media unghiului. Aceasta medie devine pozitia de referinta a utilizatorului. In continuare, sistemul nu mai compara postura cu un unghi absolut fix, ci cu aceasta valoare calibrata, ceea ce permite o adaptare mai buna la modul in care este pozitionat senzorul si la pozitia naturala a utilizatorului. | + | - **Organizarea codului:** |
| + | - **`ErgoDeskRegisters.ino`** – initializarea aplicatiei si bucla principala | ||
| + | - **`config.h`** – constante, praguri, adrese I2C, timpi | ||
| + | - **`app_types.h`** – structuri pentru starea aplicatiei, senzori si alerte | ||
| + | - **`gpio.cpp`** – configurarea si accesul la pinii digitali | ||
| + | - **`interrupts.cpp`** – intreruperea externa pentru buton | ||
| + | - **`pwm.cpp`** – configurarea PWM hardware pentru LED-uri | ||
| + | - **`adc_regs.cpp`** – citirea LDR-ului prin ADC | ||
| + | - **`twi_regs.cpp`** – comunicatia I2C/TWI la nivel de registri | ||
| + | - **`lcd_regs.cpp`** – controlul LCD-ului prin backpack I2C | ||
| + | - **`mpu_regs.cpp`** – initializarea si citirea MPU6050 | ||
| + | - **`logic.cpp`** – logica principala a aplicatiei | ||
| - | Detectarea alertelor nu se face instantaneu, ci pe baza unor praguri si a unei persistente temporale. Daca abaterea de postura depaseste pragul stabilit, nu se activeaza imediat alerta, ci doar daca situatia persista un anumit timp. Acelasi principiu este aplicat si pentru distanta prea mica fata de ecran. In plus, exista praguri critice separate pentru postura foarte incorecta si pentru apropierea excesiva. Aceasta abordare reduce alarmele false si face comportamentul aplicatiei mai stabil. | + | - **Functionalitatea firmware-ului:** |
| + | - citeste **MPU6050** pentru determinarea inclinarii/posturii | ||
| + | - citeste **HC-SR04** pentru determinarea distantei fata de ecran | ||
| + | - citeste **fotorezistorul** pentru estimarea luminii ambientale | ||
| + | - calculeaza abaterea fata de postura calibrata | ||
| + | - detecteaza: | ||
| + | - alerta de postura | ||
| + | - alerta de distanta | ||
| + | - nivel critic pentru fiecare | ||
| + | - caz combinat cand ambele sunt active | ||
| + | - ofera feedback prin: | ||
| + | - **LCD** | ||
| + | - **LED-uri** | ||
| + | - **buzzer** | ||
| - | Pentru controlul LED-urilor se foloseste PWM hardware configurat la nivel de registre, prin Timer0 si Timer1. Severitatea alertei este mapata pe culori diferite: un nivel redus activeaza LED-ul verde, un nivel mediu activeaza LED-ul albastru, iar un nivel sever activeaza LED-ul galben. Intensitatea LED-urilor nu este constanta, ci depinde de valoarea citita de la fotorezistor, astfel incat in intuneric luminozitatea este redusa, iar in lumina puternica LED-urile devin mai intense. In plus, schimbarea severitatii nu este aplicata instantaneu, ci doar dupa ce noul nivel ramane stabil o perioada scurta, pentru a evita oscilatiile vizibile. | + | - **Algoritmi si mecanisme implementate:** |
| - | + | - **calibrarea posturii** prin medierea mai multor mostre de la accelerometru | |
| - | Feedback-ul sonor este realizat prin buzzer, folosind modele diferite de semnalizare in functie de tipul si gravitatea alertei. Alertele critice sau situatiile in care sunt active simultan atat alerta de postura, cat si cea de distanta, produc un model sonor mai rapid si mai insistent. Alertele individuale au modele sonore mai lente si mai putin agresive. Acest mecanism ofera o diferentiere clara intre situatiile normale, avertizarile moderate si cele critice. | + | - **debounce software** pentru buton |
| - | + | - detectie **short press / long press** | |
| - | Afisajul LCD este utilizat pentru feedback textual. In timpul calibrarii sunt afisate mesaje care indica progresul procesului. In timpul functionarii normale, daca exista alerte, acestea au prioritate si sunt afisate explicit. Daca nu exista alerte, utilizatorul poate comuta intre doua moduri: un mod simplu, orientat pe alertare, si un mod detaliat, in care sunt afisate valori precum abaterea de postura, distanta masurata si nivelul de lumina. | + | - activarea alertelor doar daca situatia persista un anumit timp |
| - | + | - stabilizarea severitatii pentru LED-uri, pentru a evita schimbarile bruste | |
| - | Butonul este tratat printr-o combinatie intre intrerupere externa si debounce software. Intreruperea de pe pinul asociat butonului este folosita doar pentru a semnaliza rapid faptul ca starea butonului s-a schimbat, iar logica efectiva de debounce, short press si long press este implementata in software, pe baza de timp. O apasare scurta schimba modul de afisare, iar o apasare lunga porneste recalibrarea posturii. | + | - reglarea luminozitatii LED-urilor in functie de valoarea citita de la LDR |
| - | + | ||
| - | In concluzie, partea de software a proiectului implementeaza atat logica functionala a aplicatiei, cat si o integrare clara a conceptelor de laborator la nivel practic. Firmware-ul citeste si proceseaza date din mai multe surse, decide starea de alerta pe baza unor praguri si conditii temporale si ofera feedback multimodal prin LED-uri, buzzer si LCD, intr-o arhitectura modulara si relativ usor de extins. | + | |
| + | - **Concepte de laborator evidentiate in implementare:** | ||
| + | - **GPIO** – configurarea butonului si a senzorului ultrasonic | ||
| + | - **Intreruperi** – detectarea schimbarii starii butonului | ||
| + | - **PWM / Timere** – controlul intensitatii LED-urilor | ||
| + | - **ADC** – citirea fotorezistorului | ||
| + | - **I2C / TWI** – comunicarea cu LCD-ul si cu MPU6050 | ||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| + | - A fost realizata o aplicatie firmware functionala pentru monitorizarea posturii si a distantei fata de ecran. | ||
| + | - Sistemul citeste corect datele de la: | ||
| + | - **MPU6050** pentru inclinare | ||
| + | - **HC-SR04** pentru distanta | ||
| + | - **LDR** pentru nivelul de lumina ambientala | ||
| + | - A fost implementata **calibrarea posturii**, astfel incat sistemul sa foloseasca o pozitie de referinta adaptata utilizatorului. | ||
| + | - Au fost implementate si testate mecanisme de alertare: | ||
| + | - **vizuala** prin LCD si LED-uri | ||
| + | - **sonora** prin buzzer | ||
| + | - Intensitatea LED-urilor este adaptata in functie de lumina ambientala citita de la fotorezistor. | ||
| + | - Butonul permite: | ||
| + | - comutarea intre modul de afisare a alertelor si modul de afisare a valorilor | ||
| + | - recalibrarea posturii prin apasare lunga | ||
| + | - Codul a fost organizat modular, pe fisiere separate, pentru a separa clar logica aplicatiei de accesul la periferice. | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | Proiectul demonstreaza integrarea mai multor periferice hardware intr-o aplicatie embedded unitara si functionala. | ||
| + | - Au fost aplicate practic concepte importante din laborator, precum **GPIO, intreruperi, PWM, ADC si I2C/TWI**. | ||
| + | - Utilizarea accesului la registre pentru perifericele principale a permis o intelegere mai clara a modului in care microcontroller-ul controleaza direct componentele externe. | ||
| + | - Implementarea modulara face codul mai usor de urmarit, testat si extins. | ||
| + | - Sistemul obtinut poate fi dezvoltat in continuare prin adaugarea unor functionalitati suplimentare, de exemplu jurnalizarea datelor, conectivitate wireless sau statistici privind postura utilizatorului. | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| * 16.04.2026 - Alegerea temei proiectului si stabilirea directiei generale. | * 16.04.2026 - Alegerea temei proiectului si stabilirea directiei generale. | ||
| * 30.04.2026 - Achizitionarea componentelor care imi lipsesc. | * 30.04.2026 - Achizitionarea componentelor care imi lipsesc. | ||
| - | * 06.05.2026 - Crearea paginii de documentatie pe wiki si completarea documentatiei pentru prima etapa. | + | * 05.05.2026 - Crearea paginii de documentatie pe wiki si completarea documentatiei pentru prima etapa. |
| + | * 12.05 - Hardware-ul proiectului a fost terminat | ||
| + | * 19.05 - Software-ul proiectului a fost terminat | ||
| + | * 23.05 - Update-ul final al documentatiei | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| - | ==== Resurse Hardware ==== | + | * Laboratoarele de PM puse la dispoziție în cadrul disciplinei |
| - | + | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet]] | |
| - | + | * [[https://cdn.sparkfun.com/datasheets/Sensors/Accelerometers/RM-MPU-6000A.pdf|MPU6050 Register Map and Descriptions]] | |
| - | + | * [[https://www.nxp.com/docs/en/data-sheet/PCF8574_PCF8574A.pdf|PCF8574 / PCF8574A Datasheet]] | |
| - | ==== Resurse Software ==== | + | * [[https://components101.com/sites/default/files/component_datasheet/HCSR04%20Datasheet.pdf|HC-SR04 Datasheet]] |
| - | + | ||
| <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> | ||