🛠 MicroPython + machine vision : le firmware OpenMV sur un cœur, C++ sur l'autre
Objetivos
La Portenta H7 es también una placa de visión embebida: la vía oficial de MicroPython pasa por el firmware OpenMV, y la placa dispone de un conector de cámara CSI (la Vision Shield añade un micrófono y sensores). Vas a capturar imágenes en MicroPython, entender que el firmware OpenMV coexiste con el modelo de doble núcleo — un núcleo puede ejecutar el intérprete MicroPython/JavaScript mientras el otro mantiene código Arduino compilado, conectados mediante RPC. Es la puerta de entrada hacia TensorFlow Lite y los tutoriales de cámara oficiales (getting-started-openmv-micropython, openmv-cheat-sheet).
Material
- 1 × Arduino Portenta H7 + cable USB-C de datos
- 1 × cámara compatible en el conector CSI, o Portenta Vision Shield (sensores tipo Himax HM01B0 / GC2145 admitidos por las librerías
Camera,Arduino_H7_Video,Himax_HM01B0,OV7670) - Firmware OpenMV para Portenta (tutorial oficial
getting-started-openmv-micropython) - OpenMV IDE (o consola REPL MicroPython)
Código completo
# vision_openmv.py — OpenMV MicroPython sur Portenta H7
import sensor, image, time
sensor.reset # init camera sur le connecteur CSI
sensor.set_pixformat(sensor.RGB565) # couleur 16 bits
sensor.set_framesize(sensor.QVGA) # 320x240
sensor.skip_frames(time=2000) # laisse l'expo se stabiliser
clock = time.clock # horo FPS facon OpenMV
while True:
clock.tick
img = sensor.snapshot # une trame en memoire
# brique de base de la vision : trouver les blobs lumineux
for b in img.find_blobs([(0, 100, 0, 100, 0, 100)],
pixels_threshold=200):
img.draw_rectangle(b[0:4], color=(255, 0, 0))
print("fps %.1f" % clock.fps)
# >
# (forme de retour de find_blobs notamment) — la page cheat-sheet est
# JS-renderée et n'a pas pu etre verifiee ; teste dans l'OpenMV IDE.
Verificación esperada
El OpenMV IDE muestra el flujo de la cámara en directo con los rectángulos de detección, y los FPS se muestran en la consola del script. El pipeline de hardware detrás es el del STM32H747: el acelerador gráfico Chrom-ART (DMA2D) y el codificador JPEG dedicados — los mismos que el tutorial oficial de GUI LVGL que controla un monitor en DisplayPort sobre USB-C.
Errores frecuentes
- Buscar MicroPython «estándar» para Portenta: la vía oficial documentada es el firmware OpenMV; un firmware MicroPython genérico de otra placa no funcionará.
- Olvidar
skip_frames: los dos primeros segundos están sobreexpuestos mientras se ajustan el enfoque automático/exposición — tus umbrales de blobs parecerán aleatorios. - Cámara al revés o cable plano CSI mal insertado: imagen negra o corrupta sin mensaje de error explícito.
- Sobrescribir el firmware OpenMV con un sketch Arduino sin plan de retorno: mantén los dos flujos de trabajo separados (re-flasheo del core Mbed por un lado, del firmware OpenMV por el otro) — el doble toque en RESET + flasheo permite cambiar de uno a otro.
- Creer que el núcleo MicroPython está aislado: el interés del doble núcleo es acoplar MicroPython (visión, prototipado) y C++ en tiempo real (control) mediante RPC — consulta el tutorial de doble núcleo en el lado C++.
- >
- Para el reconocimiento de voz, el ecosistema empuja más bien el Syntiant NDP101/120 de la Vision Shield (librerías
syntiant_ilib/NDP, tutorialspeech-recognition-engine) que MicroPython.
Otros tutoriales para esta placa
- Premier programme : installer le core et faire clignoter la LED (M7 à 480 MHz !)
- Se connecter au Wi-Fi avec le module Murata 1DX (station WPA2)
- Apprivoiser les connecteurs 80 broches : bouton, LED et entrée analogique
- Dual-core M7 ↔ M4 : appels de fonctions distants avec la bibliothèque RPC
- Client HTTPS/TLS : interroger une API sécurisée via le Murata 1DX
- Serveur web sur le port Ethernet 10/100 embarqué
Ejemplos de código para esta placa
clignotante.inoArduinobouton-poussoir.inoArduinopwm-respiration.inoArduinoentree-analogique.inoArduinomulti-uart.inoArduinocapteur-i2c-bmp280.inoArduino