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/08 18:16]
teodor.pana created
pm:prj2026:cezar.zlatea:teodor.pana [2026/05/25 13:49] (current)
teodor.pana [Schema electrica]
Line 1: Line 1:
-salut!+====== Cigarette Pack Counter ====== 
 + 
 +===== Introducere ===== 
 + 
 +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. 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 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: 
 +  * Demonstreaza utilizarea unui ADC extern de inalta precizie (24 biti) 
 +  * Combina notiuni din laborator: GPIO, UART, Timere 
 +  * Reprezinta o solutie robusta si independenta de conditiile de iluminare 
 +  * Poate fi adaptat pentru orice produs cu greutate cunoscuta per unitate 
 + 
 +===== Descriere generala ===== 
 + 
 +Sistemul este compus din urmatoarele module: 
 + 
 +  * **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 UART, eliminand complet 
 +    problema de programare. 
 + 
 +  * **Load cell 1kg** este senzorul mecanic care se deformeaza proportional 
 +    cu greutatea plasata pe el. Genereaza un semnal diferential de tensiune 
 +    in intervalul mV. 
 + 
 +  * **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. 
 + 
 +  * **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 integrat, eliminand necesitatea multiplexarii 
 +    software si a rezistoarelor individuale pe segmente. Comunicarea se face 
 +    prin protocol two-wire (CLK, DIO) pe pinii PD2 si PD3. 
 + 
 +  * **Alimentarea** se face de la 5V prin USB. HX711 si TM1637 sunt alimentate 
 +    de la rail-ul de 5V al Arduino Uno prin breadboard. 
 + 
 +Fluxul de functionare:​ la pornire, sistemul face tara automata (2 secunde). 
 +Utilizatorul plaseaza pachetul pe platforma si citeste numarul de tigari 
 +afisat in timp real. Comanda '​t'​ prin Serial recalibreaza tara. 
 + 
 +^ Modul ^ Descriere Tehnica ^ Protocol / Interfata ^ 
 +| Arduino Uno (ATmega328P) | Unitate centrala, 16MHz, 5V | Master | 
 +| Load Cell 1kg | Senzor mecanic rezistiv (punte Wheatstone) | Semnal analogic diferential | 
 +| HX711 | ADC 24-bit + amplificator | Two-wire: DAT (D7), CLK (D8) | 
 +| TM1637 4 cifre | Display 7-segment cu driver integrat | Two-wire: CLK (PD2), DIO (PD3) | 
 + 
 +===== Hardware Design ===== 
 + 
 +==== Componente folosite si rolul lor ==== 
 + 
 +^ Componenta ^ Rol in proiect ^ Interfata ^ 
 +| Arduino Uno (ATmega328P) | Unitate centrala de procesare | — | 
 +| Display TM1637 4 cifre | Afisarea numarului de tigari | CLK=PD2, DIO=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 | — | 
 + 
 +==== Pinii utilizati ==== 
 + 
 +^ 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 | — | 
 + 
 +TM1637 foloseste protocol bit-bang implementat manual pe DDRD/​PORTD. 
 +HX711 este citit prin libraria HX711_ADC cu averaging intern. 
 +Nu sunt necesare rezistoare externe — TM1637 are driver integrat, 
 +iar HX711 are amplificator dedicat. 
 + 
 +==== Schema electrica ==== 
 + 
 +{{:​pm:​prj2026:​cezar.zlatea:​screenshot_2026-05-25_134722.png?​550| 
 +}} 
 +==== Dovada de functionare ==== 
 + 
 +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 
 + 
 +Montaj breadboard cu TM1637 si Arduino Uno 
 + 
 +{{ :​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 ==== 
 + 
 +  * 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) 
 + 
 +===== Software Design ===== 
 + 
 +==== Stadiul actual al implementarii ==== 
 + 
 +Proiectul functioneaza end-to-end: load cell-ul citeste greutatea pachetului,​ 
 +HX711 amplifica semnalul, Arduino Uno calculeaza numarul de tigari si afiseaza 
 +rezultatul pe TM1637 in timp real. 
 + 
 +==== Biblioteci folosite ==== 
 + 
 +^ Biblioteca ^ Rol ^ Justificare ^ 
 +| **HX711_ADC** (olkal) | Citire date load cell | Implementeaza averaging si filtrare interna, reducand zgomotul. Citirea raw bit-bang manuala a dat rezultate instabile in teste initiale. | 
 +| **AVR libc** (avr/io.h, util/​delay.h) | Acces registre hardware | Folosita direct pentru TM1637 si configurarea perifericelor — fara overhead Arduino. | 
 + 
 +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 ==== 
 + 
 +[[https://​drive.google.com/​file/​d/​1oHkFTVzD7GpZiOxSTUX1jGL-Tldb4mS4/​view?​usp=drive_link| 8 TIGARI]] 
 +[[https://​drive.google.com/​file/​d/​1K9GP2bqRH9V55qn3s6AYltrKDtgfOcyk/​view?​usp=sharing| 10 TIGARI]] 
 + 
 +== Calibrarea a fost facuta cu Dunhill, a trebuit sa cantaresc si sa modific cateva chestii == 
 +===== Rezultate Obtinute ===== 
 + 
 +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 ===== 
 + 
 +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 ===== 
 + 
 +https://​github.com/​TeoPana/​cigarette-counter.git
pm/prj2026/cezar.zlatea/teodor.pana.1778253372.txt.gz · Last modified: 2026/05/08 18:16 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