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/27 19:37]
andrei_vlad.racolta [Introducere]
pm:prj2025:vstoica:andrei_vlad.racolta [2025/05/31 17:29] (current)
andrei_vlad.racolta [Rezultate]
Line 14: Line 14:
  
 ===== Descriere generala ===== ===== Descriere generala =====
-{{:​pm:​prj2025:​vstoica:​diagrama_pm22.png?600|}}+{{:​pm:​prj2025:​vstoica:​diagrama_pm_2.png?600|}}
  
 ===== Hardware Design ===== ===== Hardware Design =====
-{{:​pm:​prj2025:​vstoica:​andrei_vlad.racolta_schema_electrica_pm.png?600|}}+{{:​pm:​prj2025:​vstoica:​acrobat_whesl2gmch.png?600|}}
  
 Proiectul dispune de următoarele componente: Proiectul dispune de următoarele componente:
-  ​* 1x Placă compatibilă cu Arduino Uno R3 +   * 1x Placă compatibilă cu Arduino Uno R3 
-  * 1x Senzor infra-roșu de detectare a obstacolelor +   ​* 1x Senzor infra-roșu de detectare a obstacolelor ​(Distanța: 2-180 cm) 
-  * 1x Servo-Motor pentru mișcarea trapei +   ​* 1x Servo-Motor ​SG90 pentru mișcarea trapei 
-  * 1x Display LCD I2C pentru a prezenta situația automatului +   ​* 1x Display LCD I2C pentru a prezenta situația automatului 
-  * 3x Butoane pentru a seta automatul +   ​* 3x Butoane pentru a seta automatul 
-  * Fire tată-tată +   ​* 3x Breadboarduri 
-  * Fire mamă-tată +   ​* Cutie de prim ajutor (ce conține toate componentele de mai sus, cu excepția servo-motorului) 
-  ​* 3x Breadboarduri +   ​* Recipient de plastic ​cu gaura (ce conține servo-motorul) 
-  * Cutie de prim ajutor (ce conține toate componentele de mai sus, cu excepția servo-motorului) +   ​Trapa de plastic ​(de tip solniță) 
-  * Recipient de plastic (ce conține servo-motorul) +   ​* Raft de plastic (de care sunt prinse cutia și recipientul
-  Trapă ​de plastic +   * Un suport de plastic pentru a prinde servo-motorul de recipient 
-  * Raft de plastic (de care sunt prinse cutia și recipientul)+   * Șuruburi și piulițe pentru prinderea componentelor (recipientul,​ cutia, componentele electronice,​ servo motorul)
  
  
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ă =====
 +
 +Link Github: https://​github.com/​Dratopia18/​Dispensor-de-Mancare-Multipurpose
 +
 +===== Jurnal =====
 +28.04.2025 ​
 +  * Am comandat Kit Plusivo Microcontroller Starter de la Optimus Digital si senzorul pentru detectarea obstacolelor
 +29.04.2025 ​
 +  * Am comandat niste breadboarduri pentru proiect si am facut rost de un display de la un prieten ce avea mai multe displayuri disponibile
 +30.04.2025 ​
 +  * Am creat proiectul "​Dispensor de Mancare Multipurpose"​ folosind PlatformIO. Oficial, pot spune ca am inceput sa lucrez la proiect
 +05.05.2025 ​
 +  * Am cumparat fire tata-tata si fire mama-tata pentru proiect
 +07.05.2025 ​
 +  * Am inceput sa testez la laboratorul de PM functionalitatea fiecarui component. La display au fost niste probleme, dar le-am rezolvat acasa
 +08.05.2025 ​
 +  * Incep sa scriu logica de cod pentru fiecare functionalitate in parte (cel putin pentru display si servo-motor)
 +11.05.2025 ​
 +  * Primul "​prototip"​ al proiectului este gata. Are implementata o versiune simplificata a codului actual
 +  {{:​pm:​prj2025:​vstoica:​prototip_proiect_pm.jpg?​200|}}
 +  * Il ducem la un unchiul meu si imi spune ca trebuie folosite alte butoane decat cele venite din kit. Are un kit intreg de butoane ce erau folosite la borduri de avioane. Aleg acest buton pentru proiect. Este primul lucru pe care il sudez in acest proiect.
 +  {{:​pm:​prj2025:​vstoica:​buton_avion.jpg?​200|}}
 +  ​
 +12.05.2025
 +  * Mai iau 2 mini breadboarduri,​ dupa ce imi dau seama ca nu ar incapea un breadboard mare in proiectul nostru
 +  * Conectez intregul proiect pe 3 breadboarduri
 +14.05.2025
 +  * Prezint partea de hardware a proiectului. Servo-motorul nu mergea bine, nu stiam de ce :((
 +17.05.2025
 +  * Mergem din nou la unchiul meu, sa punem componentele intr-o cutie de prim ajutor. Vopsim capacul cutiei cu vopsea. Se usuca repede
 +  * Folosesc o carioca pentru a marca gaurile si folosesc o bormasina pentru a face gaurile
 +  * Am folosit o pila ca sa mai finisam din gauri (in special cea de la display si portul USB)
 +  * Am sudat si celelalte 2 butoane si am acoperit pinii cu banda adeziva
 +  * Rezultatul final, dupa 4 ore de munca (si dupa inca o jumatate de ora sa reconectez firele la componente):​
 +  {{:​pm:​prj2025:​vstoica:​cutia_magica.jpg?​300|}}
 +  ​
 +21.05.2025
 +  * Prezint partea software la laboratorul de PM. Imi dau seama de ce nu mergea servo-motorul (trebuia sa le conectez direct la placuta)
 +23.05.2025
 +  * Evrika! Stiu cum sa fac trapa. Trapa va functiona ca o solnita. Facem trapa dintr-o bucata circulara de plastic
 +  * Ne dam seama ca nu avem cum sa atasam servo-motorul de un recipient cu palnie (folosim un recipient standard, in care stau cereale)
 +25.05.2025
 +  * Cumparam un raft de plastic de la Dedeman, mergem pentru ultima data la unchiul meu, mai fac doua gauri in spatele raftului ca sa prind cutia de raft, dupa fac gauri si pentru cutie si pentru recipient.
 +  * Atasam servo-motorul in recipient
 +  * Rezultatul final dupa inca vreo 3 ore de munca:
 +  {{:​pm:​prj2025:​vstoica:​le_dispozitiv.jpg?​300|}}
 +  ​
 +26.05.2025
 +  * Imi dau seama ca proiectul mai are doua probleme mari: detectarea distantei si modul cum dadea mancarea
 +  * La detectarea distantei, mi-am dat repede seama de ce nu mergea bine: emitorul era blocat de perete si detecta la o distanta mult mai mica (bormasina strikes again)
 +  * La modul cu mancarea, mi-am dat seama ca cel mai usor mod de a da de mancare este de a face cicluri rapide de open si close la servo-motor,​ in asa fel incat sa dea destula mancare pe fiecare categorie (de 5 ori la LOW, de 10 ori la MED si de 15 ori la HIGH)
 +  * Rezultatul final dupa 2 ore de retusuri: un client fericit
 +  {{:​pm:​prj2025:​vstoica:​clientul_fericit.jpg?​300|}}
 +
 +27.05.2025 ​
 +  * Am facut pagina de Github a proiectului si am modificat putin pagina de OCW
 +  * Am adaugat acest jurnal, ca si amintire a acestei perioade intense
 +===== Rezultate =====
 +Dispensorul este capabil sa dea mancare pentru pisica mea. Nu e perfect (se mai intampla ca trapa sa nu se miste la capacitate maxima daca e blocata o bobita pe sub ea), dar in principal:
 +  * senzorul functioneaza si se activeaza daca vede un obiect pe o raza de aproximativ 10 cm
 +  * displayul afiseaza ce e necesar (modul, cata mancare trebuie sa dea, cooldownul, arata x/y cicluri cand e pornit servo motorul)
 +  * butoanele functioneaza si interactioneaza perfect cu displayul si placuta
 +
 +Timpul petrecut:
 +  * ~25 de ore - scris si retusat codul
 +  * 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
 +  * 2 ore - crearea paginii de Github + README
pm/prj2025/vstoica/andrei_vlad.racolta.1748363820.txt.gz · Last modified: 2025/05/27 19:37 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