Introdução ao Uso de Câmeras com MicroPython no ESP32
O desenvolvimento de aplicações de visão computacional em sistemas embarcados pode ser complexo, especialmente quando envolve baixo nível em C. O driver MicroPython para câmeras ESP32 oferece uma abordagem simplificada, permitindo controle via código Python. Esta solução suporta diversas placas, como ESP32-CAM e M5Camera, e se beneficia do uso de PSRAM para processamento de imagens de alta resolução.
Configuração Inicial em 3 Etapas
1. Obtenção do Código Fonte
Clone o repositório do driver em seu ambiente local:
git clone https://exemplo.com/micropython-camera-driver.git
cd micropython-camera-driver
2. Gravação do Firmware
Sleecione um firmware pré-compilado adequado à sua placa. Utilize o esptool para realizar a gravação:
esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 firmware/micropython_esp32_camera.bin
3. Verificação da Inicialização
Após conectar o dispositivo, execute o seguinte código no REPL do MicroPython:
import esp_cam as cam
cam.setup(0, format=cam.JPG, memory=cam.PSRAM)
print("Módulo de câmera pronto para uso.")
Arquitetura do Projeto e PSRAM
A estrutura modular do driver inclui diretórios para configurações de placas e arquivos fonte como modcamera.c. O PSRAM é crucial para alocação de memória em buffers de imagem, permitindo capturas em resoluções superiores a SXGA sem sobrecarregar a RAM interna.
Funcionalidades Essenciais
Captura Básica de Imagens
import esp_cam as cam
cam.setup(0, format=cam.JPG, memory=cam.PSRAM)
imagem = cam.snapshot()
print(f"Dados da imagem: {len(imagem)} bytes")
Ajustes de Imagem
cam.flip_vertical(1) # Espelhamento vertical
cam.mirror_horizontal(1) # Espelhamento horizontal
cam.quality(15) # Qualidade JPEG (10-63)
cam.effect(cam.EFFECT_NONE)
cam.white_balance(cam.WB_AUTO)
cam.brightness(1) # Ajuste de brilho (-2 a 2)
Configuração de Resolução
cam.resolution(cam.RES_VGA) # 640x480
# Outras opções: RES_96X96, RES_QQVGA, RES_XGA, RES_UXGA, etc.
Casos de Uso Práticos
Sistema de Monitoramento Básico
import esp_cam as cam
import time
import network
def capturar_periodicamente():
cam.setup(0, format=cam.JPG, memory=cam.PSRAM)
while True:
dados = cam.snapshot()
nome_arq = f"foto_{int(time.time())}.jpg"
with open(nome_arq, "wb") as arq:
arq.write(dados)
time.sleep(15)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("ssid_wifi", "senha_wifi")
capturar_periodicamente()
Gatilho para Captura por Evento
import esp_cam as cam
import machine
import time
cam.setup(0, format=cam.JPG, memory=cam.PSRAM)
pino_gatilho = machine.Pin(4, machine.Pin.IN)
def handler_gatilho(pin):
img_data = cam.snapshot()
ts = time.time()
with open(f"evento_{ts}.jpg", "wb") as f:
f.write(img_data)
pino_gatilho.irq(trigger=machine.Pin.IRQ_RISING, handler=handler_gatilho)
Otimização e Configuração para Placas Específicas
Para placas como T-Camera Mini, ajuste os parâmetros de pinos na inicialização:
cam.setup(0, d0=5, d1=14, d2=4, d3=15, d4=18, d5=23, d6=36, d7=39,
format=cam.JPG, resolution=cam.RES_VGA,
xclk=cam.XCLK_20MHz, href=25, vsync=27, reset=-1,
sioc=12, siod=13, xclk_pin=32, pclk=19)
Recomenda-se usar clock de 10MHz para estabilidade e monitorar o uso de memória para evitar erros.
Solução de Problemas Comuns
Erro de memória insuficiente: Ative o PSRAM com memory=cam.PSRAM e reduza a resolução. Qualidade de imagem ruim: Ajuste o parâmetro de qualidade e verifique as conexões elétricas. Falha na inicialização: Confirme a compatibilidade da câmera (OV2640/OV7725) e os pinos configurados.
Compilação a Partir do Código Fonte
Para customização avançada, integre o driver ao build do MicroPython:
cd micropython/ports/esp32
make USER_C_MODULES=../../../../micropython-camera-driver/src/micropython.cmake BOARD=ESP32_CAM all
O firmwrae gerado estará no diretório build-ESP32_CAM/.