This shows you the differences between two versions of the page.
|
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 | ||