v3.9.0

v3.9.0 es una versión importante. Añade el puerto nRF con la Arduino Nano 33 BLE Sense (cámara, módulo audio PDM, ulab, controladores de sensores congelados), incorpora los sensores térmicos FLIR Lepton más MLX90641 / MLX90621 y un módulo fir profundamente reelaborado, los ioctls de autoenfoque del OV5640, y el nuevo tipo de transmisión image.ImageIO. Se eliminaron el antiguo módulo CMSIS-NN nn y las antiguas clases ImageReader / ImageWriter — lee los cambios incompatibles a continuación.

Aspectos destacados

  • Arduino Nano 33 BLE Sense — nuevo puerto nRF52840 con cámara, un módulo audio PDM, ulab y controladores de sensores congelados.

  • Térmico — compatibilidad con FLIR Lepton, MLX90641 y MLX90621 con un módulo fir reelaborado (paletas, espejado, escalado, radiometría, FFC).

  • Autoenfoque del OV5640 — nuevos ioctls sensor.IOCTL_*_AUTO_FOCUS.

  • image.ImageIO — un tipo unificado de flujo de imágenes (memoria o archivo; read/write/seek/size/close) que reemplaza a ImageReader / ImageWriter.

  • Incompatible: se eliminaron el módulo CMSIS-NN nn y image.ImageReader / image.ImageWriter, y cambió el comportamiento de find_lines() / fir — consulta los cambios incompatibles.

Nuevas características

  • Puerto nRF / Arduino Nano 33 BLE Sense — nuevo puerto nRF52840 y compatibilidad con la placa, con un nuevo módulo audio (audio.init(), audio.start_streaming(), audio.stop_streaming()), ulab habilitado y controladores de sensores apds9960 / lps22h / lsm9ds1 / hts221 congelados.

  • image.ImageIO — un nuevo tipo de flujo de imágenes que admite tanto flujos en memoria como en archivo con read() / write() / seek() / size() / close(), más ejemplos de lectura/escritura/memoria de ImageIO.

  • FLIR Lepton — se añadió compatibilidad con FIR_LEPTON con fir.radiometric(), fir.trigger_ffc() y fir.register_vsync_cb().

  • Sensores térmicos — se añadió compatibilidad con el termopila MLX90641 (FIR_MLX90641) y MLX90621 (controladores oficiales de Melexis).

  • Paletas / orientación de fir — se añadieron las constantes fir.PALETTE_RAINBOW / PALETTE_IRONBOW / GRAYSCALE / RGB565, y fir.read_ir() ahora acepta hmirror / vflip / transpose.

  • Autoenfoque del OV5640 — se añadieron sensor.IOCTL_TRIGGER_AUTO_FOCUS / IOCTL_PAUSE_AUTO_FOCUS / IOCTL_RESET_AUTO_FOCUS / IOCTL_WAIT_ON_AUTO_FOCUS (OpenMV 2/3/4/4 Plus/PT/Portenta).

  • Se reorganizaron los ejemplos de Arduino en directorios por placa.

Otros cambios y mejoras

  • Se cambió a mensajes de error comprimidos de MicroPython (cadenas de excepción más cortas); el argumento type de fir.init() ahora se detecta automáticamente mediante un escaneo del bus I2C cuando se omite; la excepción xalloc ahora informa del número de bytes solicitados; se habilitó la UART 8 en la Portenta; los ejemplos de FIR se consolidaron en thermal_camera.py / thermal_overlay.py / thermal_overlay_lcd.py. Para caber en la memoria flash, se deshabilitaron image.get_similarity() y la búsqueda selectiva en la compilación del OpenMV 4, y la biblioteca de imágenes ahora se puede compilar sin un sistema de archivos (para placas sin sistema de archivos).

Corrección de errores

Cámara y sensores:

  • Se corrigió el cálculo del PCLK del OV5640, se añadieron los manejadores de IRQ I2C que faltaban (corrigiendo los bloqueos en las transferencias I2C), se reelaboró la lectura/escritura I2C del cambus para mayor fiabilidad, se hizo seleccionable el bus I2C del Lepton, se movieron los pines de recuperación del bus del cambus a la configuración por placa, se reintenta el escaneo del cambus una vez antes de fallar, y se logró que el OpenMV PT (Lepton + cámara con I2C compartido) funcionara.

Térmico:

  • Se corrigió el cálculo del valor máximo en fir get_ir() / draw_ir() y image.get_similarity() (FLT_MIN-FLT_MAX), el manejo de 12→16 bits del AMG8833, y la precisión del MLX90621 (controlador oficial de Melexis).

Pantalla, audio y sistema:

  • Se trasladaron las transferencias del LCD SPI del STM32 a funciones de retorno (callbacks) de la HAL SPI (fiabilidad de la pantalla), se corrigió audio.init() de la Nano 33 (oscilador HF + ratio PDM para que funcione el micrófono), el estado del temporizador del H7 con la nueva HAL, gc_collect del nRF y la inicialización/desinicialización temprana de la placa, y se dejó de imprimir el mensaje espurio «uh oh, no preference for overlapping detection» durante find_apriltags() / find_rects().

