v3.9.0

v3.9.0 è una release maggiore. Aggiunge il port nRF con l”Arduino Nano 33 BLE Sense (camera, modulo audio PDM, ulab, driver dei sensori congelati), introduce i sensori termici FLIR Lepton più MLX90641 / MLX90621 e un modulo fir profondamente rielaborato, gli ioctl di autofocus OV5640 e il nuovo tipo di streaming image.ImageIO. Il vecchio modulo CMSIS-NN nn e le vecchie classi ImageReader / ImageWriter sono stati rimossi: leggi le modifiche incompatibili qui sotto.

In evidenza

  • Arduino Nano 33 BLE Sense — nuovo port nRF52840 con camera, un modulo audio PDM, ulab e driver dei sensori congelati.

  • Termico — supporto FLIR Lepton, MLX90641 e MLX90621 con un modulo fir rielaborato (palette, mirroring, scaling, radiometria, FFC).

  • Autofocus OV5640 — nuovi ioctl sensor.IOCTL_*_AUTO_FOCUS.

  • image.ImageIO — un tipo di stream di immagini unificato (memoria o file; read/write/seek/size/close) che sostituisce ImageReader / ImageWriter.

  • Incompatibile: il modulo CMSIS-NN nn e image.ImageReader / image.ImageWriter sono stati rimossi e il comportamento di find_lines() / fir è cambiato — vedi le modifiche incompatibili.

Nuove funzionalità

  • Port nRF / Arduino Nano 33 BLE Sense — nuovo port nRF52840 e supporto della scheda, con un nuovo modulo audio (audio.init(), audio.start_streaming(), audio.stop_streaming()), ulab abilitato e driver dei sensori apds9960 / lps22h / lsm9ds1 / hts221 congelati.

  • image.ImageIO — un nuovo tipo di stream di immagini che supporta sia stream in memoria sia su file con read() / write() / seek() / size() / close(), più esempi ImageIO di lettura/scrittura/memoria.

  • FLIR Lepton — aggiunto il supporto FIR_LEPTON con fir.radiometric(), fir.trigger_ffc() e fir.register_vsync_cb().

  • Sensori termici — aggiunto il supporto MLX90641 (FIR_MLX90641) e termopila MLX90621 (driver ufficiali Melexis).

  • Palette / orientamento di fir — aggiunte le costanti fir.PALETTE_RAINBOW / PALETTE_IRONBOW / GRAYSCALE / RGB565 e fir.read_ir() accetta ora hmirror / vflip / transpose.

  • Autofocus OV5640 — aggiunti 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).

  • Riorganizzati gli esempi Arduino in directory per scheda.

Altre modifiche e miglioramenti

  • Passaggio a messaggi di errore MicroPython compressi (stringhe di eccezione più corte); l’argomento type di fir.init() viene ora rilevato automaticamente tramite una scansione del bus I2C quando omesso; l’eccezione xalloc riporta ora il numero di byte richiesti; UART 8 è stata abilitata sul Portenta; gli esempi FIR sono stati consolidati in thermal_camera.py / thermal_overlay.py / thermal_overlay_lcd.py. Per rientrare nella flash, image.get_similarity() e la selective search sono state disabilitate nella build dell’OpenMV 4, e la libreria image può ora essere compilata senza un filesystem (per schede prive di filesystem).

Correzioni di bug

Camera e sensori:

  • Corretto il calcolo del PCLK dell’OV5640, aggiunti i gestori IRQ I2C mancanti (correggendo i blocchi dei trasferimenti I2C), rielaborata la lettura/scrittura I2C del cambus per affidabilità, reso selezionabile il bus I2C del Lepton, spostati i pin di recupero del bus cambus alla config per scheda, ripetuta la scansione del cambus una volta prima di fallire e reso funzionante l’OpenMV PT (Lepton + camera con I2C condiviso).

Termico:

  • Corretto il calcolo del valore massimo in fir get_ir() / draw_ir() e image.get_similarity() (FLT_MIN-FLT_MAX), la gestione 12→16-bit dell’AMG8833 e l’accuratezza dell’MLX90621 (driver ufficiale Melexis).

Display, audio e sistema:

  • Spostati i trasferimenti dell’LCD SPI STM32 ai callback SPI dell’HAL (affidabilità del display), corretto audio.init() del Nano 33 (oscillatore HF + rapporto PDM affinché il microfono funzioni), lo stato del timer dell’H7 con il nuovo HAL, il gc_collect dell’nRF e l’init/deinit precoce della scheda, e smesso di stampare lo spurio messaggio «uh oh, no preference for overlapping detection» durante find_apriltags() / find_rects().

