🛠 Diffuser des images JPEG depuis le Nicla Vision
Objetivos
Transformar las capturas QVGA del Nicla Vision en imágenes JPEG utilizables: ya sea mediante codificación de software integrada o (recomendado) transmitiendo el RGB565 sin procesar y codificando el JPEG en el PC anfitrión.
Material
- Arduino Nicla Vision + cable micro-USB
- Core ArduinoCore-mbed (biblioteca Camera)
- PC con Python (Pillow) o el Processing CameraRawBytesVisualizer
- Sin codificador JPEG por hardware: la placa no tiene GPU ni periférico JPEG; la codificación integrada es un desafío de software en el Cortex-M7 a 480 MHz
Código completo
// Trame RGB565 + en-tete binaire pour que l'hote encode le JPEG
// Hote Python : numpy + Pillow -> Image.frombytes("RGB", (320,240), data)
#include "camera.h"
#include "gc2145.h"
GC2145 galaxyCore;
Camera cam(galaxyCore);
FrameBuffer fb;
const uint8_t MAGIC[4] = {0xAA, 0x55, 0x01, 0x01}; // magic+version
void setup {
Serial.begin(2000000);
if (!cam.begin(CAMERA_R320x240, CAMERA_RGB565, 15)) { // 15 FPS = marge USB
pinMode(LED_BUILTIN, OUTPUT);
while (true) { digitalWrite(LED_BUILTIN, LOW); delay(100);
digitalWrite(LED_BUILTIN, HIGH); delay(100); }
}
}
void loop {
if (cam.grabFrame(fb, 3000) != 0) return;
Serial.write(MAGIC, 4); // synchronisation trame
Serial.write(fb.getBuffer, cam.frameSize); // 320*240*2 = 153600 o
}
En el lado del anfitrión, leer 4 bytes de magic, luego 153600 bytes, convertir RGB565 → RGB888, y img.save("frame.jpg", quality=85) para obtener un JPEG.
Verificación esperada
El script del anfitrión escribe ~15 JPEG/s en una carpeta o los sirve en un puerto HTTP; las imágenes son nítidas en QVGA. Si faltan tramas, reducir los FPS de la cámara antes de tocar el caudal serie.
Errores frecuentes
- Codificación JPEG 100 % integrada sin medir: un codificador de software tipo TJpgEnc (port Arduino, > SIN VERIFICAR: compatibilidad con STM32H7 no confirmada) consume CPU y RAM; privilegiar la codificación en el PC para un streaming fluido.
- Pérdida de sincronización de trama: sin cabecera magic, un desplazamiento de un byte produce imágenes desalineadas; siempre resincronizar sobre MAGIC.
- Endianness RGB565: el GC2145 emite RGB565 cuyo orden de bytes puede estar invertido (bug #559); si los colores son azules/anaranjados, permutar los bytes en el lado del anfitrión.
- Baudrate irreal: 2 Mbaud CDC + 153600 o/trama ≈ 12 tramas/s máximo teórico; a 30 FPS el búfer se desborda — de ahí los 15 FPS.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
led_rgb.inoArduinoimu_lsm6dsox.inoArduinotof_distance.inoArduinomicro_pdm.inoArduinocamera_capture.inoArduinowifi_scan.inoArduino