Differences

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

Link to this comparison view

pm:prj2025:vstoica:andrei_vlad.racolta [2025/05/28 01:20]
andrei_vlad.racolta [Rezultate]
pm:prj2025:vstoica:andrei_vlad.racolta [2025/05/31 17:29] (current)
andrei_vlad.racolta [Rezultate]
Line 39: Line 39:
  
   * AVR-GCC cu toolchain standard pentru microcontrolere AVR   * AVR-GCC cu toolchain standard pentru microcontrolere AVR
-  * Compatibil cu Arduino IDE sau PlatformIO+  * PlatformIO și Arduino IDE compatible
   * Target: ATmega328P (Arduino Uno/Nano)   * Target: ATmega328P (Arduino Uno/Nano)
 +  * Frecvență:​ 16MHz crystal oscillator
  
 === Biblioteci și surse 3rd-party folosite === === Biblioteci și surse 3rd-party folosite ===
Line 49: Line 50:
   * stdint.h - tipuri de date standard   * stdint.h - tipuri de date standard
  
-=== Implementare proprie (fără ​biblioteci ​externe) ===+=== Implementare proprie (fără ​dependințe ​externe) ===
  
-  * Protocol I2C pentru comunicația cu LCD-ul +  * Protocol I2C low-level ​pentru comunicația cu LCD-ul 
-  * Control PWM manual ​pentru servomotor +  * Control PWM hardware cu Timer1 ​pentru servomotor ​SG90 
-  * Interfață UART pentru debugging+  * Interfață UART pentru debugging ​și monitorizare
  
 === Algoritmi și structuri implementate === === Algoritmi și structuri implementate ===
Line 94: Line 95:
 </​code>​ </​code>​
  
-== 2. Algoritmi de control ​îmbunătățiți ​==+== 2. Algoritmi de control ==
  
 Sistem de dispensare multi-ciclu:​ Sistem de dispensare multi-ciclu:​
Line 101: Line 102:
   * MEDIUM: 10 cicluri × 1 secundă = 10 secunde totale   * MEDIUM: 10 cicluri × 1 secundă = 10 secunde totale
   * HIGH: 15 cicluri × 1 secundă = 15 secunde totale   * HIGH: 15 cicluri × 1 secundă = 15 secunde totale
 +  * Pattern: open(1s) → close(instant) → open(1s) → close(instant)...
  
-Patternopen(1s) → close(instant) → open(1s) → close(instant)...+Control servo pentru SG90 cu Timer1:
  
