This is an old revision of the document!


SmartRVM - Simulator de Reverse Vending Machine cu Platforma Web

Introducere

SmartRVM este un simulator miniaturizat de reverse vending machine (masina de colectat sticle PET), construit in jurul unui microcontroller ATmega328P Xplained Mini conectat la o platforma web care ruleaza pe PC.

  • Ce face: utilizatorul introduce o sticla PET, masina o scaneaza, masoara dimensiunile si decide acceptarea sau respingerea ei pe baza unei baze de date configurabile.
  • Scopul: demonstrarea integrarii mai multor periferice hardware (UART, senzori ultrasonici, servomotor, motoare DC) si aplicarea principiilor DDD (Domain-Driven Design) atat pe firmware cat si pe platforma web.
  • Ideea de pornire: aparatele de colectare a ambalajelor din supermarketuri.
  • De ce e util: proiectul include un framework de simulare complet — firmware-ul poate rula cu toti senzorii inlocuiti de stubs software controlabile din interfata web, permitand testarea logicii fara niciun circuit conectat.

Descriere generală

Schema bloc a proiectului:

+-------------------+      USB Serial (ASCII, 9600 baud)      +----------------------+
|  ATmega328P       | <-------------------------------------> |  Platforma Web (PC)  |
|  Xplained Mini    |                                         |                      |
|                   |                                         |  Node.js / Express 5 |
|  RvmController    |                                         |  SQLite + Drizzle    |
|  (masina stari)   |                                         |  React 19 + Vite     |
|                   |                                         |  Socket.IO           |
+-------------------+                                         +----------------------+
        |
        | GPIO / UART / PWM
        |
+-------+-----------------------------------------------+
|               SENZORI & ACTUATORI                     |
|  E2100 Barcode Scanner (SoftwareSerial)               |
|  HC-SR04 x2 (diametru + inaltime)                     |
|  Senzori fotoelectrici slot IR x2 (detectie sticla)   |
|  Servomotor MG995 (poarta accept/reject)               |
|  Motor DC cu reductor (conveyor belt)                  |
|  Motor DC mic (crusher)                                |
+-------------------------------------------------------+

Flux de functionare:

  1. Operatorul porneste tranzactia din platforma web (CMD:START)
  2. ATmega detecteaza sticla prin senzorul fotoelectric
  3. Scannerul E2100 citeste barcode-ul, ATmega il trimite catre PC
  4. PC-ul cauta dimensiunile in baza de date si le trimite inapoi (DIMS:) sau DB:NOT_FOUND
  5. HC-SR04 masoara inaltime si diametru, firmware-ul valideaza dimensiunile
  6. Daca acceptata: servomotorul deschide poarta, banda transportoare muta sticla, crusher-ul o simuleaza strivita
  7. Daca respinsa: poarta ramane inchisa, sticla este returnata
  8. PC-ul primeste RESULT:ACCEPTED / RESULT:REJECTED si actualizeaza dashboard-ul

Hardware Design

Lista de componente:

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
HC-SR04 ultrasonic (x2) Masurare inaltime si diametru sticla (2-450 cm, 0.3 cm precizie) 11.30 RON
Senzor fotoelectric slot IR (x2) Detectie prezenta sticla la intrare (break-beam, iesire digitala) 5.80 RON
Servomotor MG995 Actionare poarta accept/reject (PWM 50 Hz, 0-90 grade) 26.14 RON
Motor DC cu reductor 1:48 Banda transportoare (conveyor) 7.26 RON
Motor DC mic Simulare crusher (strivire sticla) 1.74 RON
Modul L9110S H-Bridge Driver pentru motoarele DC 8.17 RON
Modul IRF520 MOSFET Control PWM motor crusher 4.14 RON
Kit Breadboard 830p + sursa Prototipare + alimentare 5V 42.94 RON
Fire Dupont, rezistori, condensatori, diode Interconectare si filtrare ~27 RON
Total ~201 RON + livrare

Mapare pini ATmega328P Xplained Mini:

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
PD5   PWM (Timer0)         MG995 Servo
PD6   PWM (Timer0)         IRF520 MOSFET (crusher)
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 IN1 (conveyor)
PC2   GPIO output          L9110S IN2 (conveyor)
PC3   GPIO input           HC-SR04 #2 ECHO (inaltime)

Schema de alimentare:

ATmega328P Xplained Mini este alimentat prin USB de la PC (5V). Motoarele, servo si senzorii activi sunt alimentati separat de pe o sina 5V a modulului de breadboard (incarcator 5V 2A), cu GND comun cu ATmega. Separarea previne varfurile de curent ale motoarelor sa destabilizeze microcontrollerul.

Software Design

Mediu de dezvoltare:

  • PlatformIO cu framework Arduino, compilator avr-gcc 7.x, C++14
  • Doua environment-uri: xplained_mini (hardware real) si xplained_mini_sim (simulare cu stubs)
  • Script custom Python (set_upload_port.py) pentru upload prin mEDBG (interfata USB HID, nu serial clasic)

Arhitectura firmware (DDD pe ATmega):

