M.A.R.K Matrix AI Recognition Kit

Typ_projektu
Arduino
Zdjecie główne
Krótki opis projektu

Urządzenie rejestruje obraz przy użyciu kamery, przesyła go do Gemini AI w celu analizy, a następnie prezentuje wynik na panelu diodowym LED. Interfejs użytkownika został oparty na pojedynczym przycisku sterującym

Niezbędne elementy

- Mikrokontroler ESP32-CAM w wariancie AI-Thinker

- Adresowalna matryca LED NeoPixel 16x16

- Płytka zasilająca (moduł SIC)

- Przycisk monostabilny

- Płytka stykowa

- Przewody połączeniowe

Opis projektu

1. Cel i zakres projektu

Urządzenie rejestruje obraz przy użyciu kamery, przesyła go do Gemini AI w celu analizy, a następnie prezentuje wynik na panelu diodowym LED. Interfejs użytkownika został oparty na pojedynczym przycisku sterującym. Rozróżnienie realizowanych przez algorytm zadań zależy od czasu naciśnięcia styku:

• Tryb 1 (Krótkie naciśnięcie): Następuje przechwycenie obrazu obiektu znajdującego się przed obiektywem. Zdjęcie przekazywane jest do algorytmów sztucznej inteligencji, która dokonuje identyfikacji przedmiotu, a następnie generuje unikalną grafikę Pixel Art o rozdzielczości 16x16 pixeli. Grafika ta jest dekodowana i wyświetlana na matrycy.

• Tryb 2 (Długie przytrzymanie – powyżej 2 sekund): Urządzenie rejestruje obraz twarzy użytkownika. Sztuczna inteligencja dokonuje analizy mimiki i zwraca określone słowo-klucz odpowiadające wykrytej emocji. Mikrokontroler dopasowuje otrzymany komunikat do stałych wzorców grafik zapisanych w pamięci programu i wyświetla odpowiednią ikonę.

2. Specyfikacja sprzętowa

Architektura sprzętowa projektu opiera się na mikrokontrolerze z obsługą sieci bezprzewodowych oraz zintegrowanym module kamery. Całość zintegrowano z adresowalną matrycą LED, układem wyzwalania ręcznego oraz systemem zasilania, zapewniającym stabilną pracę komponentów, oto ich szczegółowa lista:

• Mikrokontroler ESP32-CAM w wariancie AI-Thinker. Pełni on rolę mózgu całego projektu. Odpowiada za robienie zdjęć, kodowanie ich do formatu Base64, nawiązywanie szyfrowanego połączenia internetowego (HTTPS) oraz komunikację z chmurowym interfejsem API. Dodatkowo mikrokontroler generuje sygnał sterujący dla matrycy LED projektu.

• Adresowalna matryca LED NeoPixel 16x16

Prezentuje wygenerowany przez AI obraz (pixel art) na podstawie otrzymanego poprzez API opisu zdjęcia. Posiada 256 adresowalnych pikseli. W celu ograniczenia poboru prądu jej jasność została ograniczona do 15% pełnej mocy.

• Płytka zasilająca (moduł SIC)

Ze względu na specyfikę modułu ESP32-CAM (podatność na spadki napięcia przy inicjalizacji kamery i transmisji Wi-Fi) oraz obecność 256 diod LED, system wymaga stabilnego zasilania. Podłączonym do płytki zewnętrznym źródłem zasilania jest, w zależności od możliwości, silny powerbank lub zasilanie prosto z laptopa. 

• Przycisk monostabilny

Został on podłączony do pinu GPIO 15 w celu wprowadzenia kontroli funkcji całej ramki.

• Płytka stykowa

Jest to baza montażowa pozwalająca na bezlutowe połączenia elektryczne, zapewniające szybki dostęp do pinów. Dzięki niej doszło do połączenia przycisku z samą płytką.

• Przewody połączeniowe

Do połączenia przycisku z płytką zasilającą oraz przesyłającą sygnał na płytce stykowej potrzebny jest komplet przewodów damsko-męskich.

3. Analiza i rozwiązanie problemów technicznych 

Podczas prac programistycznych i montażowych napotkano szereg problemów wynikających z ograniczeń sprzętowych platformy mikrokontrolera oraz specyfiki sterowania diodami.

