Proiectul “Smart Glasses” este un sistem de ochelari inteligenți bazat pe ESP32-S3 care combină tehnologii de computer vision cu un display transparent pentru a crea o experiență de realitate augmentată accesibilă.
Sistemul captează imagini prin intermediul unei camere integrate OV2640, le transmite unui server pentru procesare (detectare de obiecte/rezolvarea unor probleme), iar apoi afișează rezultatele pe un display transparent, direct în câmpul vizual al utilizatorului.
Scopul principal este de a augmenta realitatea din jurul utilizatorului, oferind informații contextuale despre obiecte și mediul înconjurător într-un mod neintruziv și în timp real.
Ideea a pornit de la necesitatea de a avea acces instantaneu la informații despre obiecte din jur fără a fi nevoie să se utilizeze un smartphone sau alt dispozitiv separat. De asemenea, am dorit să explorez capacitățile microcontrolerelor moderne de a gestiona procesarea și transmiterea de imagini în aplicații IoT.
Proiectul este util ca platformă educațională pentru înțelegerea integrării sistemelor embedded cu tehnologii de computer vision și comunicații wireless. Pentru utilizatorul final, oferă o experiență de realitate augmentată accesibilă care poate fi aplicată în diverse domenii: educație, turism, asistență tehnică, accesibilitate pentru persoanele cu deficiențe de vedere, etc.
Sistemul Smart Glasses este compus din următoarele module principale:
Fluxul de date din sistem:
1. Utilizatorul apasă butonul pentru a capta o imagine 2. Camera OV2640 capturează imaginea și o transmite către ESP32-S3 3. ESP32-S3 procesează imaginea (compresie, formatare) și o transmite prin Wi-Fi către server 4. Serverul analizează imaginea, detectează obiectele/rezolvă problema 5. Rezultatele sunt trimise înapoi către ESP32-S3 6. ESP32-S3 formatează și afișează rezultatele pe displayul transparent
Lista de piese:
Schema electrică:
Conectări pinout ESP32-S3 FireBeetle:
Componentă | Pin ESP32-S3 | Funcție |
---|---|---|
Cameră OV2640 - SIOC | GPIO27 | I2C SCL |
Cameră OV2640 - SIOD | GPIO26 | I2C SDA |
Cameră OV2640 - VSYNC | GPIO25 | Sincronizare verticală |
Cameră OV2640 - HREF | GPIO23 | Referință orizontală |
Cameră OV2640 - PCLK | GPIO22 | Clock pixel |
Cameră OV2640 - XCLK | GPIO21 | Clock extern |
Cameră OV2640 - D0-D7 | GPIO4-GPIO11 | Bus date |
Display - CS | GPIO15 | SPI Chip Select |
Display - DC | GPIO33 | SPI Data/Command |
Display - RESET | GPIO32 | Reset |
Display - SDA | GPIO13 | SPI MOSI |
Display - SCL | GPIO14 | SPI Clock |
Buton captură | GPIO0 | Intrare digitală cu pull-up |
ESP32 (dispozitiv embedded):
Server Python (desktop/cloud):
Proiectul este împărțit în două mari componente:
→ Inițial, ochelarii sunt în modul inactiv. La apăsarea butonului, camera pornește și expune un flux pe un server local.
→ Serverul Python detectează activarea, se conectează la flux și captează rapid mai multe cadre (5–10).
→ Cadrele sunt analizate și interpolate pentru a obține o imagine mai clară, chiar dacă ESP32 are captură low-power.
→ Imaginea este îmbunătățită și transmisă către Gemini pentru analiză (captioning, descriere, etc.).
→ Textul generat este trimis înapoi către ESP32.
→ Pe ecranul OLED, textul este afișat secvențial, cu un efect vizual plăcut (animat, cu tranziții).
→ În orice moment, utilizatorul poate opri ochelarii apăsând butonul fizic, revenind astfel în starea inițială.
→ Serverul de pe ESP32 folosește `esp_http_server` pentru a expune un stream continuu JPEG.
→ ESP32 nu are resurse suficiente pentru procesări grele, deci serverul preia responsabilitatea reconstrucției imaginii.
→ Pentru o interpolare eficientă, se folosesc puncte de interes din fiecare imagine captată (`cv2.goodFeaturesToTrack`, `cv2.calcOpticalFlowPyrLK`).
→ Interpolarea se face pe baza poziției punctelor și a distanței temporale între cadre.
→ Îmbunătățirea imaginii implică operații precum: histogram equalization, denoising, sharpening.
→ Imaginea rezultată este convertită într-un format compatibil și transmisă prin `requests` către Gemini API.
→ Răspunsul (textul generat) este trimis către endpoint-ul ESP32 pentru a fi afișat.
→ Pe ESP32, biblioteca `U8g2lib` este utilizată pentru a randa textul secvențial. Afișarea se face literă cu literă sau cuvinte cu tranziții fluide.
→ În timpul afișării, se evită re-randarea completă a ecranului, pentru a menține o experiență vizuală plăcută și eficientă energetic.
→ Este utilizată metoda de polling pentru citirea butonului (nu întreruperi), din motive de simplitate și stabilitate.
→ În ESP32, afișarea textului pe OLED este realizată doar dacă textul se schimbă, evitând randarea completă a ecranului.
→ Textul este despărțit în segmente logice (fraze sau cuvinte) și afișat cu delay-uri mici pentru efect de tip „scriere animată”.
→ Butonul are un sistem de „debouncing” software pentru a evita dublările accidentale.
→ Pe partea de server, cadrele sunt procesate în paralel cât mai mult posibil (folosind numpy și OpenCV optimizat).
→ Gemini este apelat doar dacă imaginea finală are o calitate suficientă (se aplică un scor de claritate înainte de trimitere).
→ Cheile API sunt securizate folosind `.env` și nu sunt expuse în codul sursă.