Codul este structurat in patru straturi:

  • common/ — utilitare reutilizabile fara dependinte hardware: FixedString (string pe stack, fara alocare dinamica), RingBuffer, Timer (non-blocking, bazat pe millis())
  • domain/ — interfete pure C++ si value types, zero dependinte Arduino. Contine: ICommChannel, IScanner, IBottleDetector, IHeightSensor, IDiameterSensor, ITransport, IServoGate, ICrusher, enum-uri si structuri de date
  • application/RvmController: masina de stari principala (IDLE→WAITING→SCANNING→MEASURING→TRANSPORTING/RETURNING→CRUSHING→IDLE), complet non-blocking. BottleValidator: functie pura de validare dimensiuni
  • infrastructure/ — drivere reale: UartProtocol, Gm65Scanner (E2100), IrBreakBeam, ServoGate, DcCrusher, drivere HC-SR04
  • stubs/ — implementari false controlabile prin comenzi SIM: de pe PC, pentru simulare fara hardware

Decizii cheie firmware:

  • Niciun delay() in logica aplicatiei — toate operatiile sunt non-blocking cu tick()
  • Fara alocare dinamica (nu exista new, String, std::vector) — pe 2KB RAM fragmentarea heap-ului e fatala
  • Erori returnate prin enum-uri, nu exceptii (compilat cu -fno-exceptions)

Platforma web (Node.js + React):

Monorepo pnpm cu trei pachete:

  • shared — tipuri TypeScript comune (protocol serial, DTO-uri REST)
  • server — Node.js 22, Express 5, SQLite + Drizzle ORM, serialport, Socket.IO 4, Zod
  • client — React 19, Vite, Tailwind CSS v4, shadcn/ui, Recharts

Pagini: Dashboard (status live, control START/STOP), Barcodes (CRUD), Transactions (istoric + filtrare), Statistics (grafice Recharts), Simulation (control stubs in timp real)

Protocol serial ASCII (ATmega ↔ PC):

PC → ATmega:
  CMD:START / CMD:STOP / CMD:RESET
  DIMS:220:65:10     (inaltime_mm:diametru_mm:toleranta_mm)
  DB:NOT_FOUND

ATmega → PC:
  STATUS:IDLE / WAITING / SCANNING / MEASURING / TRANSPORTING / CRUSHING / RETURNING
  BARCODE:5941234567890
  MEASURED:H=218:D=63
  RESULT:ACCEPTED
  RESULT:REJECTED:oversized
  ERROR:JAM / ERROR:SCANNER_FAIL

Protocol simulare (build xplained_mini_sim):
  SIM:BEAM:ON/OFF      SIM:BARCODE:<val>    SIM:HEIGHT:<mm>
  SIM:DIAM:<mm>        SIM:JAM              SIM:RESET_STUBS
  → ATmega raspunde cu SIM:ACK:<mesaj> sau SIM:ERR:<motiv>

Rezultate Obţinute

  • Firmware-ul compileaza fara warninguri in ambele configuratii (productie si simulare)
  • Build-ul de simulare a fost testat pe ATmega328P Xplained Mini: comunicatia seriala, masina de stari si SimBridge functioneaza corect
  • Platforma web este functionala cu toate cele cinci pagini: dashboard live, simulare, CRUD barcodes, tranzactii, statistici
  • S-a implementat un script custom Python pentru a rezolva o limitare a PlatformIO cu protocolul mEDBG (interfata USB HID in loc de port serial clasic)
  • Componentele hardware au fost comandate; dupa sosire urmeaza constructia fizica si calibrarea constantelor (distante senzori, durata transport)

Concluzii

Separarea clara intre domain si infrastructure s-a dovedit o necesitate practica, nu un lux: fara ea nu ar fi fost posibila testarea logicii masinii de stari inainte de sosirea hardware-ului. Frameworkul de simulare, implementat in cateva zile, va economisi saptamani de debugging ulterior.

Constrangerea de memorie (2KB RAM) a impus decizii concrete de design: FixedString in loc de String, alocare exclusiv statica, fara exceptii. Pe platforma web, SQLite + Drizzle a oferit zero configurare si schema TypeScript-first, portabila complet.

Download

Structura proiectului:

SmartRVM/
    device/          -- firmware ATmega (PlatformIO)
    platform/        -- platforma web (pnpm monorepo)
    DOCUMENTATION.md
    SHOPPING_LIST.md

Compilare si upload firmware:

cd device
pio run -e xplained_mini              # build productie
pio run -e xplained_mini_sim -t upload  # upload simulare

Pornire platforma web:

cd platform && pnpm install
pnpm --filter server dev   # port 3000
pnpm --filter client dev   # port 5173

Bibliografie/Resurse

Resurse Hardware:

Resurse Software:

Cursuri PM relevante:

  • Cursul 1 (UART): comunicatie seriala ATmega-PC si SoftwareSerial pentru scanner
  • Cursul 3 (Timere, PWM): PWM pentru servomotor (50 Hz) si control motor DC
  • Cursul 2 (Debugging, UART): debug prin Serial.println in faza de simulare

Export to PDF

pm/prj2026/vlad.radulescu2901/paul.prodan.1778420822.txt.gz · Last modified: 2026/05/10 16:47 by paul.prodan
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