This shows you the differences between two versions of the page.
pm:prj2025:avaduva:ioana.boari [2025/05/18 13:57] ioana.boari [Concluzii] |
pm:prj2025:avaduva:ioana.boari [2025/05/24 12:19] (current) ioana.boari [Bibliografie/Resurse] |
||
---|---|---|---|
Line 17: | Line 17: | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | În proiect se utilizează un senzor MPU6050 care transmite către Arduino date de accelerație prin interfața I2C. Arduino compară valorile citite cu valorile de repaus stabilite la calibrare. Dacă diferența depășește un prag predefinit, sistemul consideră că s-a produs o vibrație semnificativă și declanșează o alertă: activează un buzzer controlat prin semnal PWM, aprinde alternativ două LED-uri și afișează un mesaj de avertizare pe un ecran LCD 1602 prin I2C. Alarma va fi resetată printr-un buton conectat la un pin configurat cu întrerupere, iar o nouă apăsare va reactiva sistemul, reluând procesul de calibrare și monitorizare. | + | În proiect se utilizează un senzor MPU6050 care transmite către Arduino date de accelerație prin interfața I2C. Arduino compară valorile citite cu valorile de repaus stabilite la calibrare. Dacă diferența depășește un prag predefinit, sistemul consideră că s-a produs o vibrație semnificativă și declanșează o alertă: activează un buzzer controlat prin semnal PWM, aprinde alternativ două LED-uri și afișează un mesaj de avertizare pe un ecran LCD 1602 prin I2C. Alarma va fi resetată printr-un buton conectat la un pin configurat cu întrerupere, iar o nouă apăsare va reactiva sistemul, reluând procesul de calibrare și monitorizare. În plus, sistemul trimite în timp real datele de accelerație prin interfața UART, permițând vizualizarea grafică a acestora în Serial Plotter. |
{{:pm:prj2025:avaduva:diagrama_proiect.drawio.png|}} | {{:pm:prj2025:avaduva:diagrama_proiect.drawio.png|}} | ||
Line 66: | Line 66: | ||
* Microcontroller principal care controlează întregul sistem. | * Microcontroller principal care controlează întregul sistem. | ||
* Tensiune de lucru: 5V. | * Tensiune de lucru: 5V. | ||
- | * Interfețe utilizate: I2C, GPIO, PWM, External Interrupt. | + | * Interfețe utilizate: |
- | * Motivatie: Este ușor de programat și compatibil cu toate modulele utilizate. | + | * **I2C** → pentru comunicarea cu **MPU6050** și **LCD 1602**, folosind pini A4 (SDA) și A5 (SCL). |
+ | * **PWM** → pentru controlul sonorului emis de **buzzerul pasiv** prin funcția `tone()` pe pinul D9. | ||
+ | * **GPIO** → pentru aprinderea LED-urilor (D6 și D7) și citirea stării butonului (D2). | ||
+ | * **External Interrupt** → pentru a detecta instantaneu apăsarea butonului (D2), permițând întreruperea execuției normale și comutarea stării sistemului. | ||
+ | * **UART** → pentru transmiterea datelor de accelerație către **Serial Monitor** si **Serial Plotter**. | ||
+ | * Motivație: Arduino UNO este compatibil cu toate modulele utilizate, are suport extins de biblioteci și este ideal pentru prototipare rapidă, oferind acces facil la toate interfețele necesare proiectului. | ||
2. **MPU6050 – Senzor de accelerație și giroscop** | 2. **MPU6050 – Senzor de accelerație și giroscop** | ||
Line 108: | Line 114: | ||
* GND → **GND** | * GND → **GND** | ||
* Configurat ca: `INPUT_PULLUP` → logică activă pe LOW. | * Configurat ca: `INPUT_PULLUP` → logică activă pe LOW. | ||
- | * Motivatie: Pinul D2 este unul dintre puținii pini de pe Arduino UNO care suportă întreruperi externe (INT0). Permite reacție imediată fără polling. | + | * Motivatie: Pinul D2 este unul dintre puținii pini de pe Arduino UNO care suportă întreruperi externe (INT0). Permite reacție imediată fără busy waiting. |
7. **Breadboard + cabluri jumper** | 7. **Breadboard + cabluri jumper** | ||
Line 120: | Line 126: | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | |||
+ | ==== Mediu de dezvoltare ==== | ||
+ | * **Arduino IDE** (versiunea 2.3.6) | ||
+ | * Microcontroller: **Arduino UNO** | ||
+ | |||
+ | ==== Descrierea codului aplicației (firmware) ==== | ||
+ | |||
+ | Proiectul a fost dezvoltat folosind mediul de dezvoltare **Arduino IDE**, în limbajul **C++**, și utilizează funcționalități precum: comunicație I2C, UART, semnal PWM, GPIO și întreruperi externe. | ||
+ | |||
+ | Sistemul are trei stări: | ||
+ | - **0 - activ**: sistemul monitorizează vibrațiile. | ||
+ | - **1 - alertă**: se declanșează alarma prin buzzer, LED-uri si mesaj pe ecranul LCD. | ||
+ | - **2 - standby**: sistemul este oprit până la reactivare prin apăsarea butonului. | ||
+ | |||
+ | Trecerea între stări se realizează folosind o variabilă globală `systemState` și un flag `buttonPressed` setat printr-o întrerupere externă. | ||
+ | |||
+ | ==== Biblioteci utilizate ==== | ||
+ | * `Wire.h` – pentru comunicația I2C cu senzorul MPU6050 și ecranul LCD. | ||
+ | * `LiquidCrystal_I2C.h` – pentru controlul LCD-ului 1602 prin I2C. | ||
+ | |||
+ | ==== Algoritmi și structuri implementate ==== | ||
+ | * **Calibrare automată**: la fiecare pornire sau repornire, se preiau 100 de citiri de la senzor și se calculează media pentru fiecare axă: | ||
+ | <code> | ||
+ | accX_ref = sumX / 100; | ||
+ | accY_ref = sumY / 100; | ||
+ | accZ_ref = sumZ / 100; | ||
+ | </code> | ||
+ | * **Monitorizarea vibrațiilor**: în `loop()`, diferențele dintre valorile actuale și cele calibrate sunt comparate cu un prag: | ||
+ | <code> | ||
+ | int deltaX = abs(accX - accX_ref); | ||
+ | if (deltaX > threshold) { | ||
+ | // declanșează alerta | ||
+ | } | ||
+ | </code> | ||
+ | * **Serial Plotter pentru vizualizare live**: | ||
+ | <code> | ||
+ | Serial.print(accX); | ||
+ | Serial.print("\t"); | ||
+ | Serial.print(accY); | ||
+ | Serial.print("\t"); | ||
+ | Serial.println(accZ); | ||
+ | </code> | ||
+ | * **Gestionarea stărilor**: folosind `systemState`, sistemul comută între monitorizare, alertă și standby. | ||
+ | * **Gestionarea unui buton cu întrerupere externă**: pentru resetarea sau reactivarea sistemului fără polling: | ||
+ | <code> | ||
+ | attachInterrupt(digitalPinToInterrupt(buttonPin), onButtonPress, FALLING); | ||
+ | </code> | ||
+ | |||
+ | ==== Funcții implementate ==== | ||
+ | * `setup()` – inițializează pinii, senzorii, LCD-ul, Serial și I2C. | ||
+ | * `loop()` – logica principală bazată pe `systemState`. | ||
+ | * `readAccel()` – citește valorile X, Y, Z de la senzor. | ||
+ | * `calibreazaSistemul()` – afișează countdown și efectuează calibrarea. | ||
+ | * `playStartupTone()`, `playShutdownTone()` – semnale sonore PWM. | ||
+ | * `stopAlarm()` – oprește alarma și LED-urile. | ||
+ | * `onButtonPress()` – handler pentru întreruperea butonului. | ||
+ | |||
+ | ==== Validare funcționalități ==== | ||
+ | * Sistemul a fost testat în mai multe scenarii prin lovirea suprafeței de sprijin. | ||
+ | * **Serial Monitor** și **Serial Plotter** oferă confirmare în timp real. | ||
+ | * Comportamentul sistemului corespunde așteptărilor: | ||
+ | - Alerta se declanșează la vibrații. | ||
+ | - Sistemul poate fi oprit și repornit. | ||
+ | - Mesajele sunt afișate corect pe LCD. | ||
+ | |||
+ | ==== Elemente de noutate ==== | ||
+ | * **Vizualizare live în Serial Plotter** a valorilor de accelerare. | ||
+ | * **Calibrare în timp real** în paralel cu afișarea countdown-ului. | ||
+ | * **Semnalizare diversă**: luminoasă, sonoră, textuală. | ||
+ | |||
+ | ==== Calibrarea senzorului ==== | ||
+ | * Se face automat la pornire sau reset. | ||
+ | * În timpul afișării countdown-ului de 5 secunde pe LCD, se fac 100 de citiri: | ||
+ | <code> | ||
+ | for (int j = 0; j < 20; j++) { | ||
+ | readAccel(); | ||
+ | sumX += accX; | ||
+ | delay(50); | ||
+ | } | ||
+ | </code> | ||
+ | * Media valorilor se folosește ca punct de referință pentru detecția vibrațiilor ulterioare. | ||
+ | |||
+ | ==== Optimizări realizate ==== | ||
+ | * Folosirea delay-urilor precise în `calibreazaSistemul()` pentru preluare distribuită a datelor. | ||
+ | * Evitarea polling-ului prin folosirea unei întreruperi pentru buton. | ||
+ | * Funcții separate pentru fiecare responsabilitate logică - **modularizare**. | ||
- | <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 ===== | ||
Line 157: | Line 242: | ||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | {{:pm:prj2025:avaduva:detector_de_vibratii_in_cutremure.zip|}} |
- | 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> | + | |
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
- | <note> | + | **Resurse Hardware** |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * [[https://www.optimusdigital.ro/ro/|Optimus Digital]] – magazin online pentru componente electronice |
- | </note> | + | * [[https://www.emag.ro/modul-giroscop-mpu-6050-gy-521-accelerometru-arduino-3-axe-2-1-cm-x-1-1-cm-x-0-3-cm-albastru-c7/pd/DL3G1QYBM/|Modul MPU6050 (eMAG)]] – senzor accelerometru + giroscop folosit în proiect |
+ | |||
+ | **Resurse Software** | ||
+ | * [[https://www.arduino.cc/en/software|Arduino IDE]] – mediu de dezvoltare folosit pentru scrierea și încărcarea codului | ||
+ | * [[https://docs.arduino.cc/libraries/liquidcrystal/|LiquidCrystal_I2C Library]] – afișare mesaje pe LCD cu interfață I2C | ||
+ | * [[https://www.arduino.cc/en/reference/wire|Wire Library]] – pentru comunicația I2C între Arduino și senzorul MPU6050 | ||
<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> | ||