Zeitouni Aila Grupa: 333CA
AutoBin este un coș de gunoi inteligent care se deschide automat atunci când detectează prezența unei persoane sau a unui obiect în apropiere. Proiectul folosește un senzor cu ultrasunete pentru detecție și un servomotor pentru a acționa capacul.
Sistemul detectează apropierea unei persoane și acționează automat servomotorul pentru a deschide capacul. După ce persoana se îndepărtează, capacul se închide. În plus, datele despre distanță și acțiuni sunt transmise prin UART pentru monitorizare și depanare.
Scopul AutoBin este de a oferi o soluție igienică și practică pentru colectarea deșeurilor, eliminând nevoia de a atinge capacul manual. Astfel, se reduce riscul de contaminare și se îmbunătățește experiența utilizatorului.
Ideea a pornit de la nevoia de a evita contactul cu suprafețe potențial murdare în spațiile publice sau acasă. Am vrut să creăm un sistem simplu, accesibil și eficient, bazat pe tehnologii învățate în laborator, cum ar fi controlul servomotoarelor, senzorii de distanță și comunicația UART.
Ideea a pornit de la nevoia de a evita contactul cu suprafețe potențial murdare în spațiile publice sau acasă. Am vrut să creăm un sistem simplu, accesibil și eficient, bazat pe tehnologii învățate în laborator, cum ar fi controlul servomotoarelor, senzorii de distanță și comunicația UART.
Pentru alții, AutoBin oferă o modalitate igienică și practică de a arunca gunoiul, ceea ce este esențial în școli, spitale, birouri sau bucătării. Pentru mine, proiectul este o oportunitate de a aplica cunoștințele dobândite la laborator într-o soluție concretă, utilă și relevantă din punct de vedere social.
Component Function Arduino Uno Central controller, reads sensor data, controls motor/display/button Sensor Ultrasonic sensor to detect hand motion Motor Executes a physical task (e.g., servo motor for rotation or DC motor) LCD Display Shows information like “Motor On”, “Ready”, or sensor readings buzzer Used when sensor detects something fire mama-tata Connects components to Arduino + breadboard
Proiectul este construit în jurul plăcii Arduino Uno, care controlează și comunică cu mai multe componente externe pentru a forma un sistem interactiv cu funcții de măsurare, afișare și alertă.
Arduino este alimentat prin USB (5V), iar toate componentele primesc alimentare prin pinii de 5V și GND, distribuiți prin breadboard. Toate componentele împart GND comun pentru referință corectă. Legăturile sunt realizate pe breadboard, cu grijă pentru alimentare și protecție. Comunicarea I2C permite extinderea ușoară a proiectului.
Componentă | Interfață | Pini Arduino |
---|---|---|
HC-SR04 | Digital | D9 (Trig), D8 (Echo) |
Buzzer | Digital | D5 |
Servo | PWM | D10 |
LCD I2C | I2C | A4 (SDA), A5 (SCL) |
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ță.
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.
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 i = 0; i < 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); }
}
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:
—
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.
—
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.
—
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.
—
Fișiere principale:
Validare:
—
Senzorul ultrasonic HC-SR04 a fost calibrat folosind măsurători directe:
—
—
O demonstrație video a întregului proiect, cu explicații și comportament funcțional, poate fi vizualizată la:
—
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.