Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2025:vstoica:aila.zeitouni [2025/05/14 00:28]
aila.zeitouni [Hardware Design]
pm:prj2025:vstoica:aila.zeitouni [2025/05/26 16:59] (current)
aila.zeitouni [Milestone 3 - Raport asupra implementării software]
Line 39: Line 39:
 buzzer Used when sensor detects something buzzer Used when sensor detects something
 fire mama-tata Connects components to Arduino + breadboard fire mama-tata Connects components to Arduino + breadboard
 +
 +
 ===== 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>​+
 == diagramă bloc ==  == diagramă bloc == 
 {{:​pm:​prj2025:​vstoica:​cool_fulffy.png?​900|}} {{:​pm:​prj2025:​vstoica:​cool_fulffy.png?​900|}}
Line 78: Line 74:
 | Servo       | PWM       | D10                  | | Servo       | PWM       | D10                  |
 | LCD I2C     | I2C       | A4 (SDA), A5 (SCL)   | | LCD I2C     | I2C       | A4 (SDA), A5 (SCL)   |
 +
 +== hardware ==
 +{{:​pm:​prj2025:​vstoica:​hw.jpg?​200|}}
 +== Rolul fiecărei componente ==
 +  * **Arduino Uno** – Acționează ca unitate centrală de control. Primește informații de la senzori, procesează datele și trimite comenzi către afișaj și actuatori.
 +  ​
 +  * **Senzor HC-SR04** – Măsoară distanța până la un obiect aflat în fața sistemului folosind unde ultrasonice. Poate fi utilizat pentru declanșarea buzzer-ului sau pentru activarea servo-motorului când un obiect este detectat la o distanță prestabilită.
 +  ​
 +  * **Buzzer pasiv** – Emite sunete ca semnal de alertă atunci când o condiție este îndeplinită (ex: distanță mai mică de 10 cm). Este controlat digital de Arduino prin funcția `tone()`.
 +
 +  * **Servo motor SG90** – Se rotește într-un anumit unghi (0°–180°) în funcție de comanda primită de la Arduino. Util în aplicații precum deschiderea unei uși automate, ridicarea unei bariere etc.
 +
 +  * **LCD 16x2 cu interfață I2C** – Afișează valori precum distanța măsurată sau starea senzorilor. Conectarea prin I2C permite economisirea pinilor digitali și oferă comunicare eficientă pe doar două fire (SDA și SCL).
 +
 +== Estimare consum energie ==
 +
 +^ Componentă ​    ^ Curent estimat ^
 +| Arduino Uno    | ~50 mA         |
 +| HC-SR04 ​       | ~15 mA         |
 +| Buzzer ​        | ~30–50 mA      |
 +| Servo SG90     | ~100–250 mA    |
 +| LCD I2C        | ~20 mA         |
 +| **Total estimat** | **~300–400 mA** |
 +
 +Arduino poate alimenta toate componentele prin portul USB. Dacă servo-ul va fi utilizat intens, este recomandată o sursă externă de 5V pentru siguranță.
 +
 +== Stadiul actual și pașii următori ==
 +
 +Montajul hardware a fost realizat și testat în mediul virtual (Tinkercad),​ cu rezultate funcționale. Conexiunile au fost validate, iar codul de control este pregătit. Urmează achiziționarea componentelor fizice, montarea pe breadboard real și testarea sistemului complet.
 +
 +
  
 ===== Software Design ===== ===== Software Design =====
Line 83: Line 110:
  
 <note tip> <note tip>
