v3.9.0

v3.9.0 é uma versão principal. Adiciona o port nRF com o Arduino Nano 33 BLE Sense (câmara, módulo audio PDM, ulab, drivers de sensores congelados), traz os sensores térmicos FLIR Lepton e MLX90641 / MLX90621 e um módulo fir profundamente reformulado, ioctls de autofoco OV5640, e o novo tipo de streaming image.ImageIO. O módulo nn CMSIS-NN legado e as antigas classes ImageReader / ImageWriter foram removidos — leia as alterações incompatíveis abaixo.

Destaques

  • Arduino Nano 33 BLE Sense — novo port nRF52840 com câmara, um módulo audio PDM, ulab, e drivers de sensores congelados.

  • Térmico — suporte a FLIR Lepton, MLX90641, e MLX90621 com um módulo fir reformulado (paletas, espelhamento, escalonamento, radiometria, FFC).

  • Autofoco OV5640 — novos ioctls sensor.IOCTL_*_AUTO_FOCUS.

  • image.ImageIO — um tipo unificado de stream de imagem (memória ou ficheiro; leitura/escrita/seek/tamanho/fechar) que substitui ImageReader / ImageWriter.

  • Incompatível: o módulo nn CMSIS-NN e image.ImageReader / image.ImageWriter foram removidos, e o comportamento de find_lines() / fir foi alterado — consulte as alterações incompatíveis.

Novas funcionalidades

  • Port nRF / Arduino Nano 33 BLE Sense — novo port nRF52840 e suporte à placa, com um novo módulo audio (audio.init(), audio.start_streaming(), audio.stop_streaming()), ulab ativado, e drivers de sensores congelados apds9960 / lps22h / lsm9ds1 / hts221.

  • image.ImageIO — um novo tipo de stream de imagem com suporte a streams em memória e em ficheiro, com read() / write() / seek() / size() / close(), mais exemplos de leitura/escrita/memória com ImageIO.

  • FLIR Lepton — adicionado suporte a FIR_LEPTON com fir.radiometric(), fir.trigger_ffc(), e fir.register_vsync_cb().

  • Sensores térmicos — adicionado suporte ao MLX90641 (FIR_MLX90641) e ao termopilha MLX90621 (drivers oficiais Melexis).

  • Paletas / orientação do fir — adicionadas as constantes fir.PALETTE_RAINBOW / PALETTE_IRONBOW / GRAYSCALE / RGB565, e fir.read_ir() aceita agora hmirror / vflip / transpose.

  • Autofoco OV5640 — adicionados 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).

  • Reorganizados os exemplos do Arduino em diretórios por placa.

Outras alterações e melhorias

  • Mudança para mensagens de erro comprimidas do MicroPython (strings de exceção mais curtas); o argumento type do fir.init() deteta agora automaticamente via scan do barramento I2C quando omitido; a exceção xalloc reporta agora o número de bytes pedidos; o UART 8 foi ativado no Portenta; os exemplos FIR foram consolidados em thermal_camera.py / thermal_overlay.py / thermal_overlay_lcd.py. Para caber na flash, image.get_similarity() e a pesquisa seletiva foram desativadas na compilação do OpenMV 4, e a biblioteca de imagens pode agora ser compilada sem sistema de ficheiros (para placas sem sistema de ficheiros).

Correções de erros

Câmara e sensores:

  • Corrigido o cálculo do PCLK do OV5640, adicionados handlers de IRQ I2C em falta (corrigindo bloqueios em transferências I2C), remodelada a leitura/escrita I2C do cambus para maior fiabilidade, tornado o barramento I2C do Lepton selecionável, movidos os pinos de recuperação do barramento cambus para a configuração por placa, nova tentativa no scan do cambus antes de falhar, e funcionamento do OpenMV PT (Lepton + câmara com I2C partilhado).

Térmico:

  • Corrigido o cálculo do valor máximo em fir get_ir() / draw_ir() e image.get_similarity() (FLT_MIN-FLT_MAX), tratamento de 12→16 bits no AMG8833, e precisão do MLX90621 (driver oficial Melexis).

Ecrã, áudio e sistema:

  • Movidas as transferências do LCD SPI do STM32 para callbacks SPI do HAL (fiabilidade do ecrã), corrigido audio.init() no Nano 33 (oscilador HF + rácio PDM para o microfone funcionar), o estado do temporizador H7 com o novo HAL, gc_collect no nRF e inicialização/desinicialização antecipada da placa, e suprimida a impressão espúria da mensagem «uh oh, no preference for overlapping detection» durante find_apriltags() / find_rects().

