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/09 12:44]
teodor.pana [Descriere generala]
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:​nume.prenume:​block_diagram.png?​700x450 |Schema bloc}}+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 =====
  
-=== Lista de componente ​===+==== Componente folosite si rolul lor ====
  
-^ Componenta ​^ Cantitate ​^ Rol in proiect ^ +^ Componenta ^ Rol in proiect ​^ Interfata ​
-| ATmega328P ​Xplained Mini Microcontrollerul principal ​+Arduino Uno (ATmega328PUnitate centrala de procesare ​— 
-Load Cell 100g Masurarea greutatii pachetului ​+Display TM1637 4 cifre Afisarea numarului de tigari ​CLK=PD2, DIO=PD3 ​
-Modul HX711 | 1 | Amplificare si conversie ​ADC 24-bit | +| HX711 modul GroundStudio ​| ADC 24-bit ​pentru load cell DAT=D7, CLK=D8 ​
-| Display OLED SSD1306 128x64 I2C | 1 | Afisarea numarului de tigari ​+Load cell 1kg Masurarea greutatii pachetului ​E+/E-/A+/A- la HX711 
-Buton push-button 6x6mm Declansare masurare ​calibrare tara | +| Breadboard ​+ fire jumper ​| Montaj circuit ​prototip ​— |
-| Rezistor 10kΩ | 1 | Pull-up buton (optional, se foloseste intern) | +
-| Condensator ceramic 100nF | 4 | Decuplare alimentare langa fiecare CI | +
-| Condensator electrolitic 10µF | 1 | Stabilizare rail 5V +
-| Breadboard ​| 1 | Montaj circuit | +
-| Fire jumper tata-tata | 10 | Conexiuni pe breadboard | +
-| Fire jumper tata-mama | 10 | Conexiuni catre module | +
-| Cablu USB | 1 | Alimentare si programare | +
-| Platforma/​suport pentru load cell | 1 | Suport mecanic pentru pachet (din lemn/​acril) ​|+
  
 +==== Pinii utilizati ====
  
-=== Schema electrica === +^ Modul ^ Semnal ^ Pin Arduino Uno ^ Pin ATmega328P ^ 
-TODO - schema electrica realizata in KiCad+| 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 | — |
  
-=== Calcul greutate → numar tigari ===+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.
  
-Marlboro Red Long (cu tigari ​scurte)+==== Schema electrica ==== 
-  * Greutate ambalaj gol: ~23g (calibrata ​la pornire+ 
-  * Greutate per tigara: ​~0.95g (constanta in cod+{{:​pm:​prj2026:​cezar.zlatea:​screenshot_2026-05-25_134722.png?​550| 
-  * Formula: **nr_tigari = round( (greutate_totala - tara) / 0.95 )**+}} 
 +==== 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 ===== ===== Software Design =====
  
-  * **Mediu de dezvoltare**:​ PlatformIO (Visual Studio Code) cu framework Arduino +==== Stadiul actual al implementarii ====
-  * **Limbaj**: C++ (Arduino) +
-  * **Programare**:​ USB direct prin EDBG integrat pe Xplained Mini (fara ISP extern)+
  
 +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 ===== ===== 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.1778319863.txt.gz · Last modified: 2026/05/09 12:44 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