Problem 1: Konflikt sprzętowy linii GPIO4 i błędy startu kamery

W pierwotnej konfiguracji planowano zastosowanie dwóch niezależnych przycisków.  Jeden z nich został przypisany do wolnej linii GPIO4. Wybór ten spowodował błędy, które uniemożliwiają uruchomienie urządzenia. W architekturze ESP32-CAM linia GPIO4 jest współdzielona z tranzystorem sterującym silną diodą doświetlającą (Flash). Wymuszenie stanu wysokiego na tym pinie podczas rozruchu blokowało wewnętrzne magistrale, uniemożliwiając inicjalizację kamery. 

• Rozwiązanie: Zredukowano liczbę fizycznych przycisków do jednej sztuki, rezygnując z wykorzystania linii GPIO4. Przycisk podłączono do bezpiecznego pinu GPIO15. Wybór realizowanej funkcji przeniesiono do warstwy programowej, implementując pomiar czasu trzymania styku za pomocą funkcji millis(). Zmiana ta wyeliminowała problem błędów startowych. 

Problem 2: Niestabilność pamięci RAM i samoczynne restarty mikrokontrolera

Zastosowanie powszechnie dostępnych, zewnętrznych bibliotek graficznych do obsługi paneli LED skutkowało losowym zawieszaniem się i restartowaniem procesora. Analiza wykazała, że jednoczesna rezerwacja pamięci na bufor ramki aparatu fotograficznego oraz obsługę 256 diod doprowadzała do przepełnienia pamięci RAM i konfliktów czasowych w obsłudze przerwań procesora.

• Rozwiązanie: Usunięto z kodu programu wszelkie zewnętrzne biblioteki dedykowane dla diod programowalnych. Sterowanie matrycą zrealizowano poprzez bezpośrednie odwołania do wbudowanego w strukturę ESP32 peryferium sterowania bezprzewodowego RMT (za pomocą biblioteki driver/rmt_tx.h). Opracowano lekki, natywny kod enkodera sygnału dla układów WS2812B, co wyeliminowało błędy pamięci i zapewniło pełną stabilność operacyjną.

Problem 3: Sprzętowy konflikt linii GPIO16 z pamięcią zewnętrzną PSRAM

Po uruchomieniu wyższych rozdzielczości przechwytywania obrazu (SVGA/XGA), układ zaczął zachowywać się całkowicie nieprzewidywalnie. W momencie wyzwolenia migawki, matryca LED zaczynała migać losowymi barwami, a przesyłany do chmury plik JPEG był uszkodzony lub ucięty w połowie. Analiza dokumentacji technicznej płytki ESP32-CAM wykazała poważny konflikt sprzętowy. Pin GPIO16 (użyty pierwotnie do sterowania diodami) jest w tym module  współdzielony z magistralą obsługującą rozszerzoną pamięć nieulotną PSRAM. Gdy aparat potrzebował zapisać dużą klatkę obrazu, procesor intensywnie korzystał z PSRAM, co generowało wysokie stany logiczne na linii GPIO16. Nakładający się na to sygnał sterujący matrycą z peryferium RMT powodował całkowite przekłamanie danych zarówno w pamięci, jak i na wyświetlaczu.

• Rozwiązanie: Konflikt rozwiązano poprzez programowe sterowanie kolejnością działania procesów. Podczas uruchamiania procesu etapy działają sekwencyjnie. Najpierw jest robione zdjęcie, potem urządzenie komunikuje się poprzez API z serwerem sztucznej inteligencji, a dopiero na koniec włącza diody LED na matrycy. 

4. Opis struktury logicznej programu

Główna pętla programu (loop) działa w sposób ciągły, monitorując stan wejścia GPIO15. W momencie wykrycia wciśnięcia przycisku następuje uruchomienie programu. Przed wykonaniem zdjęcia wyłączana jest magistrala RMT sterująca diodami, co gwarantuje zaciemnienie matrycy i zapobiega podwyższonemu zużyciu prądu. Zdjęcie w formacie JPEG zostaje zakodowane do postaci tekstu Base64 i przesłane do serwera za pośrednictwem bezpiecznego protokołu HTTPS.