-Control ​servo pentru ​SG90:+  * Unghi maxim: 90° (limita ​servo-ului SG90
 +  * Alimentare5V pentru performanță optimă 
 +  * PWM hardware: Timer1 în Fast PWM mode (ICR1 ca TOP) 
 +  * Frecvență:​ 50Hz (perioada 20ms) pentru compatibilitate servo 
 +  * Prescaler: 8 pentru precizie optimă la 16MHz 
 +  * Formula OCR1A: 2000 + (angle * 2000) / 90 pentru 1-2ms pulse width
  
-  * Unghi deschis la 90 de grade +Sistem ​de cooldown dual:
-  * Generare PWM manuală cu 10 repetiții pentru stabilitate +
-  * Închidere instantanee între cicluri pentru eficiență+
  
-Sistem de cooldown cu opțiune specială:+  * Umani: 0 (NONE), 5, 10, 15, 30, 45, 60 minute 
 +  * Animale: 30, 60, 120, 240, 480, 720 minute (fără ​opțiunea NONE) 
 +  * Timer softwarebazat pe bucla principală (increment la 10ms)
  
-  * Pentru oameni: 0 (NONE), 5, 10, 15, 30, 45, 60 minute +== 3. Arhitectura sistemului ==
-  * Pentru animale: 30, 60, 120, 240, 480, 720 minute (fără opțiunea NONE) +
-  * Timer bazat pe bucla principală (increment la 10ms)+
  
-== 3. Arhitectura sistemului modernizată == +Mașină de stări:
-Mașină de stări ​cu cicluri:+
  
-  * IDLE - sistem pregătit, afișează setări +  * IDLE - sistem pregătit, afișează setări ​curente 
-  * MULTI-CYCLE DISPENSING - alternează între ​open/close cu progres ​afișat +  * MULTI-CYCLE DISPENSING - alternează între ​deschis/închis ​cu progres ​vizual 
-  * COOLDOWN - sistem blocat ​pentru un interval de timp (vizibil ​pe LCD)+  * COOLDOWN - sistem blocat ​cu countdown afișat ​pe LCD
  
 Interfață utilizator: Interfață utilizator:
Line 132: Line 136:
  
 === Funcții și module implementate === === Funcții și module implementate ===
-Comunicație I2C+ 
 +Comunicație I2C:
  
   * i2c_init() - configurare TWI la 100kHz   * i2c_init() - configurare TWI la 100kHz
Line 138: Line 143:
   * lcd_send_i2c() - transmisie către LCD   * lcd_send_i2c() - transmisie către LCD
  
-Driver LCD cu I2C expander (HD44780)+Driver LCD cu I2C expander (HD44780):
  
   * lcd_init() - secvență de inițializare 4-bit   * lcd_init() - secvență de inițializare 4-bit
Line 145: Line 150:
   * lcd_set_cursor(),​ lcd_clear() - control cursor și display   * lcd_set_cursor(),​ lcd_clear() - control cursor și display
  
-Control servomotor SG90+Control servomotor SG90 cu Timer1:
  
-  * servo_set_angle() - poziționare ​precisă ​0-90° +  * servo_init_hardware() - configurare Timer1 pentru Fast PWM mode 
-  * Calibrare pentru SG90optimizat ​pentru ​5V +  * Timer1 Setup: ICR1=39999 pentru TOP, prescaler=8,​ frecvență=50Hz 
-  * PWM manual20ms perioada, 1-2ms lățime puls +  * servo_set_angle_hardware() - poziționare ​prin OCR1A (0-90°) 
-  * Stabilitate:​ 10 repetiții per comandă+  * PWM Enable/​Disableactivare pe cerere ​pentru ​economie energie 
 +  * Stabilizare200ms PWM activ pentru poziționare precisă
  
-Sistem multi-ciclu de dispensare+Sistem multi-ciclu de dispensare:
  
   * open_trap() - inițializează secvența de cicluri   * open_trap() - inițializează secvența de cicluri
Line 160: Line 166:
   * Progres LCD: actualizare în timp real "​Cycle:​ X/Y"   * Progres LCD: actualizare în timp real "​Cycle:​ X/Y"
  
-Gestionare cooldown+Gestionare cooldown:
  
   * Pentru MODE_HUMAN: opțiunea "​0"​ = fără cooldown   * Pentru MODE_HUMAN: opțiunea "​0"​ = fără cooldown
Line 167: Line 173:
   * Afișare LCD: "No cooldown"​ sau "​Cooldown:​ Xm"   * Afișare LCD: "No cooldown"​ sau "​Cooldown:​ Xm"
  
-Interfață utilizator+Interfață utilizator:
  
   * handle_buttons() - debouncing și edge detection   * handle_buttons() - debouncing și edge detection
Line 174: Line 180:
   * Feedback UART: logging detaliat pentru debug   * Feedback UART: logging detaliat pentru debug
  
-Detectare proximitate+Detectare proximitate:
  
   * check_proximity() - citire senzor cu pull-up intern   * check_proximity() - citire senzor cu pull-up intern
Line 180: Line 186:
   * Filtrare zgomot: prin variabila lastProximityState   * Filtrare zgomot: prin variabila lastProximityState
  
-Algoritm principal+Algoritm principal:
 <​code>​ <​code>​
-// Bucla principală - gestionare completă sistem +// Configurare Timer1 pentru control servo hardware 
-while (1) { +void servo_init_hardware(void) { 
-    ​handle_buttons(); ​                   ​// Procesează interfața utilizator +    // Timer1 Fast PWM Mode cu ICR1 ca TOP 
-    ​ +    ​TCCR1A = (1 << WGM11);           // Fast PWM Mode 14 
-    if (!cooldownActive && !servoActive+    ​TCCR1B = (1 << WGM13(1 << WGM12) | (1 << CS11); // Prescaler=8 
-        ​// Detectare proximitate doar când sistemul este gata +    ​ICR1 = 39999; ​                  // TOP pentru 50Hz (20ms perioada)
-        ​if ​(edge_detectedopen_trap(); +
-    ​}+
     ​     ​
     if (servoActive) {     if (servoActive) {
-        // Cicluri de dispensare cu timing precis +        // Cicluri de dispensare cu Timer1 
-        ​if (cyclePhase ​== 0{          ​// Dispensing phase +        ​OCR1A = calculate_servo_position(angle); 
-            if (time > 1_second) → close_servo,​ switch_to_closing +        TCCR1A |(1 << COM1A1);    ​// Enable PWM output 
-        ​} else {                        // Closing phase  ​ +    } else { 
-            ​increment_cycle;​ +        ​// Servo în repaus - PWM dezactivat 
-            if (cycle <= total→ open_servo, restart_dispensing +        ​TCCR1A &= ~(<< COM1A1);   // Disable PWM pentru economie
-            else → finish_all_cycles +
-        }+
     }     }
-    ​ 
-    if (cooldownActive) { 
-        // Countdown cu afișare progres 
-        if (cooldown_expired) → system_ready 
-    } 
-    ​ 
-    delay_ms(10); ​ // Control rata execuție: 100Hz 
 } }
 </​code>​ </​code>​
Line 213: Line 208:
 === Caracteristici ale sistemului === === Caracteristici ale sistemului ===
  
-Flexibilitate operațională+Flexibilitate operațională:
  
   * Modul HUMAN: acces rapid fără cooldown pentru testare/​demonstrații   * Modul HUMAN: acces rapid fără cooldown pentru testare/​demonstrații
Line 219: Line 214:
   * Comutare instantanee între moduri cu reset automat al stării   * Comutare instantanee între moduri cu reset automat al stării
  
-Performanță+Performanță:
  
   * Închidere instantanee între cicluri (fără întârzieri inutile)   * Închidere instantanee între cicluri (fără întârzieri inutile)
Line 226: Line 221:
   * Rata execuție: 100Hz pentru răspuns rapid   * Rata execuție: 100Hz pentru răspuns rapid
  
-Siguranță și robustețe+Siguranță și robustețe:
  
   * Reset automat la schimbarea modurilor   * Reset automat la schimbarea modurilor
Line 233: Line 228:
   * Validare intrări și limitări hardware   * Validare intrări și limitări hardware
  
-Interfață completă+Interfață completă:
  
   * Feedback vizual: LCD cu progres în timp real   * Feedback vizual: LCD cu progres în timp real
-  * Monitoring ​remote: UART logging pentru toate operațiunile+  * Monitoring ​remot: UART logging pentru toate operațiunile
   * Control intuitiv: 3 butoane pentru acces la toate funcțiile   * Control intuitiv: 3 butoane pentru acces la toate funcțiile
   * Diagnosticare:​ mesaje detaliate pentru troubleshooting   * Diagnosticare:​ mesaje detaliate pentru troubleshooting
  
 +Sistemul oferă un dispenser automat de hrană complet funcțional,​ cu control granular al cantității prin sistemul de cicluri multiple și flexibilitate maximă pentru utilizare atât umană cât și pentru animale, prin sistemul dual de cooldown configurable.
 ===== Cod sursă ===== ===== Cod sursă =====
  
Line 307: Line 303:
   * 10 ore - testarea componentelor,​ asamblarea proiectului si orice retusuri la proiect   * 10 ore - testarea componentelor,​ asamblarea proiectului si orice retusuri la proiect
   * 6 ore - scrierea acestei pagini + crearea a unei scheme de tip bloc si a unei scheme electrice   * 6 ore - scrierea acestei pagini + crearea a unei scheme de tip bloc si a unei scheme electrice
-  * 1 ora creacrea ​paginii de Github+  * 2 ore crearea ​paginii de Github ​+ README
pm/prj2025/vstoica/andrei_vlad.racolta.1748384437.txt.gz · Last modified: 2025/05/28 01:20 by andrei_vlad.racolta
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