This is an old revision of the document!
1. Module Hardware
Alimentare: Sursa de 5V DC asigura tensiunea stabila pentru microcontroler si senzorul IR, in timp ce un regulator de tensiune, daca este necesar, protejeaza circuitele logice de consumul instantaneu al servomotorului.
Procesare: Microcontrolerul Arduino Uno 16U2 este unitatea centrala care gestioneaza timpul, proceseaza comenzile primite prin interfata seriala si controleaza elementele mecanice.
Intrari: Senzor IR: Detecteaza prezenta sau ridicarea pastilei din recipientul de colectare.
Interfata UART: Permite utilizatorului sa introduca programul de administrare.
Iesiri: Servomotor care actioneaza compartimentele de sortare prin semnale PWM pentru a elibera doza corecta.
Sistem de alerta (Buzzer si LED-uri): Ofera feedback acustic si vizual pentru a semnaliza momentele de administrare si starea sistemului.
2. Module Software
Driver UART: Gestioneaza receptia datelor de configurare, adica a orelelor de administrare, si trimite log-uri de confirmare catre utilizator.
Timer: Utilizeaza un timer intern pentru a genera o baza de timp precisa, comparand constant ora curenta cu orele de administrare salvate.
Generator PWM: Moduleaza latimea impulsurilor pentru a controla unghiul servomotorului, permitand alinierea precisa a compartimentului de pastile cu jgheabul de eliberare.
Rutina de intrerupere: O functie prioritara declansata de senzorul IR care detecteaza imediat interactiunea utilizatorului cu pastila, asigurand oprirea instantanee a alertelor.
3. Interactiunea
Procesul incepe cu programarea orelor de administrare prin interfata UART, datele fiind stocate in memoria microcontrolerului. Sistemul monitorizeaza timpul in timp real folosind un Timer intern, semnalizand starea de asteptare printr-un LED verde conectat la un pin GPIO. La ora stabilita, Arduino Uno 16U2 genereaza un semnal PWM pentru a roti servomotorul si a elibera pastila, moment in care se activeaza alertele vizuale si sonore. Ciclul se incheie doar atunci cand senzorul optic detecteaza ridicarea medicamentului, declansand o intrerupere externa care opreste imediat buzzerul si reseteaza dispozitivul pentru urmatoarea doza.
| Componenta | Cantitate | Tip / Model | Rol in proiect |
|---|---|---|---|
| Microcontroler | 1 | Arduino Uno 16U2 | Unitatea centrala de procesare care gestioneaza timpul, senzorii, servomotorul si logica sistemului. |
| Servomotor | 1 | SG90 / MG996R | Controleaza mecanismul de eliberare a pastilelor prin rotatia compartimentelor. |
| Senzor IR / Bariera optica | 1 | Modul IR FC-51 / TCRT5000 | Detecteaza prezenta sau ridicarea pastilei din recipientul de administrare. |
| Buzzer activ | 1 | 5V Active Buzzer | Genereaza semnale sonore pentru notificarea utilizatorului la ora administrarii. |
| LED verde | 1 | LED 5mm | Semnalizeaza functionarea normala si starea de asteptare a sistemului. |
| LED rosu | 1 | LED 5mm | Indica existenta unei alerte sau a unei doze neadministrate. |
| LED galben | 1 | LED 5mm | Avertizeaza apropierea unei administrari programate. |
| Rezistente | 3-5 | 220Ω / 330Ω | Protejeaza LED-urile si stabilizeaza semnalele electrice din circuit. |
| Sursa alimentare | 1 | 5V DC Adapter | Furnizeaza energia necesara microcontrolerului si componentelor periferice. |
| Condensator electrolitic | 1 | 470µF / 16V | Reduce fluctuatiile de tensiune produse de servomotor la pornire. |
| Breadboard / PCB | 1 | Breadboard MB-102 | Permite realizarea conexiunilor electrice dintre componente. |
| Fire conexiune | set | Male-Male / Male-Female | Asigura conexiunile dintre modulele hardware si microcontroler. |
| Cablu USB | 1 | USB Type-B | Permite alimentarea placii Arduino si configurarea sistemului prin UART/Serial. |
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
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.
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 16×2 prin protocolul I2C;
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.
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.
+-----------------------------------------------------------------------+
| Inițializare 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 în Starea 0 |
+------------------------------------+
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
}
}
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.
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.
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.