Supporto hardware e schede

  • Arduino Nano 33 BLE Sense — nuova scheda nRF52840 (camera, audio PDM, ulab, driver dei sensori congelati).

  • Sensori termici FLIR Lepton, MLX90641 e MLX90621.

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

  • Portenta — UART 8 abilitata.

Modifiche incompatibili dell’API

Rotture dell’API visibili all’utente tra la v3.8.0 e la v3.9.0. Ambito: moduli C Python in modules/ e librerie Python in scripts/libraries/.

Ogni modifica è contrassegnata dal suo impatto:

  • major — interessa la maggior parte degli script che usavano la funzionalità; dovrai portare il codice.

  • minor — API ristretta; interessa solo gli script che la usavano.

  • behavior — stessa API, risultati diversi; ricontrolla gli script calibrati.

Le modifiche sono raggruppate per impatto in quest’ordine. Se vuoi solo portare il tuo codice, vai direttamente alla checklist di migrazione in fondo. Ogni hash di commit rimanda al suo diff su GitHub.

Modulo CMSIS-NN nn rimosso (major)

Il modulo CMSIS-NN nn è stato rimosso, inclusi nn.load(), net.forward(), net.search() e l’helper nn_class. L’inferenza dei modelli passa al modulo TensorFlow Lite (tf). Gli script che caricavano modelli .network con nn devono essere portati a tf con un modello TensorFlow Lite.

Commit: fbc767b36

ImageReader / ImageWriter sostituiti da image.ImageIO (major)

image.ImageReader / image.ImageWriter e i loro metodi next_frame() / add_frame() sono stati rimossi e sostituiti con il nuovo tipo image.ImageIO, che supporta sia stream in memoria sia su file tramite read() / write() / seek() / size() / close(). Il codice che usa le vecchie classi reader/writer deve essere portato a image.ImageIO (vedi gli esempi rinominati imageio_read.py / imageio_write.py).

Commit: 783a78754

Keyword scale di fir.draw_ir() rimossa (minor)

fir.draw_ir() è stata riscritta sopra la nuova pipeline di disegno delle immagini. La keyword scale=(min, max) è stata rimossa, e sono stati aggiunti hint, x_scale, y_scale, roi e gli argomenti posizionali di offset x/y. Gli script che passavano scale=(min, max) a fir.draw_ir() devono eliminarla e usare i nuovi argomenti.

Commit: 0a29103b1

Approssimazione di find_lines() (behavior)

image.find_lines() approssima ora la magnitudo del gradiente come (abs(gx) + abs(gy)) / 2 e salta le magnitudo inferiori a 126. È più veloce ma cambia l’insieme delle linee rilevate e i valori dell’accumulatore, quindi ricontrolla e ricalibra threshold / theta_margin / rho_margin.

Commit: 902ae3c98

fir.snapshot() rielaborata (behavior)

fir.snapshot() è stata sostanzialmente rielaborata con una nuova API a keyword (hmirror, vflip, transpose, x_scale, y_scale, x_size, y_size, scale, rgb_channel, alpha, color_palette, hint, pixformat, copy_to_fb), e gli esempi inclusi sono stati riscritti. Il precedente comportamento posizionale / solo-pixformat è cambiato; porta gli script FIR alla nuova forma a keyword (vedi gli esempi aggiornati dello shield termopila).

Commit: 53f2248b8

fir.init() solleva un’eccezione in caso di fallimento (behavior)

fir.init() solleva ora un’eccezione (e de-inizializza in modo pulito) quando il sensore termico non viene rilevato, invece di proseguire silenziosamente. Avvolgi fir.init() in try / except (o assicurati che il sensore sia connesso) dove prima ti affidavi al fatto che non sollevasse eccezioni.

Commit: 4b2f972f3

Checklist di migrazione

Per un porting pulito alla v3.9.0 il lavoro tipico è:

  1. Portare l’inferenza dei modelli CMSIS-NN nn al modulo TensorFlow Lite tf (la rimozione di nn).

  2. Sostituire image.ImageReader / image.ImageWriter con image.ImageIO (la modifica di ImageIO).

  3. Eliminare la keyword scale=(min, max) da fir.draw_ir() e usare i nuovi argomenti (la modifica di draw_ir).

  4. Ricalibrare i parametri di find_lines() rispetto alla metrica di magnitudo approssimata (la modifica di find_lines).

  5. Portare gli script FIR alla nuova API a keyword di fir.snapshot() (la modifica di fir.snapshot) e gestire fir.init() che solleva un’eccezione in caso di sensore mancante (la modifica di fir.init).

Tutti gli altri script funzionano senza modifiche.