Hardware y compatibilidad de placas

  • Arduino Nano 33 BLE Sense — nueva placa nRF52840 (cámara, audio PDM, ulab, controladores de sensores congelados).

  • Sensores térmicos FLIR Lepton, MLX90641 y MLX90621.

  • Autoenfoque del OV5640 — OpenMV 2/3/4/4 Plus/PT/Portenta.

  • Portenta — UART 8 habilitada.

Cambios incompatibles en la API

Cambios en la API visibles para el usuario entre v3.8.0 y v3.9.0. Alcance: módulos C de Python en modules/ y bibliotecas de Python en scripts/libraries/.

Cada cambio está etiquetado con su impacto:

  • mayor — afecta a la mayoría de los scripts que usaban la característica; necesitarás portar código.

  • menor — API reducida; solo afecta a los scripts que la usaban.

  • comportamiento — misma API, resultados distintos; vuelve a revisar los scripts ajustados.

Los cambios se agrupan por impacto en ese orden. Si solo quieres portar tu código, salta a la lista de verificación de migración al final. Cada hash de commit enlaza a su diff en GitHub.

Módulo CMSIS-NN nn eliminado (mayor)

El módulo CMSIS-NN nn se eliminó, incluyendo nn.load(), net.forward(), net.search() y el auxiliar nn_class. La inferencia de modelos pasa al módulo de TensorFlow Lite (tf). Los scripts que cargaban modelos .network con nn deben portarse a tf con un modelo de TensorFlow Lite.

Commits: fbc767b36

ImageReader / ImageWriter reemplazados por image.ImageIO (mayor)

image.ImageReader / image.ImageWriter y sus métodos next_frame() / add_frame() se eliminaron y reemplazaron con el nuevo tipo image.ImageIO, que admite tanto flujos en memoria como en archivo a través de read() / write() / seek() / size() / close(). El código que usa las antiguas clases reader/writer debe portarse a image.ImageIO (consulta los ejemplos renombrados imageio_read.py / imageio_write.py).

Commits: 783a78754

Palabra clave scale de fir.draw_ir() eliminada (menor)

fir.draw_ir() se reescribió sobre el nuevo pipeline de dibujo de imágenes. La palabra clave scale=(min, max) se eliminó, y se añadieron los argumentos hint, x_scale, y_scale, roi y los desplazamientos posicionales x/y. Los scripts que pasaban scale=(min, max) a fir.draw_ir() deben omitirla y usar los nuevos argumentos.

Commits: 0a29103b1

Aproximación de find_lines() (comportamiento)

image.find_lines() ahora aproxima la magnitud del gradiente como (abs(gx) + abs(gy)) / 2 y omite las magnitudes por debajo de 126. Esto es más rápido pero cambia el conjunto de líneas detectadas y los valores del acumulador, así que vuelve a revisar y reajustar threshold / theta_margin / rho_margin.

Commits: 902ae3c98

fir.snapshot() reelaborado (comportamiento)

fir.snapshot() se reelaboró sustancialmente con una nueva API de palabras clave (hmirror, vflip, transpose, x_scale, y_scale, x_size, y_size, scale, rgb_channel, alpha, color_palette, hint, pixformat, copy_to_fb), y los ejemplos incluidos se reescribieron. El comportamiento anterior posicional/solo pixformat cambió; porta los scripts de FIR a la nueva forma de palabras clave (consulta los ejemplos actualizados del shield termopila).

Commits: 53f2248b8

fir.init() genera una excepción al fallar (comportamiento)

fir.init() ahora genera una excepción (y se desinicializa limpiamente) cuando no se detecta el sensor térmico, en lugar de continuar silenciosamente. Envuelve fir.init() en try / except (o asegúrate de que el sensor esté conectado) donde antes confiabas en que no generara una excepción.

Commits: 4b2f972f3

Lista de verificación de migración

Para una portación limpia a v3.9.0, el trabajo típico es:

  1. Porta la inferencia de modelos CMSIS-NN nn al módulo de TensorFlow Lite tf (la eliminación de nn).

  2. Reemplaza image.ImageReader / image.ImageWriter por image.ImageIO (el cambio de ImageIO).

  3. Omite la palabra clave scale=(min, max) de fir.draw_ir() y usa los nuevos argumentos (el cambio de draw_ir).

  4. Reajusta los parámetros de find_lines() contra la métrica de magnitud aproximada (el cambio de find_lines).

  5. Porta los scripts de FIR a la nueva API de palabras clave de fir.snapshot() (el cambio de fir.snapshot) y maneja que fir.init() genere una excepción ante un sensor ausente (el cambio de fir.init).

Todos los demás scripts se ejecutan sin cambios.