Differences

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

Link to this comparison view

pm:prj2026:alexandru.predescu:amarinescu0302 [2026/05/09 23:48]
amarinescu0302
pm:prj2026:alexandru.predescu:amarinescu0302 [2026/05/24 12:39] (current)
amarinescu0302 [Scheletul proiectului si interactiunea functionala]
Line 1: Line 1:
-====== ​ ======+====== ​Dozatorul Nu-ma-uita ​======
 ===== Introducere ===== ===== Introducere =====
  
Line 60: Line 60:
 </​note>​ </​note>​
  
 +
 +===== Schema Electrica =====
 +{{:​pm:​prj2026:​alexandru.predescu:​schemaelectrica.jpeg?​600|}}
 +
 +<note tip>
 +Servo Motor:
 +
 +PWM -> D9
 ++5V -> + de pe breadboard
 +GND -> - de pe breadboard
 +
 +Senzor IR:
 +
 +VCC -> + de pe breadboard
 +GND -> - de pe breadboard
 +OUT -> D2
 +
 +Buzzer:
 +
 +Pozitiv -> D8
 +Negativ -> - de pe breadboard
 +
 +LED Verde:
 +
 +Anod -> D3
 +Catod -> Rezistor 220Ω -> - de pe breadboard
 +
 +LED Galben:
 +
 +Anod -> D4
 +Catod -> Rezistor 220Ω -> - de pe breadboard
 +
 +LED Rosu:
 +
 +Anod -> D5
 +Catod -> Rezistor 220Ω -> - de pe breadboard
 +</​note>​
 +
 +
 +===== Imagini =====
 +{{:​pm:​prj2026:​alexandru.predescu:​poza1.jpeg?​400|}}
 +{{:​pm:​prj2026:​alexandru.predescu:​poza2.jpeg?​400|}}
 +{{:​pm:​prj2026:​alexandru.predescu:​pozq3.jpeg?​400|}}
 +
 +===== Video demonstrativ =====
 +[[https://​ctipub-my.sharepoint.com/:​v:/​g/​personal/​amarinescu0302_stud_acs_upb_ro/​IQDb1TZ2S7NMSZ5OuOrSmtAsATJTHLpqKO6NYUTNvjqNkzo?​nav=eyJyZWZlcnJhbEluZm8iOnsicmVmZXJyYWxBcHAiOiJPbmVEcml2ZUZvckJ1c2luZXNzIiwicmVmZXJyYWxBcHBQbGF0Zm9ybSI6IldlYiIsInJlZmVycmFsTW9kZSI6InZpZXciLCJyZWZlcnJhbFZpZXciOiJNeUZpbGVzTGlua0NvcHkifX0&​e=FQeUTS]]
 +
 +
 +===== Implementare Software =====
 +
 +Implementarea software este complet functionala si stabila. Aplicatia este scrisa in limbajul C pentru microcontrolerul ATmega328P, transformand sistemul intr-un distribuitor inteligent de pastile autonom. Sistemul gestioneaza continuu un automat de stari care interpreteaza comenzi primite prin interfata seriala pentru a actiona un mecanism cu compartimente bazat pe servomotor. Concomitent,​ monitorizeaza activ un senzor de obstacole cu infrarosu IR folosind intreruperi hardware, controleaza o alarma acustica -buzzer- de tip Active-LOW si ofera feedback in timp real utilizatorului prin intermediul unui ecran LCD I2C si al unor LED-uri de stare.
 +
 +===== Biblioteci alese =====
 +
 +avr/io.h si avr/​interrupt.h:​ Au fost selectate pentru a oferi acces direct la harta de registri a microcontrolerului ATmega328P de pe Arduino Uno (ex. DDRB, EIMSK, TCCR1A), asigurand manipularea bitilor cu zero overhead si gestionarea directa vectorilor de intrerupere hardware (ISR(INT0_vect));​
 +
 +util/​delay.h:​ Utilizata pentru mici temporizari de debouncing si pentru a regla viteza de rotatie a servomotorului;​
 +
 +
 +Wire.h si LiquidCrystal_I2C.h:​ Au fost incluse pentru a controla afisajul LCD 16x2 prin protocolul I2C;
 +
 +
 +===== Noutati =====
 +Principala noutate a acestui proiect consta in arhitectura sa de tip intrerupere hardware combinata cu filtrare software. In loc sa aiba incredere in datele brute ale senzorului sau să iroseasca ciclurile procesorului verificand constant un pin, sistemul foloseste o abordare hibrida:
 +
 +La nivel hardware: Senzorul IR declanșează o întrerupere imediată pe procesor INT0 la orice schimbare logică, actualizând instantaneu un flag implementat cu volatile.
 +
 +La nivel software: Bucla principala aplica un filtru strict de stabilitate temporala. O pastila este confirmata ca fiind eliberata doar daca senzorul citeste un semnal stabil si continuu timp de 300 de milisecunde,​ ignorand astfel zgomotul de semnal. De asemenea, este confirmata ca fiind preluata de utilizator doar daca senzorul ramane liber timp de 500 de milisecunde.
 +
 +
 +===== Justificarea functionalitatilor de laborator =====
 +
 +Laboratorul 0: Manipularea directa a registrilor PORTB si DDRB pentru a controla led-urile de stare (pinii PB2, PB4) si pentru a actiona buzzerul Active-LOW de pe pinul PB3.
 +
 +Laboratorul 1 (USART): Protocolul de comunicare seriala este configurat manual la 9600 baud folosind registrii (UBRR0, UCSR0A/​B/​C). Gestioneaza fluxul bidirectional de date (receptia comenzilor pentru compartimente si transmiterea log-urilor de diagnostic pe PC).
 +
 +Laboratorul 2 (intreruperi externe): Implementat prin INT0 pe pinul PD2. Registrul de control (EICRA) este configurat sa declanseze o intrerupere la orice schimbare logica (ISC00=1, ISC01=0), permitand procesorului de pe Arduino Uno sa detecteze instantaneu atat sosirea, cat si preluarea pastilei.
 +
 +Laboratorul 3 (Timere & PWM): Utilizează Timer-ul 1 (pe 16-biți) configurat in modul Fast PWM. Semnalul generat hardware actioneaza pe pinul PB1 (OC1A) pentru a pozitiona servomotorul.
 +
 +
 +===== Scheletul proiectului si interactiunea functionala =====
 +
 +<​code>​
 ++-----------------------------------------------------------------------+
 +|                         ​Initializare hardware ​                        |
 +|   ​(usart_init() | pwm_servo_init() | gpio_init() | intreruperi_init())|
 ++-----------------------------------------------------------------------+
 +                                    |
 +                                    v
 ++-----------------------------------------------------------------------+
 +|                         Bucla principala [while(1)] ​                  |
 ++-----------------------------------------------------------------------+
 +| Starea 0: in asteptare / asteapta comanda UART                        |
 ++-----------------------------------------------------------------------+
 +          | (comanda primita: 1-4)
 +          v
 ++-----------------------------------------------------------------------+
 +| - aprinde LED-ul rosu (Avertizare miscare) ​                           |
 +| - Mascheaza intreruperea INT0 (EIMSK &= ~(1 << INT0)) pt. a evita zgomotul
 +| - Misca servo lent catre compartiment(muta_servo) ​      |
 +| - Demascheaza intreruperea INT0 (Reactivare senzor) ​                  |
 +| - Asteapta max 10s validarea senzorului IR (filtru stabilitate 300ms) |
 ++-----------------------------------------------------------------------+
 +          |                                            |
 + ​[Senzor Validat: FALS]                       ​[Senzor Validat: ADEVARAT]
 +          |                                            |
 +          v                                            v
 ++------------------------------------+ ​     +------------------------------------+
 +| Starea 2: Eroare mecanica ​         |      | Starea 1: Alarma Activa ​           |
 +| - tine LED-ul rosu APRINS ​         |      | - Declanșează Bip-uri scurte ​      |
 +| - Afiseaza "​EROARE BLOCAJ" ​        ​| ​     | - Clipeste LED-ul rosu (la 500ms) ​ |
 +| - Asteapta 5 secunde, Auto-Reset ​  ​| ​     | - Asteapta ridicarea pastilei ​     |
 ++------------------------------------+ ​     +------------------------------------+
 +                                                       |
 +                                                       v (Pastila preluata)
 +                                            +------------------------------------+
 +                                            | - Opreste Buzzerul (PORTB |= PB3)  |
 +                                            | - Aprinde LED-ul Verde             |
 +                                            | - Afisează "​Status OK" ​            |
 +                                            | - Revine in Starea 0               |
 +                                            +------------------------------------+
 +                                            ​
 +</​code>​
 +===== Eveniment de intrerupere asincrona =====
 +Independent de fluxul prezentat mai sus, procesorul de pe Arduino Uno evalueaza starea senzorului IR exclusiv in fundal. Daca pinul PD2 isi schimba starea logica in orice microsecunda,​ CPU-ul isi opreste temporar executia normala pentru a actualiza flag-ul de status brut:
 +ISR(INT0_vect) {
 +  if ((PIND & (1 << PD2)) == 0) {
 +    senzor_activ = 1; // pastila e detectata in suport
 +  } else {
 +    senzor_activ = 0; // suportul e este gol
 +  }
 +}
 +
 +===== Ce trebuie imbunatatit =====
 +Senzorul IR trebuie calibrat astfel incat sa nu detecteze fundul sau peretii paharului,​ci doar pastila. ​
 +Voi adauga benzi led pentru feedback-ul vizual al utilizatorului in loc de cele 2 led-uri tip dioda. ​
 +
 +
 +
 +===== Poze si video =====
 +servomotorul este lipit sub cerc, in mijloc si actioneaza fantele care imping pastilele intr-un tobogan, acestea cazand in pahar unde sunt detectate dupa de senzorul IR. 
 +
 +{{:​pm:​prj2026:​alexandru.predescu:​dozator1.jpeg?​400|}}
 +
 +{{:​pm:​prj2026:​alexandru.predescu:​dozator2.jpeg?​400|}}
 +{{:​pm:​prj2026:​alexandru.predescu:​dozator3.jpeg?​400|}}
 +
 +In video, este introdusa de la tastatura o cifra care indica pornirea dispozitivului. Cand automatul porneste, servomotorul invarte fantele, iar acestea imping pastila existenta in unul din compartimente. Pastila cade in pahar unde este detectata de senzorul IR. Buzzerul si led-ul rosu se activeaza pentru un feedback vizual si auditiv, iar pe display-ul LCD I2C apare un mesaj pentru utilizator "​ridica pastila"​. Cand pastila este luata din pahar, senzorul IR se opreste, odata cu buzzerul si led-ul, iar pe ecran apare mesajul "​Pastila ridicata, containter gol". In video, senzorul este actionat cu mana, calibrarea acestuia facandu-se ulterior. ​
 +
 +https://​ctipub-my.sharepoint.com/:​v:/​g/​personal/​amarinescu0302_stud_acs_upb_ro/​IQBwZuC0wOBcS5tocumC_ktPAaHzF-ELLkTitfASKDODtKA?​nav=eyJyZWZlcnJhbEluZm8iOnsicmVmZXJyYWxBcHAiOiJPbmVEcml2ZUZvckJ1c2luZXNzIiwicmVmZXJyYWxBcHBQbGF0Zm9ybSI6IldlYiIsInJlZmVycmFsTW9kZSI6InZpZXciLCJyZWZlcnJhbFZpZXciOiJNeUZpbGVzTGlua0NvcHkifX0&​e=ZZPUFt
  
  
-<​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ 
  
  
pm/prj2026/alexandru.predescu/amarinescu0302.1778359704.txt.gz · Last modified: 2026/05/09 23:48 by amarinescu0302
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