This is an old revision of the document!
DIMS:) sau DB:NOT_FOUNDRESULT:ACCEPTED / RESULT:REJECTED si actualizeaza dashboard-ul
flowchart TB
User([Utilizator]) -->|introduce sticla PET 0.5L| irSensor
irSensor["Senzor IR slot #1 - PD4"]
e2100["E2100 Barcode Scanner - PD2/PD3 SoftwareSerial"]
hcsr1["HC-SR04 #1 diametru - PD7 TRIG / PB0 ECHO"]
hcsr2["HC-SR04 #2 inaltime - PC0 TRIG / PC3 ECHO"]
irSensor --> ATmega
e2100 --> ATmega
hcsr1 --> ATmega
hcsr2 --> ATmega
subgraph ATmega["ATmega328P Xplained Mini"]
rvm["RvmController - masina de stari"]
lcd["LCD I2C 16x2 - PC4 SDA / PC5 SCL"]
rvm --- lcd
end
ATmega -->|"L9110S canal A: PC1/PC2"| motorA["Motor DC #1 - conveyor perete stang"]
ATmega -->|"L9110S canal B: PD5/PD6"| motorB["Motor DC #2 - conveyor perete drept"]
ATmega <-->|"UART0 PD0/PD1 - ASCII 9600 baud"| web
subgraph web["Platforma Web PC"]
nodejs["Node.js + Express 5"]
sqlite["SQLite + Drizzle ORM"]
react["React 19 + Socket.IO"]
nodejs --- sqlite
sqlite --- react
end
stateDiagram-v2
[*] --> IDLE
IDLE --> WAITING : CMD:START de la PC
WAITING --> SCANNING : IR detecteaza sticla
SCANNING --> MEASURING : BARCODE: primit + DIMS: de la PC
SCANNING --> IDLE : DB:NOT_FOUND sau timeout scanare
MEASURING --> TRANSPORTING : dimensiuni in toleranta
MEASURING --> RETURNING : dimensiuni invalide
TRANSPORTING --> IDLE : motoare STOP - RESULT:ACCEPTED trimis
RETURNING --> IDLE : motoare STOP - RESULT:REJECTED trimis
TRANSPORTING --> IDLE : timeout JAM - ERROR:JAM trimis
IDLE --> IDLE : CMD:STOP / CMD:RESET
| Componenta | Rol | Pret |
|---|---|---|
| ATmega328P Xplained Mini | Microcontroller principal (AVR 8-bit, 16 MHz, 2KB RAM, 32KB Flash) | existent in laborator |
| E2100 Barcode Scanner | Citire coduri de bare 1D/2D prin UART TTL (SoftwareSerial 9600 baud) | 59.90 RON |
| Adaptor FPC 12 pini (x2) | Conectare cablu FPC al modulului E2100 la pini standard 2.54mm | 7.37 RON |
| HC-SR04 senzor ultrasonic (x2) | Masurare inaltime si diametru sticla (pulseIn, 2-450 cm, 0.3 cm precizie) | 11.30 RON |
| Senzor fotoelectric slot IR (x2) | Detectie prezenta sticla la intrare (iesire digitala, LOW = sticla) | 5.80 RON |
| Motor DC 3V-6V cu reductor 1:48 (x2) | Doua motoare pe peretii opusi ai cutiei pentru antrenarea conveyor belt-ului | 14.52 RON |
| Modul L9110S H-Bridge dual | Driver pentru ambele motoare DC (canal A motor #1, canal B motor #2) | 8.17 RON |
| Kit Breadboard 830p + 65 jumpers + sursa | Prototipare + modul sursa de alimentare 5V cu intrare barrel jack | 42.94 RON |
| 40x fire Dupont mama-tata 20cm | Interconectare placa cu module | 16.17 RON |
| Rezistori 220 ohm (x10) | Current limiting pentru IR si semnale de control | 1.20 RON |
| Rezistori 10k ohm (x10) | Pull-up / pull-down pe intrari digitale | 1.20 RON |
| Condensatori ceramici 100nF (x10) | Decuplare alimentare langa module | 2.42 RON |
| Condensatori electrolitici 100uF 25V (x10) | Filtrare bulk pe linia de alimentare a motoarelor | 2.72 RON |
| Diode 1N4148 (x4) | Protectie flyback pe bobinele motoarelor | 2.18 RON |
| LCD I2C 16×2 (driver PCF8574, backlight albastru) | Display local pentru starea masinii si rezultatul tranzactiei | 14.90 RON |
| Total comanda online | ~158 RON + livrare |
Pin Functie Modul conectat ------------------------------------------ PD0 UART0 RX mEDBG USB (serial la PC) PD1 UART0 TX mEDBG USB (serial la PC) PD2 SoftwareSerial RX E2100 TX PD3 SoftwareSerial TX E2100 RX PD4 GPIO input Senzor fotoelectric slot #1 (LOW = sticla detectata) PD5 GPIO output L9110S B-IA (motor conveyor #2 directie A) PD6 GPIO output L9110S B-IB (motor conveyor #2 directie B) PD7 GPIO output HC-SR04 #1 TRIG (diametru) PB0 GPIO input HC-SR04 #1 ECHO (diametru) PC0 GPIO output HC-SR04 #2 TRIG (inaltime) PC1 GPIO output L9110S A-IA (motor conveyor #1 directie A) PC2 GPIO output L9110S A-IB (motor conveyor #1 directie B) PC3 GPIO input HC-SR04 #2 ECHO (inaltime) PC4 I2C SDA LCD I2C 16x2 (display stare masina) PC5 I2C SCL LCD I2C 16x2 (display stare masina)
| Pin | Tip | De ce acest pin |
|---|---|---|
| PD0 / PD1 | UART0 RX/TX | Singurul UART hardware al ATmega328P este hardwired la mEDBG. Nu poate fi reasignat. |
| PD2 / PD3 | SoftwareSerial | INT0/INT1 — singurele pini cu intreruperi externe bine suportate, necesare pentru receptie SoftwareSerial fiabila la 9600 baud. |
| PD4 | GPIO input | Semnal digital simplu de la senzorul IR (nu necesita PWM, ADC sau intreruperi). |
| PD5 / PD6 | GPIO output (motor #2) | Eliberati din configuratia anterioara. Raman in Port D, consistent cu restul actuatorilor. |
| PD7 | GPIO output | TRIG necesita doar puls simplu 10µs — orice GPIO functioneaza. |
| PB0 | GPIO input | ICP1 (Input Capture Pin al Timer1) — permite migrare la masurare hardware precisa cu timer capture fara a modifica pinout-ul. |
| PC0 / PC3 | GPIO (HC-SR04 #2) | Port C (analogic), folosit ca GPIO digital. Grupat logic cu PC1/PC2 pentru coerenta in cod. |
| PC1 / PC2 | GPIO output (motor #1) | Consecutivi cu PC0/PC3 — toata sectiunea sensor+motor grupata in Port C. |
| PC4 / PC5 | I2C SDA/SCL | Singura optiune posibila: TWI (I2C hardware) al ATmega328P este implementat fix pe acesti doi pini. Nu exista alternativa hardware. |
Tabel conexiuni:
| Componenta | Pin componenta | Pin ATmega | Note |
|---|---|---|---|
| E2100 Scanner | TX | PD2 | SoftwareSerial 9600 baud |
| E2100 Scanner | RX | PD3 | |
| IR Slot Sensor #1 | OUT | PD4 | LOW = sticla prezenta |
| HC-SR04 #1 (diametru) | TRIG | PD7 | Puls 10µs HIGH |
| HC-SR04 #1 (diametru) | ECHO | PB0 | pulseIn(HIGH), 58µs/cm |
| HC-SR04 #2 (inaltime) | TRIG | PC0 | Puls 10µs HIGH |
| HC-SR04 #2 (inaltime) | ECHO | PC3 | pulseIn(HIGH) |
| L9110S H-Bridge | A-IA | PC1 | Motor #1 directie A |
| L9110S H-Bridge | A-IB | PC2 | Motor #1 directie B |
| L9110S H-Bridge | B-IA | PD5 | Motor #2 directie A |
| L9110S H-Bridge | B-IB | PD6 | Motor #2 directie B |
| LCD I2C 16×2 | SDA | PC4 | TWI hardware, adresa 0x27 |
| LCD I2C 16×2 | SCL | PC5 |
Nota alimentare: Motoarele si LCD-ul sunt alimentate de pe sina 5V a breadboard-ului (incarcator 5V 2A), nu de pe ATmega (limitat la 500mA USB). GND comun intre surse.
xplained_mini (hardware real) si xplained_mini_sim (simulare cu stubs)set_upload_port.py) pentru upload prin mEDBG (interfata USB HID, nu serial clasic)Arhitectura firmware (DDD pe ATmega):
common/ — FixedString (string pe stack, fara alocare dinamica), RingBuffer, Timerdomain/ — interfete pure C++: ICommChannel, IScanner, IBottleDetector, IHeightSensor, IDiameterSensor, ITransport, IDisplayapplication/ — RvmController (masina de stari IDLE→WAITING→SCANNING→MEASURING→TRANSPORTING/RETURNING→IDLE), BottleValidatorinfrastructure/ — UartProtocol, Gm65Scanner (E2100), IrBreakBeam, DcConveyor (L9110S dual motor), LcdI2cDisplay (PCF8574)stubs/ — StubScanner, StubHeightSensor, StubDiameterSensor, StubBottleDetector, StubTransport, StubDisplay, SimBridgeDecizii cheie firmware:
delay() in logica aplicatiei — toate operatiile sunt non-blocking cu tick()new, String, std::vector) — pe 2KB RAM, fragmentarea heap-ului e fatala-fno-exceptions)DcConveyor controleaza simultan ambele motoare: inainte (ACCEPT), inapoi (RETURN), stopPlatforma web (Node.js + React):
shared — tipuri TypeScript comune (protocol serial, DTO-uri REST)server — Node.js 22, Express 5, SQLite + Drizzle ORM, serialport, Socket.IO 4, Zodclient — React 19, Vite, Tailwind CSS v4, shadcn/ui, RechartsPagini: Dashboard (status live, START/STOP), Barcodes (CRUD), Transactions (istoric), Statistics (grafice), Simulation (control stubs)
Protocol serial ASCII (ATmega ↔ PC):
PC → ATmega: CMD:START / CMD:STOP / CMD:RESET
DIMS:220:65:10 (inaltime:diametru:toleranta in mm)
DB:NOT_FOUND
ATmega → PC: STATUS:IDLE / WAITING / SCANNING / MEASURING / TRANSPORTING / RETURNING
BARCODE:5941234567890
MEASURED:H=218:D=63
RESULT:ACCEPTED / RESULT:REJECTED:oversized
ERROR:JAM / ERROR:SCANNER_FAIL
Simulare: SIM:BEAM:ON/OFF SIM:BARCODE:<val> SIM:HEIGHT:<mm>
SIM:DIAM:<mm> SIM:JAM SIM:RESET_STUBS
ATmega: SIM:ACK:<msg> / SIM:ERR:<motiv>
set_upload_port.py) rezolva limitarea PlatformIO cu protocolul mEDBG
Separarea clara intre domain si infrastructure a permis testarea logicii masinii de stari inainte de sosirea hardware-ului. DcConveyor controleaza ambele motoare printr-o singura interfata ITransport, mentinand logica aplicatiei independenta de hardware. Frameworkul de simulare (stubs + SimBridge + pagina web Simulation) a validat integral fluxul de tranzactie.
SmartRVM/
device/ -- firmware ATmega (PlatformIO)
platform/ -- platforma web (pnpm monorepo)
wokwi/ -- schema electrica Wokwi (diagram.json)
DOCUMENTATION.md -- documentatie Markdown (diagrame Mermaid)
DOKUWIKI.txt -- versiune DokuWiki pentru OCW
cd device && pio run -e xplained_mini_sim -t upload cd platform && pnpm install pnpm --filter server dev && pnpm --filter client dev
Resurse Software:
Cursuri PM relevante: