camera_capture.ino
La caméra GC2145 2 MP de la Nicla Vision capture en QVGA noir et blanc via la bibliothèque Camera du core : ce sketch calcule la luminosité moyenne de chaque image — un œil numérique pour suivre la lumière d’une pièce ou amorcer une vision embarquée (Edge Impulse).
Matériel requis
Une Arduino Nicla Vision (STM32H7 double cœur M7+M4, 23×23 mm) avec caméra GC2145 2 MP, IMU LSM6DSOX, micro PDM, capteur ToF (famille VL53Lx), module sans fil ESP32 (Wi-Fi/BLE) et LED RGB (LEDR=23, LEDG=24, LEDB=25). La carte seule ; le capteur GC2145 est monté en façade avec son connecteur FPC. 8 Mo de PSRAM embarqués pour les trames.
Câblage
Aucun câblage : la caméra est sur le bus parallèle DCMI interne. La docs-db confirme GC2145 (et non HM01B0, réservé aux autres cartes).
Fonctionnement
cam.begin(CAMERA_R320x240, GREYSCALE, 20) initialise le capteur en 320×240 gris à ~20 fps ; grabFrame remplit le tampon PSRAM ; la moyenne des octets gris donne la luminance, suffisante pour un seuil jour/nuit.
Exécution
Programmation via Arduino IDE (core ArduinoCore-mbed, target NICLA_VISION) sur le port USB-C ; bibliothèques Camera, PDM, Arduino_LSM6DSOX, WiFiNINA et ArduinoBLE fournies.
Variantes
Passer en RGB565 pour la couleur, envoyer la trame en JPEG sur le Wi-Fi NINA, ou brancher un modèle TinyML (Edge Impulse) pour la reconnaissance d’objet.
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);
}