🛠 Diffuser des images JPEG depuis le Nicla Vision
Objectifs
Transformer les captures QVGA du Nicla Vision en images JPEG exploitables : soit par encodage logiciel embarqué, soit (recommandé) en streamant le RGB565 brut et en encodant le JPEG sur le PC hôte.
Matériel
- Arduino Nicla Vision + câble micro-USB
- Core ArduinoCore-mbed (bibliothèque Camera)
- PC avec Python (Pillow) ou le Processing CameraRawBytesVisualizer
- Pas d'encodeur JPEG matériel : la carte n'a ni GPU ni périphérique JPEG ; l'encodage embarqué est un défi logiciel sur le Cortex-M7 à 480 MHz
Code complet
// 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
}
Côté hôte, lire 4 octets de magic, puis 153600 octets, convertir RGB565 → RGB888, et img.save("frame.jpg", quality=85) pour obtenir un JPEG.
Vérification attendue
Le script hôte écrit ~15 JPEG/s dans un dossier ou les sert sur un port HTTP ; les images sont nettes en QVGA. Si des trames manquent, baisser les FPS caméra avant de toucher au débit série.
Erreurs fréquentes
- Encodage JPEG 100 % embarqué sans mesurer : un encodeur logiciel type TJpgEnc consomme CPU et RAM ; privilégier l'encodage côté PC pour du streaming fluide.
- Perte de synchronisation de trame : sans en-tête magic, le décalage d'un octet produit des images décalées ; toujours resynchroniser sur MAGIC.
- Endianness RGB565 : le GC2145 sort en RGB565 dont l'ordre des octets peut être inversé (bug #559) ; si les couleurs sont bleues/orangées, permuter les octets côté hôte.
- Baudrate irréaliste : 2 Mbaud CDC + 153600 o/trame ≈ 12 trames/s maximum théorique ; à 30 FPS le tampon déborde — d'où 15 FPS.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
led_rgb.inoArduinoimu_lsm6dsox.inoArduinotof_distance.inoArduinomicro_pdm.inoArduinocamera_capture.inoArduinowifi_scan.inoArduino