This shows you the differences between two versions of the page.
|
pm:prj2026:ciprian.popescu0411:dice [2026/05/23 18:09] andrei.cotiga [Hardware Design] |
pm:prj2026:ciprian.popescu0411:dice [2026/05/23 18:43] (current) andrei.cotiga [Hardware Design] |
||
|---|---|---|---|
| Line 21: | Line 21: | ||
| * Servomotor SG90: Acționează mecanic paharul pentru a amesteca zarurile fizice prin mișcări scurte și agresive la comanda microcontroller-ului. | * Servomotor SG90: Acționează mecanic paharul pentru a amesteca zarurile fizice prin mișcări scurte și agresive la comanda microcontroller-ului. | ||
| * Ecran LCD 2004 (sau 1602) cu modul I2C: Afișează meniurile, rândul jucătorilor, instrucțiunile defilante, punctajul și mesajul cu câștigătorul jocului. | * Ecran LCD 2004 (sau 1602) cu modul I2C: Afișează meniurile, rândul jucătorilor, instrucțiunile defilante, punctajul și mesajul cu câștigătorul jocului. | ||
| + | |||
| * 2 x Module Programator FTDI (CP2102/CH340): | * 2 x Module Programator FTDI (CP2102/CH340): | ||
| * **Programatorul 1:** Folosit pentru a încărca codul, pentru comunicația serială și pentru a alimenta partea logică (ESP32-CAM și LCD). | * **Programatorul 1:** Folosit pentru a încărca codul, pentru comunicația serială și pentru a alimenta partea logică (ESP32-CAM și LCD). | ||
| Line 69: | Line 70: | ||
| | Camera OV2640 | Panglica FPC (24 pini) | Conector FPC dedicat pe placa ESP32-CAM | | | Camera OV2640 | Panglica FPC (24 pini) | Conector FPC dedicat pe placa ESP32-CAM | | ||
| - | Deoarece placa ESP32-CAM nu dispune de o mufă USB integrată pentru alimentare și programare, s-a optat inițial pentru utilizarea unui modul FTDI. Totuși, dinamica proiectului a impus o regândire a distribuției de curent. Servomotorul SG90, configurat să execute mișcări violente și bruște de 160 de grade pentru a amesteca eficient zarurile în paharul de plastic, generează vârfuri masive de consum de curent (aprox. 1 Amper la fiecare inversare de sens). | + | Deoarece placa ESP32-CAM nu dispune de o mufă USB integrată pentru alimentare și programare, s-a optat inițial pentru utilizarea unui modul FTDI. Totuși, dinamica proiectului a impus o regândire a distribuției de curent. Servomotorul SG90, configurat să execute mișcări violente și bruște de 120 de grade pentru a amesteca eficient zarurile în paharul de plastic, generează vârfuri masive de consum de curent (aprox. 1 Amper la fiecare inversare de sens). |
| Pentru a preveni fenomenul de "brownout" (resetarea plăcii din cauza lipsei de curent), arhitectura breadboard-ului a fost împărțită într-un sistem hibrid cu două circuite de 5V izolate, susținute de două porturi USB distincte, dar având masa (GND) comună: | Pentru a preveni fenomenul de "brownout" (resetarea plăcii din cauza lipsei de curent), arhitectura breadboard-ului a fost împărțită într-un sistem hibrid cu două circuite de 5V izolate, susținute de două porturi USB distincte, dar având masa (GND) comună: | ||
| Line 86: | Line 87: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | * Demo joc: https://www.youtube.com/watch?v=VLBmq61MyY0 | ||
| + | * github: https://github.com/cotigamihnea/diceandroll | ||
| - | <note tip> | + | Proiectul este structurat într-o arhitectură de tip Client-Server și folosește două medii de dezvoltare distincte: PlatformIO (C++) pentru logica hardware și controlul microcontroller-ului ESP32-CAM, și Python pentru procesarea de imagine (Computer Vision) rulată pe PC. |
| - | Descrierea codului aplicaţiei (firmware): | + | |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
| - | * (etapa 3) surse şi funcţii implementate | + | |
| - | </note> | + | |
| - | ===== Rezultate Obţinute ===== | + | === 1. Componenta Microcontroller (PlatformIO / C++) === |
| + | |||
| + | Codul pentru placa ESP32-CAM a fost dezvoltat în PlatformIO, folosind framework-ul Arduino. Acesta rulează un server web HTTP care acceptă comenzi, controlează interfața fizică (butoanele tactile și ecranul LCD 20x4 via I2C) și generează semnale PWM pentru servomotor. De asemenea, implementează o mașină de stări pentru gestionarea celor două moduri de joc (Free Roll și Barbut). | ||
| + | |||
| + | Functii principale implementate: | ||
| + | |||
| + | ^ Functie ^ Rol ^ | ||
| + | | setup() | Inițializează pinii pentru butoane, pornește comunicația I2C pentru ecranul LCD, configurează semnalul PWM pentru servomotor, inițializează camera OV2640, se conectează la rețeaua Wi-Fi și pornește serverul web. | | ||
| + | | loop() | Reprezintă bucla principală a sistemului. Citește non-stop starea butoanelor (incluzând logica de debouncing și detectarea dublu-click-ului pentru funcția de "Back"), gestionează stările jocului și ascultă cererile HTTP venite de la scriptul Python. | | ||
| + | | afiseazaMeniuPrincipal() | Curăță ecranul LCD și desenează interfața inițială de selecție a modului de joc (1. Free Roll / 2. Barbut). | | ||
| + | | ruleazaScroll(String text) | Implementează o funcție non-blocking (fără delay) care preia un string lung și îl defilează continuu de la dreapta la stânga pe ultimul rând al ecranului LCD (stil marquee). | | ||
| + | | scuturaPahar(int jucator) | Blochează input-urile noi, afișează pe ecran jucătorul curent și trimite o secvență de comenzi rapide și agresive către servomotor pentru a amesteca zarurile fizice. La final, trece sistemul în starea de așteptare procesare AI. | | ||
| + | |||
| + | Biblioteci folosite: | ||
| + | |||
| + | ^ Biblioteca ^ Rol ^ | ||
| + | | Arduino.h | Funcții de bază ale framework-ului Arduino (GPIO, millis, delay, manipulare string-uri). | | ||
| + | | esp_camera.h | Driver-ul oficial Espressif pentru configurarea și capturarea de cadre (framebuffer) folosind senzorul camerei OV2640. | | ||
| + | | WiFi.h | Gestionarea conexiunii wireless și crearea serverului web local (clasa WiFiServer). | | ||
| + | | Wire.h | Implementarea protocolului de comunicare I2C necesar pentru ecranul LCD. | | ||
| + | | LiquidCrystal_I2C.h | Controlul ecranului LCD 2004 (afișare text, gestionare cursoare, iluminare de fundal). | | ||
| + | | ESP32Servo.h | Generarea de semnale PWM hardware compatibile cu arhitectura ESP32 pentru controlul precis al servomotorului SG90. | | ||
| + | |||
| + | === 2. Componenta Inteligență Artificială (Python) === | ||
| + | |||
| + | Partea de recunoaștere vizuală este scrisă în Python și rulează pe un PC conectat la aceeași rețea Wi-Fi. Scriptul acționează ca un "creier extern": interoghează constant ESP32-ul pentru a afla când s-au aruncat zarurile, descarcă fotografia, numără punctele negre și trimite scorul (sau verdictul meciului) înapoi către plăcuță. | ||
| + | |||
| + | Functii principale implementate: | ||
| + | |||
| + | ^ Functie ^ Rol ^ | ||
| + | | numara_puncte_zaruri() | Reprezintă inima algoritmului AI. Execută un request în gol pentru a goli memoria buffer a camerei (Stale Frame Flush), descarcă o imagine nouă, aplică filtre de preprocesare (Grayscale, Median Blur, Normalize) și folosește Blob Detection pentru a număra punctele zarurilor de pe masă. | | ||
| + | | Bucla Principala (while True) | Logica principală de arbitraj. Interoghează la fiecare 0.5 secunde ruta "/status" a ESP32-ului. În funcție de modul de joc detectat (Free Roll sau Barbut), alocă punctele jucătorilor, decide câștigătorul în meciurile de tip 1vs1 și formulează request-uri HTTP pe ruta "/update" pentru a debloca ecranul plăcuței cu noile date. | | ||
| + | |||
| + | Biblioteci folosite: | ||
| + | |||
| + | ^ Biblioteca ^ Rol ^ | ||
| + | | cv2 (OpenCV) | Bibliotecă avansată de Computer Vision. Folosită pentru transformări de imagine, eliminarea zgomotului, îmbunătățirea contrastului și detectarea formelor circulare (SimpleBlobDetector). | | ||
| + | | numpy | Manipularea rapidă a array-urilor de date necesară pentru a converti fluxul de biți descărcat prin HTTP într-o matrice de pixeli procesabilă de OpenCV. | | ||
| + | | requests | Realizarea de cereri HTTP (GET) către serverul ESP32 pentru obținerea statusului, descărcarea fotografiilor JPEG și trimiterea scorurilor. | | ||
| + | | time | Gestionarea pauzelor (sleep) pentru a permite zarurilor fizice să se stabilizeze înainte de capturarea imaginii și pentru a preveni supraîncărcarea serverului Wi-Fi cu cereri. | | ||
| + | ===== Rezultate Obținute ===== | ||
| + | |||
| + | Sistemul propus îndeplinește obiectivul principal de a automatiza complet aruncarea și arbitrarea unui joc cu zaruri, integrând cu succes acționarea mecanică, comunicarea IoT și viziunea artificială (Computer Vision). | ||
| + | |||
| + | Rezultatele principale: | ||
| + | |||
| + | * problema resetărilor bruște (brownouts) ale plăcuței ESP32-CAM a fost eliminată complet prin proiectarea unei arhitecturi hardware cu alimentare duală (izolarea circuitului de forță al motorului de cel logic). | ||
| + | |||
| + | * algoritmul de Blob Detection din Python recunoaște zarurile cu o precizie ridicată, fiind imun la zgomot vizual (umbre, praf) datorită filtrelor de preprocesare (Blur, Normalizare) și calibrării stricte a parametrilor de formă și arie. | ||
| + | |||
| + | * problema memoriei tampon hardware a camerei OV2640 (livrarea unui "stale frame" din trecut) a fost rezolvată elegant printr-o tehnică software de golire a buffer-ului înainte de captura finală. | ||
| + | |||
| + | * interfața LCD 20x4 este interactivă și curată, oferind navigare prin dublu-click, animații de text defilant (marquee) și actualizări în timp real ale scorului. | ||
| + | |||
| + | * logica de arbitraj funcționează perfect în ambele moduri de joc (Free Roll și Barbut), gestionând automat rândul jucătorilor și decizia finală fără intervenție umană. | ||
| + | |||
| + | Limitări așteptate: | ||
| + | |||
| + | * sensibilitate la iluminarea ambientală extremă; deși algoritmul normalizează contrastul, o schimbare drastică a luminii din cameră poate necesita recalibrarea camerei sau a scriptului Python. | ||
| + | |||
| + | * latență inerentă a fluxului de joc (aprox. 4-5 secunde pe aruncare) cauzată de timpii necesari pentru scuturarea mecanică completă, stabilizarea fizică a zarurilor și transferul imaginii prin protocol HTTP. | ||
| - | <note tip> | ||
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | ||
| - | </note> | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| - | ===== Download ===== | + | Acest proiect demonstrează o soluție practică și creativă de îmbinare a sistemelor integrate (embedded) cu algoritmii de analiză a imaginilor rulați pe o arhitectură externă. Delegarea sarcinii complexe de procesare video către un PC (Python/OpenCV) permite sistemului ESP32-CAM să ruleze rapid și fără blocaje, ocupându-se exclusiv de sarcinile de timp real: achiziția datelor, controlul motorului, citirea butoanelor și actualizarea display-ului. |
| - | <note warning> | + | Dezvoltarea interfeței duale hardware-software a transformat un simplu cititor de puncte într-o consolă interactivă de barbut, rezultând un sistem robust care poate constitui oricând baza pentru automatizarea altor board games sau proiecte de robotică vizuală. |
| - | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
| - | 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> | ||
| - | ===== Jurnal ===== | ||
| - | <note tip> | ||
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
| - | </note> | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| - | <note> | + | === Resurse Hardware === |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
| - | </note> | + | * ESP32-CAM & AI-Thinker: Documentația oficială și pinout-ul modulului ESP32-CAM pentru maparea corectă a conexiunilor și a alimentării duale. (https://docs.ai-thinker.com/en/esp32-cam) |
| + | |||
| + | * Modul I2C PCF8574 (LCD): Datasheet-ul expander-ului I/O pentru a înțelege adresarea (ex. 0x27) și remaparea pinilor SDA/SCL pe microcontroller. | ||
| + | |||
| + | === Resurse Software === | ||
| + | |||
| + | Cod Arduino | ||
| + | |||
| + | * Arduino Core for ESP32: Referința oficială Espressif pentru funcțiile de bază (WiFi, WebServer, GPIO, Timers). (https://docs.espressif.com/projects/arduino-esp32/) | ||
| + | |||
| + | * Biblioteca LiquidCrystal_I2C: Documentația bibliotecii folosite pentru afișarea textului static și implementarea funcției custom de defilare (marquee) pe LCD-ul 2004. (https://github.com/johnrickman/LiquidCrystal_I2C) | ||
| + | |||
| + | Cod Python | ||
| + | * OpenCV (Python): Documentația modulului cv2, în mod specific secțiunea despre preprocesarea imaginilor (cv2.medianBlur, cv2.normalize) și configurarea algoritmului cv2.SimpleBlobDetector_Params pentru recunoașterea punctelor zarurilor. (https://docs.opencv.org/) | ||
| + | * Python Requests: Documentația pentru manipularea cererilor HTTP (GET) și gestionarea timeout-urilor în comunicarea Client-Server. (https://requests.readthedocs.io/) | ||