Smart Glasses

Introducere

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ă.

  • Ce face?

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.

  • Care este scopul lui?

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.

  • Care a fost ideea de la care aţi pornit?

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.

  • De ce credeţi că este util pentru alţii şi pentru voi?

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.

Descriere generală

Sistemul Smart Glasses este compus din următoarele module principale:

  • Modulul de captare a imaginilor: Camera OV2640 conectată la microcontrolerul ESP32-S3 FireBeetle prin interfața SCCB/I2C
  • Modulul de interacțiune: Un buton fizic pentru declanșarea capturii de imagini
  • Modulul de procesare: ESP32-S3 FireBeetle pentru gestionarea comunicațiilor și procesarea locală
  • Modulul de comunicație: Wi-Fi integrat în ESP32-S3 pentru transmiterea imaginilor și primirea rezultatelor
  • Modulul de afișare: Display transparent montat în fața ochiului pentru redarea informațiilor
  • Sistemul backend: Server pentru procesarea imaginilor și detecția obiectelor/rezolvarea problemelor

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

Hardware Design

Lista de piese:

  • ESP32-S3 FireBeetle - Microcontroler cu Wi-Fi și Bluetooth integrat (1x)
  • Camera OV2640 - Cameră de 2MP cu interfață SCCB/I2C (1x)
  • Display transparent OLED/LCD - Pentru afișaj în câmpul vizual (1x)
  • Buton tactil - Pentru declanșarea capturii de imagine (1x)
  • Baterie LiPo 3.7V, min. 500mAh - Pentru alimentare portabilă (1x)
  • Modul încărcare baterie - Circuit de încărcare pentru bateria LiPo (1x)
  • Cabluri și conectori - Cabluri jumper, conectori JST (diverse)
  • Carcasă imprimată 3D - Pentru montarea componentelor pe rama ochelarilor (1 set)

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

**Design Software**

**Librării externe utilizate**

ESP32 (dispozitiv embedded):

  • `esp_camera.h`
    • utilizată pentru capturarea imaginilor de la camera ESP32
  • `WiFi.h`
    • utilizată pentru conectarea la rețeaua WiFi și expunerea serverului web
  • `DFRobot_AXP313A.h`
    • utilizată pentru managementul consumului de energie (power management) al plăcii
  • `Arduino.h`
    • funcționalități de bază oferite de framework-ul Arduino
  • `U8g2lib.h`
    • utilizată pentru randarea textului pe ecranul OLED (fonturi, layout, aliniere etc.)
  • `SPI.h`
    • utilizată pentru comunicarea serială cu ecranul OLED
  • `esp_http_server.h`
    • utilizată pentru inițializarea serverului web local pe ESP32 și expunerea de endpoint-uri

Server Python (desktop/cloud):

  • `os`, `time`, `argparse`
    • funcționalități generale de operare (gestionare fișiere, temporizări, argumente din CLI)
  • `requests`
    • folosită pentru apeluri HTTP (spre ESP32 și API-ul Gemini)
  • `cv2` (OpenCV)
    • folosită pentru detectarea de trăsături (features) și procesarea imaginilor
  • `numpy`
    • folosit pentru operații vectoriale și matriciale în manipularea imaginilor
  • `dotenv`
    • pentru a încărca cheile API și variabilele sensibile din fișiere `.env`
  • `google.generativeai`
    • utilizată pentru apelarea API-ului Gemini (transmiterea imaginilor procesate)
  • `PIL` (Image)
    • folosită pentru manipularea imaginilor în format binar (input/output imagini)
  • `io`
    • pentru a transmite imaginile în memorie către Gemini fără a le salva pe disc

**Componente ale codului**

Proiectul este împărțit în două mari componente:

  • Interfațare hardware (ESP32):
    • capturarea imaginilor prin cameră
    • expunerea serverului local (endpoint de stream)
    • afișarea textului pe ecranul OLED într-un mod animat
    • răspuns la input-ul de la buton (pornire/oprire ochelari)
  • Procesare pe server (Python):
    • conectare la fluxul video de pe ESP32
    • capturarea rapidă a 5–10 cadre consecutive
    • detecția de trăsături în fiecare imagine
    • interpolarea inteligentă a cadrelor folosind atât feature matching cât și logica temporală
    • îmbunătățirea imaginii (enhancement pentru contrast, claritate, etc.)
    • trimiterea imaginii îmbunătățite către Gemini
    • extragerea textului relevant și transmiterea lui înapoi către ESP32

**Fluxul aplicației**

→ 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ă.

**Detalii de implementare**

→ 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.

**Optimizări**

→ Î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ă.

**Github**

* Smart Glasses

* Contine codul folosit

* Contine si un demo pana la asamblarea pe ochleari

pm/prj2025/cmoarcas/carol_luca.gasan.txt · Last modified: 2025/05/25 21:39 by carol_luca.gasan
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