-Descrierea codului aplicaţiei ​(firmware): +#include <​avr/​io.h>​ 
-  * mediu de dezvoltare ​(if any) (e.g. AVR Studio, CodeVisionAVR+#include <​util/​delay.h>​ 
-  librării şi surse 3rd-party (e.g. Procyon AVRlib+#include <​stdint.h>​ 
-  algoritmi şstructuri pe care plănuiţsă le implementaţ+#include <​stdbool.h>​ 
-  ​(etapa 3surse şi funcţii implementate+#include "​lcd_i2c.h"​ 
 +#include "​twi.h"​ 
 +// Pin defines matching your Arduino sketch 
 +#define TRIG_PIN PD6  // D6 
 +#define ECHO_PIN PD7  // D7 
 +#define SERVO_PIN PB1 // D9 (OC1A
 +#define BUZZER_PIN PB0 // D8 
 + 
 +#define DISTANCE_OPEN_THRESHOLD 15 
 +#define DISTANCE_TRASH_THRESHOLD 8 
 +#define TRASH_DETECT_DELAY_MS 3000 
 + 
 +#define SERVO_OPEN_ANGLE 0 
 +#define SERVO_CLOSE_ANGLE 180 
 + 
 +void setup_servo_pwm() 
 +    DDRB |= (1 << SERVO_PIN); // PB1 as output 
 +    ​TCCR1A |= (1 << COM1A1) | (1 << WGM11); 
 +    TCCR1B |= (1 << WGM12) | (1 << WGM13) | (1 << CS11); // prescaler 8 
 +    ICR1 = 19999; // 20 ms PWM 
 +
 + 
 +void set_servo_angle(uint8_t angle) { 
 +    OCR1A = (ICR1 (1000 + ((uint32_t)angle * 1000 / 180))) / 20000; 
 +
 + 
 +uint16_t measure_distance_cm() { 
 +    // Send trigger pulse 
 +    PORTD &= ~(1 << TRIG_PIN);​ 
 +    _delay_us(2);​ 
 +    PORTD |= (1 << TRIG_PIN);​ 
 +    _delay_us(10);​ 
 +    PORTD &= ~(1 << TRIG_PIN);​ 
 + 
 +    // Wait for echo to go high 
 +    uint16_t timeout = 30000; 
 +    while (!(PIND & (1 << ECHO_PIN)) && timeout--) _delay_us(1); 
 +    if (timeout == 0) return 0; 
 + 
 +    // Measure how long echo is high 
 +    uint32_t count = 0; 
 +    while ((PIND & (1 << ECHO_PIN)) && count < 30000) { 
 +        _delay_us(1);​ 
 +        count++; 
 +    } 
 + 
 +    // Convert to cm 
 +    return (uint16_t)((count ​0.0343) / 2); 
 +
 + 
 +void buzz(uint8_t times) { 
 +    for (uint8_t ​= 0; < times; ​i++) { 
 +        PORTB |= (1 << BUZZER_PIN);​ 
 +        _delay_ms(300);​ 
 +        PORTB &= ~(1 << BUZZER_PIN);​ 
 +        _delay_ms(200);​ 
 +    } 
 +
 +#include "​lcd_i2c.h"​ 
 +#include "​twi.h"​ 
 + 
 +int main(void) { 
 +    // Setup TRIG as output, ECHO as input 
 +    DDRD |= (1 << TRIG_PIN);​ 
 +    DDRD &= ~(1 << ECHO_PIN);​ 
 + 
 +    // Setup buzzer 
 +    DDRB |= (1 << BUZZER_PIN);​ 
 +    PORTB &= ~(1 << BUZZER_PIN);​ 
 + 
 +    // Init I2C and LCD 
 +    twi_init();​ 
 +    lcd_init();​ 
 + 
 +    lcd_clear();​ 
 +    lcd_set_cursor(0,​ 0); 
 +    lcd_print("​Smart Stash Can"​);​ 
 +    lcd_set_cursor(0,​ 1); 
 +    lcd_print(" ​  ​Initializing "); 
 +    _delay_ms(2000);​ 
 +    lcd_clear();​ 
 + 
 +    // Init servo 
 +    setup_servo_pwm();​ 
 +    set_servo_angle(SERVO_CLOSE_ANGLE);​ 
 + 
 +    uint32_t last_thank_time = 0; 
 + 
 +    while (1) { 
 +        uint16_t distance = measure_distance_cm();​ 
 + 
 +        if (distance > 0 && distance < DISTANCE_OPEN_THRESHOLD) { 
 +            set_servo_angle(SERVO_OPEN_ANGLE);​ 
 +            lcd_set_cursor(0,​ 0); 
 +            lcd_print("​Opening lid     "​);​ 
 +            buzz(1); 
 +        } else { 
 +            set_servo_angle(SERVO_CLOSE_ANGLE);​ 
 +            lcd_set_cursor(0,​ 0); 
 +            lcd_print("​Lid closed ​     "); 
 +        } 
 + 
 +        if (distance > 0 && distance < DISTANCE_TRASH_THRESHOLD) { 
 +            if ((last_thank_time + TRASH_DETECT_DELAY_MS) < 60000) { 
 +                lcd_set_cursor(0,​ 1); 
 +                lcd_print(" ​ Thank you!    "); 
 +                buzz(2)
 +                last_thank_time = 0; 
 +            } 
 +        } else { 
 +            lcd_set_cursor(0,​ 1); 
 +            lcd_print("​Scanning area   "​);​ 
 +            last_thank_time += 300; 
 +        } 
 + 
 +        _delay_ms(300);​ 
 +    } 
 +
 + 
 +  
 </​note>​ </​note>​
 +
 +
 +
 +====== Milestone 3 - Raport asupra implementării software ======
 +
 +=== Stadiul actual al implementării ===
 +
 +Software-ul pentru proiectul Smart Stash Can este funcțional și a fost testat cu succes pe hardware-ul final. Funcționalitățile implementate includ:
 +
 +  * Detectarea distanței utilizând senzorul ultrasonic HC-SR04 (TRIG pe PD6, ECHO pe PD7)
 +  * Controlul capacului prin servomotor acționat PWM (OC1A - PB1)
 +  * Feedback sonor cu ajutorul unui buzzer (PB0)
 +  * Afișaj LCD I2C (cu PCF8574, adresă 0x27) pentru interfața cu utilizatorul
 +  * Cod modular scris în C bare-metal cu acces direct la registrele perifericelor
 +  * Demonstrație completă validată experimental în laborator
 +
 +---
 +
 +=== Biblioteci și drivere utilizate ===
 +
 +^ Componentă ^ Bibliotecă / Driver ^ Justificare ^
 +| Afișaj LCD | lcd_i2c.c / lcd_i2c.h (scris de noi) | Implementare ușoară și eficientă pentru PCF8574, fără dependențe de Arduino |
 +| Magistrală I2C | twi.c / twi.h (din laborator) | Permite control complet asupra comunicației TWI |
 +| UART (debug) | usart.c / usart.h | Folosit pentru mesaje de test și jurnalizare serială |
 +| Control servomotor | PWM cu Timer1 | Precizie ridicată folosind OCR1A și ICR1 fără delay-uri software |
 +
 +Fiecare bibliotecă a fost selectată pentru simplitate, eficiență și integrare directă cu perifericele platformei ATmega328P.
 +
 +---
 +
 +=== Element de noutate al proiectului ===
 +
 +Acest proiect se diferențiază prin abordarea complet bare-metal, fără utilizarea bibliotecilor Arduino. Interacțiunea între senzor, servomotor, buzzer și afișaj este realizată exclusiv prin programare directă a registrelor. Se obține astfel un control total asupra funcționalității,​ temporizării și performanței sistemului, într-un format educativ și extensibil.
 +
 +---
 +
 +=== Justificarea utilizării funcționalităților din laborator ===
 +
 +^ Laborator ^ Funcționalitate utilizată ^ Aplicare în proiect ^
 +| Lab 0 | GPIO | TRIG și ECHO pentru senzor, ieșire pentru buzzer |
 +| Lab 1 | UART | Trimiterea mesajelor debug către terminal serial |
 +| Lab 3 | Timere și PWM | Control precis al servomotorului cu Timer1, canal OC1A |
 +| Lab 6 | I2C (TWI) | Comunicație cu afișajul LCD prin interfața I2C (PCF8574) |
 +
 +Fiecare funcționalitate din laborator a fost integrată într-un mod practic pentru a forma un sistem embedded complet funcțional.
 +
 +---
 +
 +=== Structura proiectului și validare ===
 +
 +**Fișiere principale:​**
 +
 +  * `main.c` – logica principală,​ secvența de control
 +  * `servo.c/h` – control PWM pentru servomotor
 +  * `twi.c/h` – comunicație I2C (TWI)
 +  * `lcd_i2c.c/​h` – afișare pe LCD prin PCF8574
 +  * `usart.c/h` – trimiterea mesajelor seriale
 +
 +**Validare:​**
 +  * Testare modulară: fiecare componentă a fost verificată individual
 +  * Testare integrată: comportamentul întregului sistem a fost observat în timp real
 +  * Compararea distanțelor măsurate cu o riglă fizică
 +  * Verificarea reacției servo în funcție de distanță
 +  * Confirmarea clarității mesajelor LCD și a actualizării cursorului
 +
 +---
 +
 +=== Calibrarea senzorului de distanță ===
 +
 +Senzorul ultrasonic HC-SR04 a fost calibrat folosind măsurători directe:
 +
 +  * Formula de conversie: `(durata în µs × 0.0343) / 2`
 +  * Pulsurile TRIG și ECHO au fost gestionate cu `_delay_us()` pentru precizie
 +  * Praguri stabilite experimental:​
 +    * Deschiderea capacului la < 15 cm
 +    * Mesaj de mulțumire la < 8 cm
 +  * Zgomotul de măsurare a fost redus prin cicluri scurte și perioade de eșantionare stabile (300 ms)
 +
 +---
 +
 +=== Optimizări realizate ===
 +
 +  * PWM hardware în loc de temporizări software pentru controlul servomotorului
 +  * I2C implementat low-level fără librării externe, pentru control precis
 +  * Suprimarea “ghosting”-ului pe LCD prin scriere completă a liniilor cu spații
 +  * Utilizarea exclusivă a variabilelor statice, fără alocare dinamică
 +  * Funcția de măsurare a distanței optimizată pentru precizie și timeout sigur
 +  * Structura buclei principale minimizează întârzierile și optimizează reacția sistemului
 +
 +---
 +
 +=== Video demonstrativ ===
 +
 +O demonstrație video a întregului proiect, cu explicații și comportament funcțional,​ poate fi vizualizată la:
 +
 +
 +
 +---
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
pm/prj2025/vstoica/aila.zeitouni.1747171734.txt.gz · Last modified: 2025/05/14 00:28 by aila.zeitouni
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