🛠 MicroPython + machine vision : le firmware OpenMV sur un cœur, C++ sur l'autre
Objectifs
La Portenta H7 est aussi une carte de vision embarquée : la voie MicroPython officielle passe par le firmware OpenMV, et la carte dispose d'un connecteur caméra CSI (la Vision Shield ajoute un micro et des capteurs). Tu vas capturer des images en MicroPython, comprendre que le firmware OpenMV cohabite avec le modèle dual-core — un cœur peut faire tourner l'interpréteur MicroPython/JavaScript pendant que l'autre garde du code Arduino compilé, reliés par RPC. C'est la porte d'entrée vers TensorFlow Lite et les tutos caméra officiels (getting-started-openmv-micropython, openmv-cheat-sheet).
Matériel
- 1 × Arduino Portenta H7 + câble USB-C data
- 1 × caméra compatible sur le connecteur CSI, ou Portenta Vision Shield (capteurs type Himax HM01B0 / GC2145 supportés par les libs
Camera,Arduino_H7_Video,Himax_HM01B0,OV7670) - Firmware OpenMV pour Portenta (tuto officiel
getting-started-openmv-micropython) - OpenMV IDE (ou console REPL MicroPython)
Code complet
# 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 façon 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 être vérifiée ; teste dans l'OpenMV IDE.
Vérification attendue
L'OpenMV IDE affiche le flux caméra en direct avec les rectangles de détection, et le FPS défile dans le script console. Le pipeline matériel derrière est celui du STM32H747 : l'accélérateur graphique Chrom-ART (DMA2D) et le codeur JPEG dédiés — les mêmes que le tuto officiel GUI LVGL qui pilote un moniteur en DisplayPort sur l'USB-C.
Erreurs fréquentes
- Chercher MicroPython « standard » pour Portenta : la voie officielle documentée est le firmware OpenMV ; un firmware MicroPython générique d'une autre carte ne marchera pas.
- Oublier
skip_frames: les deux premières secondes sont surexposées le temps que l'autofocus/l'exposition se règlent — tes seuils de blobs paraîtront aléatoires. - Camera à l'envers ou nappe CSI mal insérée : image noire ou corrompue sans message d'erreur explicite.
- Écraser le firmware OpenMV avec un sketch Arduino sans plan de retour : garde les deux workflows séparés (re-flash du core Mbed d'un côté, du firmware OpenMV de l'autre) — le double-tap RESET + flash permet de repasser de l'un à l'autre.
- Croire le cœur MicroPython isolé : l'intérêt du dual-core est de coupler MicroPython (vision, prototypage) et C++ temps réel (commande) via RPC — vois le tuto dual-core côté C++.
- >
- Pour la reconnaissance vocale, l'écosystème pousse plutôt le Syntiant NDP101/120 de la Vision Shield (libs
syntiant_ilib/NDP, tutospeech-recognition-engine) que le MicroPython.
Autres tutoriels pour cette carte
- 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é
Exemples de code pour cette carte
clignotante.inoArduinobouton-poussoir.inoArduinopwm-respiration.inoArduinoentree-analogique.inoArduinomulti-uart.inoArduinocapteur-i2c-bmp280.inoArduino