Hardware e suporte a placas

  • Arduino Nano 33 BLE Sense — nova placa nRF52840 (câmara, áudio PDM, ulab, drivers de sensores congelados).

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

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

  • Portenta — UART 8 ativado.

Alterações incompatíveis na API

Alterações visíveis na API entre v3.8.0 e v3.9.0. Âmbito: módulos C Python em modules/ e bibliotecas Python em scripts/libraries/.

Cada alteração está marcada com o seu impacto:

  • maior — afeta a maioria dos scripts que usavam a funcionalidade; será necessário portar o código.

  • menor — API restrita; afeta apenas scripts que a utilizavam.

  • comportamento — mesma API, resultados diferentes; rever scripts ajustados.

As alterações estão agrupadas por impacto nessa ordem. Se pretende apenas portar o seu código, salte para a lista de verificação de migração no final. Cada hash de commit tem uma ligação para o seu diff no GitHub.

Módulo nn CMSIS-NN removido (maior)

O módulo nn CMSIS-NN foi removido, incluindo nn.load(), net.forward(), net.search(), e o auxiliar nn_class. A inferência de modelos passa para o módulo TensorFlow Lite (tf). Scripts que carregavam modelos .network com nn devem ser portados para tf com um modelo TensorFlow Lite.

Commits: fbc767b36

ImageReader / ImageWriter substituídos por image.ImageIO (maior)

image.ImageReader / image.ImageWriter e os seus métodos next_frame() / add_frame() foram removidos e substituídos pelo novo tipo image.ImageIO, que suporta streams em memória e em ficheiro através de read() / write() / seek() / size() / close(). O código que utilizava as antigas classes de leitura/escrita deve ser portado para image.ImageIO (consulte os exemplos renomeados imageio_read.py / imageio_write.py).

Commits: 783a78754

Palavra-chave scale de fir.draw_ir() removida (menor)

fir.draw_ir() foi reescrito sobre o novo pipeline de desenho de imagens. A palavra-chave scale=(min, max) foi removida, e foram adicionados argumentos hint, x_scale, y_scale, roi, e de deslocamento posicional x/y. Scripts que passavam scale=(min, max) a fir.draw_ir() devem remover esse argumento e usar os novos.

Commits: 0a29103b1

Aproximação em find_lines() (comportamento)

image.find_lines() aproxima agora a magnitude do gradiente como (abs(gx) + abs(gy)) / 2 e ignora magnitudes abaixo de 126. Isto é mais rápido mas altera o conjunto de linhas detetadas e os valores do acumulador, pelo que deve rever e reajustar threshold / theta_margin / rho_margin.

Commits: 902ae3c98

fir.snapshot() reformulado (comportamento)

fir.snapshot() foi substancialmente reformulado com uma nova API de palavras-chave (hmirror, vflip, transpose, x_scale, y_scale, x_size, y_size, scale, rgb_channel, alpha, color_palette, hint, pixformat, copy_to_fb), e os exemplos incluídos foram reescritos. O comportamento anterior posicional/apenas pixformat foi alterado; porte os scripts FIR para a nova forma com palavras-chave (consulte os exemplos atualizados do escudo termopilha).

Commits: 53f2248b8

fir.init() lança exceção em caso de falha (comportamento)

fir.init() lança agora uma exceção (e desinicializa de forma limpa) quando o sensor térmico não é detetado, em vez de continuar silenciosamente. Envolva fir.init() num bloco try / except (ou certifique-se de que o sensor está ligado) onde anteriormente dependia de não lançar exceção.

Commits: 4b2f972f3

Lista de verificação de migração

Para uma migração limpa para v3.9.0, o trabalho típico é:

  1. Porte a inferência de modelos nn CMSIS-NN para o módulo TensorFlow Lite tf (a remoção do nn).

  2. Substitua image.ImageReader / image.ImageWriter por image.ImageIO (a alteração do ImageIO).

  3. Remova a palavra-chave scale=(min, max) de fir.draw_ir() e use os novos argumentos (a alteração do draw_ir).

  4. Reajuste os parâmetros de find_lines() face à métrica de magnitude aproximada (a alteração do find_lines).

  5. Porte os scripts FIR para a nova API de palavras-chave de fir.snapshot() (a alteração do fir.snapshot) e trate a exceção de fir.init() para um sensor em falta (a alteração do fir.init).

Todos os outros scripts funcionam sem alterações.