Differences

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

Link to this comparison view

pm:prj2026:cezar.zlatea:teodor.pana [2026/05/16 20:25]
teodor.pana
pm:prj2026:cezar.zlatea:teodor.pana [2026/05/25 13:49] (current)
teodor.pana [Schema electrica]
Line 3: Line 3:
 ===== Introducere ===== ===== Introducere =====
  
-Proiectul meu este un dispozitiv ​inteligent ​care determina automat cate tigari au mai ramas intr-un pachet ​de tigari, folosind un senzor de greutate de precizie.+Proiectul meu este un dispozitiv care determina automat cate tigari au mai 
 +ramas intr-un pachet, folosind un senzor de greutate de precizie.
  
-Ideea a pornit de la o observatie simpla: de multe ori nu stii cate tigari mai ai in pachet fara sa-l deschizi sau sa numeri manual. ​Mi-am propus sa rezolv ​acest lucru intr-un mod elegant si non-invaziv,​ fara a modifica pachetul si fara sa fie nevoie de o camera sau de procesare de imagine complexa.+Ideea a pornit de la o observatie simpla: de multe ori nu stii cate tigari 
 +mai ai in pachet fara sa-l deschizi sau sa numeri manual. ​Sistemul rezolva 
 +acest lucru intr-un mod non-invaziv,​ fara a modifica pachetul si fara 
 +procesare de imagine complexa.
  
-Sistemul foloseste un senzor de forta (load cell) conectat la un modul de amplificare ​ADC pe 24 de biti (HX711) pentru a masura greutatea pachetului cu precizie sub 0.1g. Deoarece fiecare tigara ​Marlboro Red cantareste aproximativ ​0.95g, iar greutatea ambalajului gol este cunoscuta si calibrata la pornire, microcontrollerul ​ATmega328P ​calculeaza numarul de tigari prin simpla impartire a greutatii nete la greutatea unei singure tigari. Rezultatul este afisat in timp real pe un ecran OLED de 128x64 pixeli. Interactiunea ​cu utilizatorul se face printr-un singur buton: o apasare scurta actualizeaza afisajul, iar una lunga recalibra tara (greutatea ambalajului gol).+Sistemul foloseste un senzor de forta (load cell 1kg) conectat la un modul 
 +HX711 (ADC 24-bit) pentru a masura greutatea pachetului cu precizie sub 0.1g. 
 +Deoarece fiecare tigara cantareste aproximativ ​1.13g, iar greutatea ambalajului 
 +gol este calibrata la pornire, microcontrollerul calculeaza numarul de tigari 
 +prin impartirea ​greutatii nete la greutatea unei singure tigari. Rezultatul 
 +este afisat in timp real pe un display TM1637 ​cu 4 cifre.
  
 Proiectul este util pentru ca: Proiectul este util pentru ca:
-  * Demonstreaza ​practic ​utilizarea unui ADC extern de inalta precizie (24 biti) cu ATmega328P +  * Demonstreaza utilizarea unui ADC extern de inalta precizie (24 biti) 
-  * Combina ​mai multe notiuni din laborator: GPIO, I2Cintreruperi si calibrare ADC +  * Combina notiuni din laborator: GPIO, UARTTimere 
-  * Reprezinta o solutie robusta si independenta de conditiile de iluminare, spre deosebire de o abordare bazata pe camera +  * Reprezinta o solutie robusta si independenta de conditiile de iluminare 
-  * Poate fi adaptat pentru orice tip de pachet sau produs cu greutate cunoscuta per unitate+  * Poate fi adaptat pentru orice produs cu greutate cunoscuta per unitate
  
 ===== Descriere generala ===== ===== Descriere generala =====
  
-{{ :pm:​prj2026:​cezar.zlatea:​diagram_teodor.pana.png?​nolink |}}+Sistemul este compus din urmatoarele module:
  
