camera_capture.ino
La cámara GC2145 de 2 MP de la Nicla Vision captura en QVGA escala de grises con la librería Camera del core: este sketch calcula el brillo medio de cada imagen: un ojo digital para seguir la luz de una sala o iniciar visión embebida (Edge Impulse).
Hardware
Una Arduino Nicla Vision (STM32H7 M7+M4, 23×23 mm) con cámara GC2145, IMU LSM6DSOX, micrófono PDM, ToF (VL53Lx), módulo ESP32 Wi-Fi/BLE y LED RGB (LEDR/G/B). La placa sola; el GC2145 va montado al frente con su conector FPC. 8 MB de PSRAM embarcados para las tramas.
Cableado
Sin cableado: la cámara está en el bus paralelo DCMI interno. Docs-db confirma GC2145 (no HM01B0, reservado a otras placas).
Funcionamiento
cam.begin(CAMERA_R320x240, GREYSCALE, 20) inicializa el sensor en 320×240 gris a ~20 fps; grabFrame rellena el búfer PSRAM; la media de los bytes grises da la luminancia, suficiente para un umbral día/noche.
Ejecución
Programación desde Arduino IDE (core ArduinoCore-mbed) por USB-C; librerías Camera, PDM, LSM6DSOX, WiFiNINA y ArduinoBLE.
Variantes
Pasar a RGB565 para color, enviar la trama en JPEG por el Wi-Fi NINA, o conectar un modelo TinyML (Edge Impulse) para reconocimiento de objetos.
camera_capture.ino
// Caméra GC2145 2 MP embarquée : capture QVGA noir & blanc,
// puis luminosité moyenne de l'image (détection jour/nuit).
// Bibliothèque Camera du core ArduinoCore-mbed (Nicla Vision).
#include "Camera.h"
#define LARGEUR 320
#define HAUTEUR 240
Camera cam;
uint8_t *image;
void setup() {
Serial.begin(115200);
if (!cam.begin(CAMERA_R320x240, GREYSCALE, 20)) {
Serial.println("Caméra GC2145 absente");
while (1) { ; }
}
image = (uint8_t *)psram::malloc(cam.frameSize());
}
void loop() {
if (cam.grabFrame(image) == 0) {
// Luminosité moyenne = moyenne des pixels gris 0-255
uint32_t somme = 0;
for (uint32_t i = 0; i < cam.frameSize(); i++) {
somme += image[i];
}
uint8_t moyenne = somme / cam.frameSize();
Serial.print("luminosite moyenne = ");
Serial.println(moyenne);
// image[] contient la trame brute : la traiter ou la transmettre
} else {
Serial.println("Capture échouée");
}
delay(1000);
}