ArduCam OV2640 jako samodzielny moduł i ESP32

Jest sporo różnych modułów ArduCam, łatwo je podłączyć do Arduino czy ESP8266. Jednak gdy szukałem informacji o tym jak podłączyć moduł ArduCam Mini 2MP OV2640 do ESP32, w sieci jest pełno przykładów dla ESP32-CAM. Jest to zintegrowany moduł ESP32 od AI-thinker razem z kamerą OV2640. Problem jest taki, że sposób połączenia jest ukryty przed nami. Gdy z jakiegoś powodu potrzebujesz podłączyć kamerę do innego typu modułu ESP32 trudno znaleźć informacje. Przebrnąłem przez to i zapisałem „dla potomności”. Może komuś w przyszłości to ułatwi podłączenie.

Zacznę trochę od końca. Wspomniany moduł ArduCam posiada zarówno piny SPI jak I2C. Po uruchmieniu całości z ciekawości odłączyłem I2C, ponieważ na swoich stronach ArduCam pisze o podłączeniu tylko z SPI. Biblioteka ArduCam Mega uraczyła mnie podczas startu takim komunikatem:

ArduCAM Start!
[ 1030][E][Wire.cpp:513] requestFrom(): i2cRead returned Error 263
[ 2033][E][Wire.cpp:513] requestFrom(): i2cRead returned Error 263
Can’t find OV2640 module!

Jednak, od dziwo, kamera działała jak należy. Jeśli potrzebujesz tej informacji to sprawdź dokładnie. Może I2C jest niezbędne do konfiguracji kamery (zmiany parametrów). Ponieważ testowałem na prośbę klienta tylko jak podłączyć, to nie wgryzałem się w temat.

Jako płytka z ESP32 posłużył mi ESP32 D1 mini, lubię go, bo w pewnym zakresie jest zgodny (położenie i funkcje pinów) z Wemosem, ale oferuje dużo więcej. Świetnie nadaje się do projektów gdy przechodzisz z ESP8266 do ESP32, zwłaszcza jeśli pierwotnie użyłeś Wemosa. Ok, wracamy do połączenia modułu kamery:

Moduł OV2640ESP32 GPIO
CSGPIO17
SCKGPIO18
MISOGPIO19
MOSIGPIO23
SDAGPIO21
SCLGPIO22
GNDGND
VCC3.3V
Tabela połączeń między ESP32 D1 mini a modułem ArduCam Mini 2MP

Do obsługi użyłem „oficjalnej” biblioteki ArduCam Mega. Ma ona gotowy przykład dla ESP8266. Ze względu na podobieństwa obu procesorów oraz SDK Arduino dla nich szkic wymaga tylko kilku zmian:

  • ESP8266WiFi.h zmieniamy na WIFi.h
  • ESP8266WebServer.h na WebServer.h
  • ESP8266mDNS.h może zostać usunięty
  • W bibliotece trzeba odnaleźć memorysaver.h i odkomentować #define OV2640_MINI_2MP (załączony do wpisu projekt dla Platformio ma już to poprawione, ale, jeżeli z jakiegoś powodu biblioteka zostanie zreinstalowana, ten krok trzeba będzie zrobić ponownie)
  • W przykładzie koniecznie jest zmiana nr pinu const int CS = 16; na 17 bo taki akurat wybrałem
  • Ja wolę by ESP32 podłączyło się do mojej sieci WiFi i łączymy się z nadanym przez router adresem IP (druga opcja to ESP32 wystawia własną sieć WiFi). By wybrać tryb pracy klienta zmieniamywifiType to 0 i podajemy właściwe SSID i PASSWORD. Ten krok musisz zrobić, bo z oczywistych powodów nie znam waszego hasła i nazwy sieci, więc w załączonym projekcie nie mogłem wpisać :)

I w zasadzie to by było na tyle. Może jeszcze – OV2640 jest dość prądożerne. Dlatego, gdy całość zasilana jest z portu USB w komputerze, czasem podczas inicjalizacji kamery ESP32 się resetuje z komunikatem brownout detected.

W kodzie, w porównaniu z oryginalnym przykładem zmieniłem rozdzielczość, bo wybrana przez autorów rozdziałka 320×240 to jakiś horror ;) Dlatego dodałem myCAM.OV2640_set_JPEG_size(OV2640_1600x1200); Teraz tylko używając ulubionej przeglądarki odwiedzić IP, które dostało ESP32 i pod URL /stream zobaczyć transmisję wideo albo pod URL /capture statyczne zdjęcie.

A oto zrzut ekranu z uzyskanym obrazem z kamery