-Sistemul ​este compus ​din urmatoarele module ​hardware si softwarecare interactioneaza dupa cum urmeaza:+  * **Arduino Uno (ATmega328P)** ​este unitatea centrala de procesare. Placuta 
 +    initiala ATmega328P Xplained Mini a fost inlocuita ​din cauza unei probleme 
 +    ​hardware ​(semnatura de device 0x000000 la programare — microcontrollerul 
 +    nu mai raspundea corect la programatorul EDBG integrat, indiferent de 
 +    toolchain sau configuratie). Arduino Uno foloseste acelasi microcontroller 
 +    ATmega328P, cu bootloader standard ​si upload prin UARTeliminand complet 
 +    problema de programare.
  
-  * **ATmega328P Xplained Mini** este unitatea centrala de procesare. Citeste datele de la senzorul ​de greutate, calculeaza numarul de tigari si trimite rezultatul catre displayTotodata, gestioneaza butonul ​de interactiune al utilizatorului.+  * **Load cell 1kg** este senzorul ​mecanic care se deformeaza proportional 
 +    cu greutatea plasata pe elGenereaza un semnal diferential ​de tensiune 
 +    in intervalul mV.
  
-  * **Load cell (celula de sarcina) 100g** este senzorul mecanic care se deformeaza proportional cu greutatea plasata pe el. Genereaza ​un semnal diferential ​de tensiune in intervalul mV, care este amplificat ​de modulul HX711.+  * **Modulul HX711** este un amplificator si convertor analog-digital ​de 
 +    24 de biti dedicat celulelor de sarcina. Comunica cu ATmega328P printr-un 
 +    protocol two-wire (DOUT si SCK) pe pinii D7 si D8.
  
