This shows you the differences between two versions of the page.
|
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, I2C, intreruperi si calibrare ADC | + | * Combina notiuni din laborator: GPIO, UART, Timere |
| - | * 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 software, care 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 UART, eliminand 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 display. Totodata, gestioneaza butonul de interactiune al utilizatorului. | + | * **Load cell 1kg** este senzorul mecanic care se deformeaza proportional |
| + | cu greutatea plasata pe el. Genereaza 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 biti, dedicat celulelor de sarcina. Comunica 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 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. | ||
| - | * **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 | I2C: SDA (PC4), SCL (PC5) | | + | | TM1637 4 cifre | Display 7-segment cu driver integrat | Two-wire: CLK (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=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 | — | | ||
| - | 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 PD2, pull-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 LED. Pinii 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 zgomotul. Citirea 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 |