• W Trybie 1 zapytanie wymusza na sztucznej inteligencji zwrot surowej tablicy JSON zawierającej dokładnie 256 elementów reprezentujących składowe RGB. Autorski parser odczytuje wartości bez użycia dodatkowych bibliotek i wprowadza je do pamięci.

• W Trybie 2 zapytanie obliguje sztuczną inteligencję do zwrotu wyłącznie jednego słowa z predefiniowanej listy (np. RADOSC). Po odebraniu słowa program mapuje je i ładuje odpowiedni sznurek HEX bezpośrednio z pamięci stałej Flash mikrokontrolera. 

5. Instrukcja reprodukcji programu 

Poniższa procedura pozwala na prawidłowe odtworzenie i uruchomienie opisanego systemu.

Krok 1: Konfiguracja środowiska programistycznego

1. Uruchomić program Arduino IDE (zalecana wersja 2.x).

2. Otworzyć menu Plik -> Preferencje i w polu Dodatkowe adresy URL menedżera płytek umieścić oficjalny odnośnik dla procesorów firmy Espressif:

https://espressif.github.io/arduino-esp32/package_esp32_index.json

3. Przejść do sekcji Menedżer płytek, wyszukać pakiet esp32 i zainstalować go (rekomendowana wersja 3.0.x).

Krok 2: Połączenia elektryczne

Wszelkie prace montażowe należy wykonywać przy bezwzględnie odłączonym zasilaniu:

• Pin 5V panelu LED połączyć z pinem 5V na płytce rozszerzeniowej SiC.

• Pin GND panelu LED połączyć z pinem GND na płytce rozszerzeniowej SiC.

• Pin sygnałowy DIN matrycy LED połączyć z pinem GPIO16 mikrokontrolera.

• Fizyczny przycisk podłączyć pomiędzy pin GPIO15 a wspólną masę GND.

Uwaga dotycząca bilansu prądowego: Pełne wysterowanie 256 diod RGB mogłoby doprowadzić do poboru prądu przekraczającego możliwości standardowego portu USB komputera. W celu zapewnienia pełnego bezpieczeństwa sprzętowego w kodzie wprowadzono stałe programowe ograniczenie jasności świecenia do poziomu 15% (const float JASNOSC = 0.15;). Pozwala to na bezpieczne zasilanie układu bezpośrednio z komputera.

Krok 3: Pozyskanie poświadczeń API

1. Zalogować się na platformie Google AI Studio przy użyciu konta Google.

2. Wygenerować dany klucz dostępu poprzez kliknięcie opcji Get API Key.

3. Skopiowany ciąg znaków wkleić w sekcji zmiennych globalnych programu zamiast ciągu "TWOJ_KLUCZ_GEMINI".

Krok 4: Wdrożenie kodu i konfiguracja sieci

1. W polach tekstowych ssid oraz password zdefiniować parametry lokalnej sieci bezprzewodowej Wi-Fi (pasmo 2.4 GHz).

2. W menu Narzędzia wybrać profil płytki: AI Thinker ESP32-CAM.

3. Wskazać właściwy port komunikacyjny COM i uruchomić procedurę kompilacji oraz wgrywania programu.

Krok 5: Procedura testowa i weryfikacja

Po poprawnym zakończeniu programowania należy zresetować układ przyciskiem RST i uruchomić Monitor Portu Szeregowego (prędkość 115200 baud).

• Weryfikacja Trybu 1: Krótkie kliknięcie przycisku skierowanego na dowolny obiekt powinno skutkować przesłaniem danych i wyświetleniem na matrycy unikalnej grafiki pikselowej odwzorowującej dany przedmiot.

• Weryfikacja Trybu 2: Przytrzymanie przycisku przez czas dłuższy niż 2 sekundy przy jednoczesnym skierowaniu obiektywu na twarz powinno wywołać analizę mimiki i wyświetlenie odpowiedniej emotki.

6. Wnioski

Zrealizowany projekt pokazał, że mały i tani mikrokontroler potrafi bez problemu współpracować z zaawansowaną sztuczną inteligencją w chmurze. Nie potrzeba ogromnej mocy obliczeniowej na samym urządzeniu, żeby sprawnie rozpoznawać przedmioty czy analizować ludzkie emocje.

 

Zdjęcia
kod programu
ZIP ponizej
Youtube
Tagi
neopixel esp32cam matryca AI emocje