-  * **Modulul HX711** este un amplificator si convertor analog-digital de 24 de bitidedicat celulelor de sarcinaComunica cu ATmega328P printr-un ​protocol two-wire (DOUT si PD_SCK)diferit de SPI sau I2C standard. Ofera o rezolutie de aproximativ 0.1g, mai mult decat suficienta pentru a distinge o singura tigara (~0.95g).+  * **Display TM1637 (4 cifre)** afiseaza numarul curent de tigari din pachet. 
 +    Display-ul 7-segment raw 5461AS initial a fost inlocuit cu modulul TM1637 
 +    deoarece acesta are driver integrateliminand necesitatea multiplexarii 
 +    software si a rezistoarelor individuale pe segmenteComunicarea se face 
 +    prin protocol two-wire (CLKDIOpe pinii PD2 si PD3.
  
-  * **Display OLED SSD1306 128x64** afiseaza numarul curent ​de tigari din pachet, greutatea neta masurata ​si mesaje ​de stare (ex: "​Calibrating...",​ "​Ready"​). Comunicarea se face prin protocolul I2C pe pinii PC4 (SDA) si PC5 (SCL).+  * **Alimentarea** se face de la 5V prin USB. HX711 si TM1637 sunt alimentate 
 +    ​de la rail-ul de 5V al Arduino Uno prin breadboard.
  
-  * **Butonul de interactiune** este conectat pe pinul PD2 cu rezistenta de pull-up interna activata. O apasare scurta (< 1s) declanseaza o noua masurare si actualizeaza afisajul. O apasare lunga (> 2s) initiaza recalibrarea tarei: sistemul salveaza greutatea curenta ca greutate de referinta a ambalajului gol. +Fluxul de functionare:​ la pornire, ​sistemul face tara automata (2 secunde). 
- +Utilizatorul ​plaseaza pachetul pe platforma si citeste numarul ​de tigari 
-  * **Alimentarea** se face de la 5V prin cablul USB al placii Xplained Mini. Modulul HX711 si display-ul OLED sunt alimentate de la acelasi rail de 5V, cu condensatoare de decuplare pentru stabilitate. +afisat ​in timp real. Comanda '​t'​ prin Serial recalibreaza tara.
- +
-Fluxul de functionare ​al sistemului este urmatorul: la pornire, ​utilizatorul ​plaseaza pachetul ​GOL pe platforma si apasa lung butonul pentru a calibra tara. Dupa calibrare, indiferent ​de cate tigari ​se afla in pachet, sistemul calculeaza automat numarul ramas la fiecare apasare scurta a butonului si il afiseaza pe OLED.+
  
 ^ Modul ^ Descriere Tehnica ^ Protocol / Interfata ^ ^ Modul ^ Descriere Tehnica ^ Protocol / Interfata ^
-| ATmega328P ​Xplained Mini | Unitate centrala ​de procesare, 16MHz, 5V | Master ​al intregului sistem ​+Arduino Uno (ATmega328P| Unitate centrala, 16MHz, 5V | Master | 
-| Load Cell 100g | Senzor mecanic rezistiv (punte Wheatstone) | Semnal analogic diferential ​(mV) +| Load Cell 1kg | Senzor mecanic rezistiv (punte Wheatstone) | Semnal analogic diferential | 
-| HX711 | ADC 24-bit + amplificator ​pentru load cell | Two-wire: ​DOUT (PC3), PD_SCK ​(PC2) | +| HX711 | ADC 24-bit + amplificator | Two-wire: ​DAT (D7), CLK (D8) | 
-OLED SSD1306 128x64 ​| Display ​grafic pentru afisarea rezultatelor ​I2CSDA (PC4), SCL (PC5+TM1637 4 cifre | Display ​7-segment cu driver integrat ​Two-wireCLK (PD2), DIO (PD3) |
-| Buton | Interactiune utilizator (masurare / calibrare) | GPIO: PD2, pull-up intern ​|+
  
 ===== Hardware Design ===== ===== Hardware Design =====
  
-==== Stadiul actual al implementării ​====+==== Componente folosite si rolul lor ====
  
-Am realizat conectarea display-ului 7-segment 5461AS ​(4 cifre) la ATmega328P Xplained Mini pe breadboard, cu rezistoarele ​de limitare curent pe segmente. Am validat funcționarea plăcii prin upload de firmware de test (LED blink pe PB5)confirmat vizual.+^ Componenta ^ Rol in proiect ^ Interfata ^ 
 +| Arduino Uno (ATmega328P) | Unitate centrala de procesare | — | 
 +| Display TM1637 ​4 cifre | Afisarea numarului ​de tigari | CLK=PD2DIO=PD3 | 
 +| HX711 modul GroundStudio | ADC 24-bit pentru load cell | DAT=D7, CLK=D8 | 
 +| Load cell 1kg | Masurarea greutatii pachetului | E+/E-/A+/A- la HX711 | 
 +| Breadboard + fire jumper | Montaj circuit prototip | — |
  
-Componentele de măsurare a greutății (load cell 1kg + modul HX711) au fost comandate și urmează să fie integrate în etapa următoare.+==== Pinii utilizati ====
  
-==== Componente folosite și rolul lor ====+^ Modul ^ Semnal ^ Pin Arduino Uno ^ Pin ATmega328P ^ 
 +| TM1637 — CLK | OUT | D2 | PD2 | 
 +| TM1637 — DIO | OUT/IN | D3 | PD3 | 
 +| HX711 — DAT | IN | D7 | PD7 | 
 +| HX711 — CLK | OUT | D8 | PB0 | 
 +| TM1637 — VCC | PWR | 5V | — | 
 +| TM1637 — GND | GND | GND | — | 
 +| HX711 — VDD | PWR | 5V | — | 
 +| HX711 — GND | GND | GND | — |
  
-^ Componentă ^ Rol în proiect ^ Interfață ^ +TM1637 foloseste protocol bit-bang implementat manual pe DDRD/PORTD. 
-| ATmega328P Xplained Mini | Unitate centrală de procesare | — | +HX711 este citit prin libraria HX711_ADC cu averaging intern. 
-| Display 7-segment 5461AS | Afișarea numărului de țigări | GPIO — multiplexare software | +Nu sunt necesare rezistoare externe ​— TM1637 ​are driver integrat
-| 7× rezistor 220Ω | Limitare curent pe segmente | — | +iar HX711 are amplificator dedicat.
-| Buton tactil | Declanșare măsurare / calibrare tară | GPIO PD2pull-up intern | +
-| Load cell 1kg (în așteptare) | Măsurarea greutății pachetului | Semnal analogic diferențial | +
-| Modul HX711 (în așteptare) | ADC 24-bit pentru load cell | Two-wire: DOUT + PD_SCK |+
  
-==== Pinii utilizați ​====+==== Schema electrica ​====
  
-^ Modul ^ Semnal ^ Pin ATmega328P ^ +{{:​pm:​prj2026:​cezar.zlatea:​screenshot_2026-05-25_134722.png?​550
-| Display — segment a | OUT | PD2 +}} 
-| Display — segment b | OUT | PD3 | +==== Dovada de functionare ====
-| Display — segment c | OUT | PD4 | +
-| Display — segment d | OUT | PD5 | +
-| Display — segment e | OUT | PD6 | +
-| Display — segment f | OUT | PD7 | +
-| Display — segment g | OUT | PB0 | +
-| Display — DIG1 | OUT | PB1 | +
-| Display — DIG2 | OUT | PB2 | +
-| Display — DIG3 | OUT | PB3 | +
-| Display — DIG4 | OUT | PB4 | +
-| Buton | IN | PD2 | +
-| HX711 DOUT (în așteptare) | IN | PC3 (A3) | +
-| HX711 PD_SCK (în așteptare) | OUT | PC2 (A2) |+
  
-Rezistoarele ​de 220Ω sunt montate pe fiecare linie de segment pentru a limita curentul la ~14mA per LEDPinii de cifră (DIG1–DIG4) merg direct, fără rezistor. Butonul folosește pull-up intern activat software (INPUT_PULLUP).+Am validat functionarea sistemului complet: 
 +  - Display TM1637 afiseaza cifrele 0-9 corect in secventa ​de test 
 +  - HX711 citeste greutatea cu eroare ​de ±0.06g in conditii stabile 
 +  ​Calculul numarului de tigari functioneaza corect cu factorul de calibrare determinat experimental
  
-==== Schema electrică ====+Montaj breadboard cu TM1637 si Arduino Uno
  
-TODO — schemă KiCad în lucru.+{{ :​pm:​prj2026:​cezar.zlatea:​cablaj1.jpeg?​nolink&​300 |}} 
 +{{ :​pm:​prj2026:​cezar.zlatea:​cablaj2.jpeg?​nolink&​300 |}} 
 +{{ :​pm:​prj2026:​cezar.zlatea:​cablaj3.jpeg?​nolink&​300 |}} 
 +{{ :​pm:​prj2026:​cezar.zlatea:​cablak4.jpeg?​nolink&​300 |}} 
 +==== Calcul greutate → numar tigari ====
  
-==== Dovadă ​de funcționare ====+  * Greutate ambalaj gol: **7.00g** (calibrata experimental) 
 +  * Greutate per tigara: **1.13g** (masurata experimental) 
 +  * Factor calibrare HX711: **736.75** (determinat cu obiect etalon ​de 12.6g) 
 +  * Formula: **nr_tigari ​round( (greutate_totala - 7.00) / 1.13 )** 
 +  * Eroare histerezis load cell: **±0.15g** (~13% din greutatea unei tigari)
  
-Am uploadat un program de test blink pe LED-ul onboard (PB5). LED-ul clipește la 500ms, confirmând că placa, toolchain-ul PlatformIO și conexiunea USB funcționează corect.+===== Software Design =====
  
-{{:​pm:​prj2026:​cezar.zlatea:​breadboard_display.jpg|}}+==== Stadiul actual al implementarii ====
  
-=== Schema electrica === +Proiectul functioneaza end-to-end: load cell-ul citeste greutatea pachetului,​ 
-TODO schema electrica realizata ​in KiCad+HX711 amplifica semnalul, Arduino Uno calculeaza numarul de tigari si afiseaza 
 +rezultatul pe TM1637 ​in timp real.
  
-=== Calcul greutate → numar tigari ​===+==== Biblioteci folosite ====
  
-Marlboro Red Long (cu tigari scurte): +^ Biblioteca ^ Rol ^ Justificare ^ 
-  Greutate ambalaj gol: ~23g (calibrata la pornire) +| **HX711_ADC** (olkal| Citire date load cell | Implementeaza averaging si filtrare interna, reducand zgomotulCitirea raw bit-bang manuala a dat rezultate instabile ​in teste initiale. | 
-  * Greutate per tigara: ~0.95g (constanta ​in cod) +**AVR libc** (avr/io.h, util/​delay.h| Acces registre hardware | Folosita direct pentru TM1637 si configurarea perifericelor — fara overhead Arduino. |
-  Formula: ​**nr_tigari = round(greutate_totala - tara) 0.95 )**+
  
-===== Software Design ​=====+Protocolul TM1637 este implementat **manual pe registre** (DDRD, PORTD), 
 +fara librarie externa. 
 + 
 +==== Element de noutate ​==== 
 + 
 +Proiectul combina masurarea gravimetrica de precizie cu estimarea prin 
 +divizare pentru a numara obiecte mici (~1g) fara contact vizual. Fata de 
 +solutiile clasice cu camera + computer vision (imposibile pe ATmega328P 
 +cu 2KB RAM), abordarea prin greutate este robusta, ieftina si functioneaza 
 +in orice conditii de iluminare. 
 + 
 +==== Functionalitati din laborator utilizate ==== 
 + 
 +^ Laborator ^ Functionalitate ^ Unde in cod ^ 
 +| **Lab 0 — GPIO** | Configurare pini TM1637 prin DDRD/PORTD | tm_start(), tm_write_byte() | 
 +| **Lab 1 — UART** | Comunicatie seriala pentru calibrare si debug | Serial.begin(57600),​ comenzi '​t'​ | 
 +| **Lab 3 — Timere** | Timer1 CTC pentru multiplexare display (implementare anterioara cu 5461AS) | ISR(TIMER1_COMPA_vect) | 
 + 
 +Registre AVR folosite direct: ''​DDRD'',​ ''​PORTD'',​ ''​DDRC'',​ ''​PORTC'',​ 
 +''​PINC'',​ ''​TCCR1A'',​ ''​TCCR1B'',​ ''​OCR1A'',​ ''​TIMSK1''​. 
 + 
 +==== Scheletul proiectului ==== 
 + 
 +<​code>​ 
 +setup() 
 +  ├── Initializare GPIO (DDRD, DDRB) 
 +  ├── Initializare TM1637 (tm_set_brightness) 
 +  ├── Initializare HX711_ADC (start + tare 2s) 
 +  └── Serial 57600 baud 
 + 
 +loop() 
 +  ├── LoadCell.update() ​        ← citire HX711 non-blocanta 
 +  ├── getData() ​                ← greutate in grame 
 +  ├── scade GREUTATE_PAC (7.00g) ← elimina greutatea pachetului gol 
 +  ├── round(net / 1.13)         ← calcul numar tigari 
 +  ├── afiseaza_numar() ​         ← scrie pe TM1637 via PORTD 
 +  └── Serial print              ← debug 
 +</​code>​ 
 + 
 +TM1637 foloseste pinii PD2/PD3 prin protocol bit-bang implementat manual. 
 +HX711_ADC ruleaza non-blocant prin LoadCell.update() apelat in fiecare 
 +iteratie. Calculul se face la fiecare 500ms pentru stabilitate. 
 + 
 +==== Calibrare senzor ==== 
 + 
 +Calibrarea s-a realizat in 3 pasi: 
 + 
 +  - **Tara**: la pornire, ''​LoadCell.start(2000,​ true)''​ face zero automat. 
 +    Retara manuala prin comanda ''​t''​ in Serial Monitor. 
 +  - **Factor de calibrare**:​ s-a pus un obiect cu masa cunoscuta (12.6g) 
 +    si s-a calculat factorul prin ''​LoadCell.getNewCalibration(12.6)''​. 
 +    Rezultat: **CAL_FACTOR = 736.75**. 
 +  - **Greutate per tigara**: masurata individual → **1.13g**. 
 +    Greutatea pachetului gol → **7.00g**. 
 + 
 +Eroarea de histerezis masurata: **±0.15g**. La 20 de tigari in pachet, 
 +eroarea maxima cumulata ramane sub 1 tigara. 
 + 
 +==== Optimizari realizate ==== 
 + 
 +  - **Averaging in HX711_ADC**:​ libraria face media mai multor citiri intern, 
 +    reducand zgomotul de la ±100 unitati raw la ±10 unitati. 
 +  - **Update non-blocant**:​ ''​LoadCell.update()''​ in loc de citire blocanta — 
 +    loop-ul ramane responsiv pentru comenzi Serial. 
 +  - **Print la 500ms**: evita flickering pe display si flood in Serial Monitor. 
 +  - **Grame negative clampate la 0**: evita afisarea de valori negative 
 +    din cauza histerezisului. 
 + 
 +==== Demo video ====
  
-  * **Mediu de dezvoltare**PlatformIO (Visual Studio Code) cu framework Arduino +[[https://​drive.google.com/​file/​d/​1oHkFTVzD7GpZiOxSTUX1jGL-Tldb4mS4/​view?​usp=drive_link| 8 TIGARI]] 
-  * **Limbaj**C++ (Arduino) +[[https://​drive.google.com/​file/​d/​1K9GP2bqRH9V55qn3s6AYltrKDtgfOcyk/​view?​usp=sharing| 10 TIGARI]]
-  * **Programare**:​ USB direct prin EDBG integrat pe Xplained Mini (fara ISP extern)+
  
 +== Calibrarea a fost facuta cu Dunhill, a trebuit sa cantaresc si sa modific cateva chestii ==
 ===== Rezultate Obtinute ===== ===== Rezultate Obtinute =====
  
-TODO rezultate ​dupa realizarea montajului fizic+Sistemul masoara greutatea cu o eroare de ±0.06g in conditii stabile 
 +(load cell fixat rigid). Eroarea de histerezis dupa ridicarea greutatii 
 +este de ±0.15g, acceptabila pentru scopul proiectului. 
 + 
 +Teste efectuate:​ 
 +  * Moneda ~0.92g → afisat corect 
 +  * Plic Nescafe 12.60g → afisat 12.58-12.65g (eroare <2%) 
 +  * Sticla extract rom 32.56g → afisat corect ​dupa calibrare
  
 ===== Concluzii ===== ===== Concluzii =====
  
-TODO+Proiectul demonstreaza ca masurarea gravimetrica este o alternativa viabila 
 +si ieftina la procesarea de imagine pentru numararea obiectelor mici. 
 +Precizia de ±0.15g a load cell-ului de 1kg este suficienta pentru a distinge 
 +o singura tigara de 0.92g cu o marja de eroare acceptabila. 
 + 
 +Principalele provocari intampinate:​ 
 +  * Placa ATmega328P Xplained Mini a dezvoltat o problema hardware de 
 +    programare (semnatura 0x000000) care a necesitat inlocuirea cu Arduino Uno 
 +  * Display-ul 7-segment raw 5461AS a necesitat multiplexare software complexa 
 +    si a fost inlocuit cu modulul TM1637 cu driver integrat 
 +  * Calibrarea load cell-ului necesita fixare rigida a ambelor capete pentru 
 +    citiri stabile
  
 ===== Download ===== ===== Download =====
  
-TODO link GitHub cu surse, schema KiCad, README+https://​github.com/​TeoPana/​cigarette-counter.git
pm/prj2026/cezar.zlatea/teodor.pana.1778952348.txt.gz · Last modified: 2026/05/16 20:25 by teodor.pana
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