class RGBDisplay – Driver per display RGB

La classe RGBDisplay pilota LCD RGB paralleli a 24 bit attraverso il controller STM32 LTDC (LCD-TFT). L’LTDC trasmette i pixel direttamente da un framebuffer in SDRAM al pixel clock scelto, quindi sono possibili frequenze di aggiornamento elevate (fino a 120 Hz) senza coinvolgere la CPU.

Sulla OpenMV Cam Pure Thermal lo stesso bus parallelo a 24 bit alimenta anche un encoder HDMI TFP410 integrato, perciò anche la sua uscita HDMI è pilotata tramite questa classe – usa display_on=False per spegnere l’LCD integrato continuando comunque a inviare i pixel all’encoder.

La risoluzione del pannello viene selezionata tramite framesize usando le costanti definite nel modulo display (QVGA, VGA, WVGA, HD, FHD, …). Le sequenze di inizializzazione specifiche del pannello vengono inserite tramite l’argomento keyword controller (per esempio ST7701 per i pannelli basati su ST7701). La luminosità della retroilluminazione è pilotata per impostazione predefinita come un semplice GPIO, oppure tramite DACBacklight / PWMBacklight se ne viene passato uno come backlight.

I frame vengono presentati chiamando write() con un image.Image. Il driver gestisce internamente la conversione RGB, lo scaling, la ROI, la palette e le trasformazioni di orientamento.

Esempio – riproduce la camera su un pannello 480x272 a 60 Hz:

import csi
import display
import image

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)

lcd = display.RGBDisplay(framesize=display.FHVGA, refresh=60)

while True:
    lcd.write(csi0.snapshot(), hint=image.SCALE_ASPECT_KEEP)

Costruttori

class display.RGBDisplay(framesize: int = display.FWVGA, refresh: int = 60, display_on: bool = True, triple_buffer: bool = True, portrait: bool = False, controller: object | None = None, backlight: object | None = None)

framesize Una delle risoluzioni standard supportate (vedi le costanti del modulo display).

refresh Imposta la frequenza di aggiornamento dello schermo in hertz (30-120). Questo controlla il pixel clock dell’LCD RGB.

display_on Abilita l’uscita LCD locale. Passa False sulla OpenMV Cam Pure Thermal, il cui bus parallelo a 24 bit pilota sia l’LCD integrato sia l’encoder HDMI TFP410 – in questo modo l’LCD integrato resta spento mentre l’encoder HDMI continua a essere alimentato. Sulle altre OpenMV Cam non esiste un sink condiviso e questo parametro può essere lasciato al valore predefinito.

triple_buffer Se True, rende gli aggiornamenti dello schermo non bloccanti al costo di 3 volte la dimensione del display in RAM.

portrait Scambia la larghezza e l’altezza della framesize.

controller Passa un’istanza della classe del chip controller per inizializzarla insieme al display.

backlight Passa un’istanza del modulo controller della retroilluminazione da usare. Per impostazione predefinita la retroilluminazione viene controllata tramite un pin GPIO.

deinit() None

Rilascia i pin di I/O e la RAM usati dalla classe. Viene chiamato automaticamente alla distruzione.

width() int

Restituisce la larghezza dello schermo.

height() int

Restituisce l’altezza dello schermo.

triple_buffer() bool

Restituisce se il triple buffering è abilitato.

bgr() bool

Restituisce se i canali rosso e blu sono scambiati.

byte_swap() bool

Restituisce se i byte dei pixel RGB565 sono scambiati in uscita.

framesize() int

Restituisce la costante framesize con cui è stato configurato il display.

refresh() int

Restituisce la frequenza di aggiornamento.

clear(display_off: bool = False) None

Cancella lo schermo LCD portandolo a nero.

display_off se True, spegne la logica del display invece di cancellare il framebuffer a nero. Dovresti anche spegnere la retroilluminazione dopo questa operazione per assicurarti che lo schermo diventi nero, poiché molti display appaiono bianchi quando è accesa solo la retroilluminazione.

backlight(value: int | None = None) int

Imposta il valore di attenuazione della retroilluminazione dell’LCD, da 0 (spenta) a 100 (accesa). Non passare alcun argomento per ottenere il valore corrente della retroilluminazione.

A meno che non sia stato passato al costruttore un controller DACBacklight o PWMBacklight, la retroilluminazione viene controllata come un pin GPIO e potrà andare solo da 0 (spenta) a un valore diverso da zero (accesa).

write(image: image.Image, x: int = 0, y: int = 0, x_scale: float = 1.0, y_scale: float = 1.0, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 255, color_palette: image.Image | None = None, alpha_palette: image.Image | None = None, hint: int = 0) None

Visualizza un”image il cui angolo in alto a sinistra parte dalla posizione x, y. È possibile passare anche una stringa di percorso invece di un oggetto immagine per caricare automaticamente l’immagine dal disco.

x_scale controlla di quanto l’immagine visualizzata viene scalata nella direzione x. Se questo valore è negativo l’immagine verrà capovolta orizzontalmente. Se y_scale non è specificato corrisponderà a x_scale per mantenere le proporzioni.

y_scale controlla di quanto l’immagine visualizzata viene scalata nella direzione y. Se questo valore è negativo l’immagine verrà capovolta verticalmente (richiede il triple buffering). Se x_scale non è specificato corrisponderà a y_scale per mantenere le proporzioni.

roi è la tupla rettangolo della regione di interesse (x, y, w, h) dell’immagine da visualizzare.

rgb_channel è il canale RGB (0=R, 1=G, 2=B) da estrarre da un’immagine RGB565 e da rendere in scala di grigi. -1 disabilita l’estrazione del canale.

alpha controlla quanto è opaca l’immagine, da 0 (completamente trasparente / nero) a 255 (opaco).

color_palette un’immagine RGB565 di 256 pixel totali usata come tabella di lookup dei colori sul valore in scala di grigi dell’immagine di input. Applicata dopo l’estrazione di rgb_channel. Può anche essere un enum di palette (ad es. image.PALETTE_RAINBOW).

alpha_palette un’immagine GRAYSCALE di 256 pixel totali usata come tabella di lookup dell’alpha per pixel sul valore in scala di grigi dell’immagine di input. Applicata dopo l’estrazione di rgb_channel.

hint è un OR logico dei flag: