This shows you the differences between two versions of the page.
|
pm:prj2026:vlad.radulescu2901:alexandru.istrate04 [2026/05/15 22:07] alexandru.istrate04 |
pm:prj2026:vlad.radulescu2901:alexandru.istrate04 [2026/05/25 12:37] (current) alexandru.istrate04 [Pini utilizați și justificarea alegerii] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Casă de marcat self pay ====== | ====== Casă de marcat self pay ====== | ||
| ===== Introducere ===== | ===== Introducere ===== | ||
| - | |||
| - | <note tip> | ||
| - | Prezentarea pe scurt a proiectului vostru: | ||
| - | * ce face | ||
| - | * care este scopul lui | ||
| - | * care a fost ideea de la care aţi pornit | ||
| - | * de ce credeţi că este util pentru alţii şi pentru voi | ||
| - | </note> | ||
| SmartScale Checkout este un sistem de casă de marcat self-service controlat de un microcontroler ATmega328P. Utilizatorul scanează produsele cu telefonul (folosind o aplicație de scanare coduri de bare), trimite produsul prin Bluetooth la placuță, îl plasează pe cântar pentru validarea greutății, și la final efectuează o plată prin apropierea unui card RFID. Pe tot parcursul, un display LCD afișează produsele adăugate și totalul, iar un buzzer confirmă fiecare acțiune cu un beep. | SmartScale Checkout este un sistem de casă de marcat self-service controlat de un microcontroler ATmega328P. Utilizatorul scanează produsele cu telefonul (folosind o aplicație de scanare coduri de bare), trimite produsul prin Bluetooth la placuță, îl plasează pe cântar pentru validarea greutății, și la final efectuează o plată prin apropierea unui card RFID. Pe tot parcursul, un display LCD afișează produsele adăugate și totalul, iar un buzzer confirmă fiecare acțiune cu un beep. | ||
| Line 19: | Line 11: | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| - | |||
| - | <note tip> | ||
| - | O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. | ||
| - | |||
| - | Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | ||
| - | </note> | ||
| {{:pm:prj2026:vlad.radulescu2901:schema_bloc_istrate_alexandru.png?800|}} | {{:pm:prj2026:vlad.radulescu2901:schema_bloc_istrate_alexandru.png?800|}} | ||
| Line 48: | Line 34: | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | |||
| - | <note tip> | ||
| - | Aici puneţi tot ce ţine de hardware design: | ||
| - | * listă de piese | ||
| - | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | ||
| - | * diagrame de semnal | ||
| - | * rezultatele simulării | ||
| - | </note> | ||
| ^ Nr. ^ Componentă ^ Cantitate ^ Detalii ^ | ^ Nr. ^ Componentă ^ Cantitate ^ Detalii ^ | ||
| Line 66: | Line 44: | ||
| | 7 | Buzzer pasiv 5V | 1 | Control prin semnal PWM | | | 7 | Buzzer pasiv 5V | 1 | Control prin semnal PWM | | ||
| | 8 | LED roșu 5mm | 1 | Indicator eroare validare greutate | | | 8 | LED roșu 5mm | 1 | Indicator eroare validare greutate | | ||
| - | | 9 | Rezistență 220Ω | 1 | Limitare curent LED | | + | | 9 | Rezistență 100Ω | 4 | Limitare curent pentru LED și pentru pinul RX al HC-06| |
| - | | 10 | Breadboard + fire jumper | 1 set | Prototipare conexiuni | | + | | 10 | Fire jumper | 1 set | Conexiuni | |
| | 11 | Cablu USB micro | 1 | Alimentare și programare Xplained Mini | | | 11 | Cablu USB micro | 1 | Alimentare și programare Xplained Mini | | ||
| - | | 12 | Suport/platformă pentru cântar | 1 | Structură mecanică celulă de sarcină | | + | | 12 | Suport pentru cântar | 1 | Structură mecanică celulă de sarcină | |
| ==== Componente utilizate și rolul lor ==== | ==== Componente utilizate și rolul lor ==== | ||
| Line 99: | Line 77: | ||
| ^ Componentă ^ Pin ATmega328P ^ Protocol ^ Justificare ^ | ^ Componentă ^ Pin ATmega328P ^ Protocol ^ Justificare ^ | ||
| - | | HC-06 TX | PD1 (RX UART) | UART | Pinii PD0/PD1 sunt dedicați hardware pentru UART (USART0), asigurând comunicație serială fiabilă la 9600 baud fără consum de resurse software | | + | | HC-06 TX | PD0 (TX UART) | UART | Pinii PD0/PD1 sunt dedicați hardware pentru UART (USART0), asigurând comunicație serială fiabilă la 9600 baud fără consum de resurse software | |
| - | | HC-06 RX | PD0 (TX UART) | UART | Idem, pinul de transmisie hardware UART | | + | | HC-06 RX | PD1 (RX UART) | UART | Idem, pinul de transmisie hardware UART | |
| | HX711 SCK | PD7 | GPIO (bit-bang) | HX711 folosește un protocol serial proprietar simplu, implementat prin bit-banging pe GPIO standard; PD7 ales pentru a evita conflicte cu SPI și UART | | | HX711 SCK | PD7 | GPIO (bit-bang) | HX711 folosește un protocol serial proprietar simplu, implementat prin bit-banging pe GPIO standard; PD7 ales pentru a evita conflicte cu SPI și UART | | ||
| | HX711 DT | PD6 | GPIO (bit-bang) | Pinul de date al HX711; PD6 ales alăturat lui PD7 pentru organizare logică | | | HX711 DT | PD6 | GPIO (bit-bang) | Pinul de date al HX711; PD6 ales alăturat lui PD7 pentru organizare logică | | ||
| Line 110: | Line 88: | ||
| | LCD SCL | PC5 | I2C | PC5 este pinul hardware dedicat SCL al interfeței I2C (TWI) a ATmega328P | | | LCD SCL | PC5 | I2C | PC5 este pinul hardware dedicat SCL al interfeței I2C (TWI) a ATmega328P | | ||
| | LCD SDA | PC4 | I2C | PC4 este pinul hardware dedicat SDA al interfeței I2C (TWI) a ATmega328P | | | LCD SDA | PC4 | I2C | PC4 este pinul hardware dedicat SDA al interfeței I2C (TWI) a ATmega328P | | ||
| - | | Buzzer | PD3 (OC2B) | PWM | PD3 este ieșirea comparatorului B al Timer/Counter2, permițând generarea semnalului PWM hardware pentru controlul frecvenței buzzerului pasiv | | + | | Buzzer | PD3 (OC2B) | PWM | PD3: Ieșire digitală pentru buzzerul pasiv. Frecvența este generată asincron folosind Timer/Counter1 și o rutină de tratare a întreruperilor (ISR) pentru a asigura acuratețea tonurilor. | |
| | LED roșu | PD4 | GPIO | Pin GPIO simplu pentru controlul LED-ului de eroare; rezistență de 100Ω în serie | | | LED roșu | PD4 | GPIO | Pin GPIO simplu pentru controlul LED-ului de eroare; rezistență de 100Ω în serie | | ||
| + | |||
| + | |||
| + | <note>Pinul **IRQ** al modulului RC522 este lăsat **neconectat** în mod intenționat. Librăria folosită pentru comunicația cu RC522 utilizează metoda polling, nu întreruperi hardware, deci pinul IRQ nu este necesar pentru funcționarea corectă a proiectului.</note> | ||
| ==== Schema electrică ==== | ==== Schema electrică ==== | ||
| Line 143: | Line 124: | ||
| * **3.3V** — folosit exclusiv pentru modulul RC522. Acesta nu este compatibil cu 5V; alimentarea incorectă poate deteriora permanent modulul. | * **3.3V** — folosit exclusiv pentru modulul RC522. Acesta nu este compatibil cu 5V; alimentarea incorectă poate deteriora permanent modulul. | ||
| - | Pinul **IRQ** al modulului RC522 este lăsat **neconectat** în mod intenționat. Librăria folosită pentru comunicația cu RC522 utilizează metoda polling, nu întreruperi hardware, deci pinul IRQ nu este necesar pentru funcționarea corectă a proiectului. | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | ==== Mediu de dezvoltare și bibliotecile folosite ==== | ||
| - | <note tip> | + | Firmware-ul a fost programat în Visual Studio Code, folosind extensia PlatformIO, care oferă un mediu integrat pentru compilarea codului, gestionarea dependențelor și încărcarea binarului rezultat direct pe microcontroler. |
| - | Descrierea codului aplicaţiei (firmware): | + | |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | Proiectul nu utilizează biblioteci externe de tip third-party. Toate driverele pentru periferice (LCD, RC522, HX711) și protocoalele de comunicație (UART, SPI, I2C) au fost implementate de la zero peste registrele hardware ale ATmega328P. |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | Sunt utilizate exclusiv biblioteci standard din setul AVR-GCC: |
| - | * (etapa 3) surse şi funcţii implementate | + | |
| - | </note> | + | * **avr/io.h** — definițiile registrelor hardware ale ATmega328P (PORTD, DDRB, SPCR, TWCR etc.); esențială pentru orice program AVR |
| + | * **avr/pgmspace.h** — macrourile PROGMEM și memcpy_P pentru stocarea și citirea datelor din memoria Flash; folosită pentru baza de date de produse | ||
| + | * **util/delay.h** — funcțiile _delay_ms() și _delay_us() pentru temporizări precise bazate pe F_CPU; folosite în inițializarea LCD, protocoalele SPI/I2C și logica de feedback | ||
| + | * **stdint.h** — tipuri de date cu dimensiune fixă (uint8_t, uint16_t, int8_t); critice pe un MCU de 8 biți unde dimensiunea tipurilor contează | ||
| + | * **string.h** — funcții de manipulare șiruri (strcmp, strcpy, strcat, memset); folosite pentru parsarea comenzilor UART și formatarea textului pentru LCD | ||
| + | * **stdlib.h** — funcțiile itoa() și ltoa() pentru conversia numerelor în șiruri de caractere afișabile pe LCD sau trimise prin UART | ||
| + | |||
| + | ==== Elementul de noutate ==== | ||
| + | |||
| + | Elementul de noutate al proiectului constă în integrarea unui mecanism de validare a greutății în fluxul de scanare, inspirat din sistemele self-checkout din supermarketurile moderne. | ||
| + | |||
| + | Spre deosebire de un simplu sistem de scanare și afișare, SmartScale Checkout blochează progresul sesiunii dacă greutatea produsului plasat pe cântar nu corespunde greutății declarate în baza de date (toleranță +-10%). Această validare elimină posibilitatea scanării unui produs și plasării altuia pe cântar. Un alt element distinctiv este mecanismul de supervisor override. Scanarea unui cod special deblochează sesiunea fără validarea greutății, simulând intervenția unui angajat în caz de eroare, funcționalitate prezentă în terminalele self-checkout reale. | ||
| + | |||
| + | Interfața mobilă dezvoltată în MIT App Inventor completează sistemul cu un flux complet: scanare cod de bare prin camera telefonului, transmisie Bluetooth către microcontroler, afișare bon fiscal digital la finalul sesiunii. | ||
| + | |||
| + | ==== Scheletul proiectului ==== | ||
| + | |||
| + | Firmware-ul este organizat în module separate, fiecare responsabil de un periferic: | ||
| + | |||
| + | * **uart.cpp** — inițializare și comunicație serială cu HC-06 | ||
| + | * **i2c.cpp** — protocolul pentru comunicația cu LCD | ||
| + | * **lcd.cpp** — driver pentru afișajul LCD 16×2 | ||
| + | * **spi.cpp** — protocol SPI pentru comunicația cu RC522 | ||
| + | * **rc522.cpp** — driver pentru cititorul RFID | ||
| + | * **load_cell.cpp** — citire și calibrare HX711 | ||
| + | * **buzzer.cpp** — generare semnale sonore prin PWM | ||
| + | * **main.cpp** — logica principală: baza de date, sesiunea curentă și mașina de stări | ||
| + | |||
| + | Interacțiunea dintre module urmează un flux unidirecțional. Toate modulele perifericelor sunt apelate în main, cel care coordonează activitatea proiectului, fiind independente unele de celelalte. | ||
| + | |||
| + | **Mașina de stări** are 5 stări: | ||
| + | |||
| + | * **STATE_SCAN** — starea principală, așteaptă cod de bare | ||
| + | * **STATE_DELETE** — așteaptă codul produsului de șters | ||
| + | * **STATE_WEIGHT_ERROR** — blocat până la validarea greutății sau cod supervisor | ||
| + | * **STATE_PAYMENT** — așteaptă cardul RFID și confirmă plata | ||
| + | |||
| + | **Validarea funcționării** a fost realizată în două etape: | ||
| + | * **Testare individuală** — fiecare modul a fost testat separat printr-un program dedicat de test, controlat prin Bluetooth de pe smartphone | ||
| + | * **Testare integrată** — după integrarea tuturor modulelor, s-a parcurs fluxul complet: scanare produs, validare greutate, finalizare sesiune cu card RFID și afișare bon fiscal | ||
| + | |||
| + | |||
| + | ==== Utilizarea funcționalităților din laborator ==== | ||
| + | |||
| + | Proiectul SmartScale Checkout utilizează direct cunoștințele acumulate în cadrul laboratoarelor, atât la nivel teoretic cât și practic. | ||
| + | |||
| + | === GPIO === | ||
| + | |||
| + | Configurarea pinilor folosește exact mecanismul prezentat în laboratorul 0, prin registrele DDRn și PORTn: | ||
| + | |||
| + | * LED-ul roșu pe PD4 este configurat ca ieșire prin DDRD și controlat prin PORTD, identic cu exemplul de aprindere a unui LED | ||
| + | * Pinii HX711 (PD6, PD7) sunt configurați explicit ca intrare, respectiv ieșire, prin DDR și PIN, pentru implementarea protocolului proprietar al amplificatorului prin bit-banging | ||
| + | |||
| + | === USART === | ||
| + | |||
| + | Comunicația serială cu modulul Bluetooth HC-06 utilizează perifericul USART0 al ATmega328P, configurând registrele prezentate în laboratorul 1: | ||
| + | |||
| + | * UBRR0H și UBRR0L pentru setarea baud rate-ului la 9600, calculat cu formula F_CPU/(UART_BAUD_RATE*16)-1 | ||
| + | * UCSR0B pentru activarea transmisiei și recepției prin biții TXEN0 și RXEN0 | ||
| + | * UCSR0C pentru formatul cadrului: 8 biți de date, fără paritate | ||
| + | |||
| + | === PWM === | ||
| + | |||
| + | Buzzerul pasiv necesită un semnal cu frecvență variabilă pentru a produce sunet. Teoria PWM din laboratorul 3 a stat la baza implementării funcției beep(), care generează semnalul pe PD3, alternând starea pinului la un interval calculat din frecvența dorită. | ||
| + | |||
| + | === SPI === | ||
| + | |||
| + | Comunicația cu modulul RFID RC522 utilizează interfața SPI hardware a ATmega328P, configurată prin registrele studiate în laboratorul 5: | ||
| + | |||
| + | * SPCR pentru activarea SPI în modul master (bitul MSTR), activarea interfeței (SPE) și setarea prescaler-ului | ||
| + | * SPSR cu flag-ul SPIF pentru așteptarea finalizării transferului | ||
| + | * SPDR pentru scrierea și citirea datelor | ||
| + | * Pinul SS (PB2) este controlat manual prin PORTB, identic cu mecanismul de Chip Select descris în laborator | ||
| + | |||
| + | RC522 folosește arhitectura Master-Slave descrisă în laborator: ATmega este master, RC522 este slave, selectat prin SS activ LOW. | ||
| + | |||
| + | === I2C === | ||
| + | |||
| + | Display-ul LCD 16×2 cu expander PCF8574 comunică prin protocolul I2C (TWI), implementat folosind registrele prezentate în laboratorul 6: | ||
| + | |||
| + | * TWBR pentru setarea frecvenței SCL la 100kHz | ||
| + | * TWCR pentru generarea condițiilor START și STOP, prin biții TWSTA, TWSTO și TWINT | ||
| + | * TWDR pentru scrierea datelor către expander | ||
| + | * Secvența completă de comunicație urmează pașii din laborator: START → adresă slave → date → STOP | ||
| + | |||
| + | Adresa expanderului PCF8574 (0x27) este transmisă conform protocolului descris în laborator, cu bitul de scriere (0) pe poziția LSB. | ||
| + | |||
| + | ==== Calibrarea celulei de sarcină ==== | ||
| + | |||
| + | Calibrarea HX711 a presupus determinarea a două valori: | ||
| + | |||
| + | **Tara (offset)** — valoarea raw returnată de HX711 cu cantarul gol, determinată prin citirea mediei a 5 valori consecutive după stabilizarea mecanică a sistemului: | ||
| + | |||
| + | Tara = 232121 (unități raw) | ||
| + | |||
| + | **Factorul de calibrare** — numărul de unități raw per gram, determinat prin plasarea unui obiect cu greutate cunoscută pe cântar. S-a folosit un smartphone cu greutatea verificată pe un cântar de bucătărie (266g): | ||
| + | |||
| + | Raw cu greutate = 259448 | ||
| + | Diferență = 259448 - 232121 = 27327 unități | ||
| + | Factor = 27327 / 266g = 102.7 unități/gram | ||
| + | |||
| + | Formula de conversie implementată în firmware: | ||
| + | |||
| + | greutate(g) = (raw - 232121) / 102.7 | ||
| + | |||
| + | Validarea calibrării s-a făcut prin măsurarea aceluiași obiect. Rezultatul returnat de firmware a fost 266g, identic cu valoarea de referință. | ||
| + | |||
| + | Toleranța de validare a fost setată la ±10% față de greutatea declarată în baza de date, justificată de precizia celulei de sarcină de 20kg pe produse mici și de variațiile normale ale ambalajelor. | ||
| + | |||
| + | ==== Optimizări realizate ==== | ||
| + | |||
| + | **Memorie Flash — PROGMEM**:Baza de date cu cele 7 produse (nume, cod, preț, greutate) este stocată în memoria Flash folosind directiva PROGMEM, nu în SRAM. Pe ATmega328P cu doar 2KB SRAM, stocarea unui array de structuri în RAM ar consuma inutil memorie necesară stack-ului și variabilelor dinamice. Citirea se face prin memcpy_P la momentul accesării. În total, implementarea curentă permite stocarea a aproximativ 500 de produse, luând în calcul că un produs ocupă 33 de bytes de memorie în structura curentă. | ||
| + | |||
| + | **Medie a 10 citiri HX711**: HX711 produce valori cu zgomot. Citirea unei singure valori raw poate genera erori de validare false. Funcția hx711_read_avg() calculează media aritmetică a 10 citiri consecutive, reducând zgomotul și îmbunătățind stabilitatea măsurătorilor. | ||
| + | |||
| + | **Modularizare pe fișiere separate**:Împărțirea codului pe module (uart, i2c, lcd, spi, rc522, load_cell, buzzer) permite compilarea separată și recompilarea doar a modulelor modificate, reducând timpul de build. De asemenea, ușurează urmărirea codului și îmbunătățirea lui pe termen lung. | ||
| + | |||
| + | ===== Demo ===== | ||
| + | <html> | ||
| + | <iframe width="800" height="450" src="https://www.youtube.com/embed/owWwJvMTBcw" frameborder="0" allowfullscreen></iframe> | ||
| + | </html> | ||
| - | ===== Rezultate Obţinute ===== | ||
| - | <note tip> | ||
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | ||
| - | </note> | ||
| + | în videoclipul de mai sus se prezintă proiectul în stadiul final, după milestone-ul pentru software. De asemenea, se trece și printr-o rutină de scanare, primele produse fiind validate prin greutate, cel din urmă fiind validat cu ajutorul codului de supervisor. | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| Line 171: | Line 269: | ||
| Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | ||
| </note> | </note> | ||
| + | |||
| + | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| - | <note tip> | + | ==== Stadiul proiectul la milestone-ul de hardware ==== |
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
| - | </note> | + | {{:pm:prj2026:vlad.radulescu2901:istrate_hw_img.jpg?800|}} |
| + | |||
| + | <html> | ||
| + | <iframe width="800" height="450" src="https://www.youtube.com/embed/8OG80MNZyYQ" frameborder="0" allowfullscreen></iframe> | ||
| + | </html> | ||
| + | |||
| + | Imaginea prezintă montajul complet al proiectului pe breadboard, în stadiul de prototipare. Se pot identifica toate componentele care alcătuiesc sistemul dezvoltat. În filmulețul de prezentare, se demonstrează funcționarea individuală a tuturor componentelor și, mai mult, că este posibilă și comunicarea între smartphone și placa de dezvoltare. Testarea s-a făcut individual, în primă instanță, pentru a mă asigura că pot fi folosite ulterior în produsul final. | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| - | <note> | + | ==== Resurse hardware ==== |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
| - | </note> | + | |
| - | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | ^ Nr. ^ Componentă ^ Link ^ |
| + | | 1 | ATmega328P Xplained Mini |[[ https://ww1.microchip.com/downloads/en/DeviceDoc/50002659A.pdf]]| | ||
| + | | 2 | Modul Bluetooth HC-06 | [[https://components101.com/sites/default/files/component_datasheet/HC06%20Bluetooth%20Module%20Datasheet.pdf]] | | ||
| + | | 3 | Celulă de sarcină 20 kg | [[https://www.gotronic.fr/pj-460.pdf?srsltid=AfmBOoqofpsrpgaUuTcD77Wck0RtZxTtGMKEYYsWmxeX4NpY7LXV8xWz]] | | ||
| + | | 4 | Modul amplificator HX711 | [[https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://community.infineon.com/gfawx74859/attachments/gfawx74859/CodeExamples/546/7/HX711_v0_0_B.pdf&ved=2ahUKEwjbwJXtxc-UAxXBS_EDHTTIMnUQFnoECB0QAQ&usg=AOvVaw1pjHusoY7T_H1lsxugKvkg]] | | ||
| + | | 5 | Display LCD 16×2 | https://www.vishay.com/docs/37484/lcd016n002bcfhet.pdf | | ||
| + | | 6 | PCF8574 Remote 8-Bit I/O Expander for I2C Bus | [[https://www.ti.com/lit/ds/symlink/pcf8574.pdf]] | | ||
| + | | 7 | Modul RFID RC522 |[[ https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf]] | | ||