třída SPIDisplay – ovladač SPI displeje¶
Třída SPIDisplay řídí malé TFT a OLED panely připojené přes SPI – nejčastěji SSD1351 128x160 RGB OLED na OpenMV LCD Shieldu. Ovladač si interně spravuje sběrnici SPI a GPIO linky chip-select / DC, takže volající konfigurují pouze geometrii panelu, obnovovací frekvenci a případné příznaky orientace. Inicializace specifická pro daný panel (sekvence registrů, rámcování zápisu do RAM) se dodává přes klíčový argument controller – pro řízení LCD Shieldu předejte instanci SSD1351, nebo pro jiné panely implementujte vlastní třídu řadiče.
Snímky se zobrazují voláním write() s objektem image.Image. Ovladač interně převede zdroj na RGB565 a aplikuje škálování, ROI, paletu a transformace orientace, takže volající nemusí obraz předem upravovat na správnou velikost. Jas podsvícení lze ponechat jako jednoduchý zapni/vypni GPIO (výchozí), nebo jej řídit pomocí DACBacklight / PWMBacklight předáním jednoho z nich jako klíčový argument backlight.
Příklad – zrcadlení kamery na SSD1351 OLED OpenMV LCD Shieldu:
import csi
import display
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize((128, 160)) # matches the SSD1351 panel
lcd = display.SPIDisplay(controller=display.SSD1351())
while True:
lcd.write(csi0.snapshot())
Konstruktory¶
- class display.SPIDisplay(width: int = 128, height: int = 160, refresh: int = 60, bgr: bool = False, byte_swap: bool = False, hmirror: bool = True, vflip: bool = True, triple_buffer: bool | None = None, *, controller: object | None = None, backlight: object | None = None)¶
widthŠířka SPI LCD v pixelech (1..32767).heightVýška SPI LCD v pixelech (1..32767).refreshObnovovací frekvence LCD v hertzech (1..120). Řídí frekvenci hodin SPI.bgrnastavte na True pro prohození červeného a modrého kanálu.byte_swapnastavte na True pro prohození bajtů pixelů RGB565 odesílaných na LCD.hmirrornastavte na True pro horizontální zrcadlení výstupu displeje.vflipnastavte na True pro vertikální překlopení výstupu displeje.triple_bufferpokud je True, učiní aktualizace obrazovky neblokujícími za cenu trojnásobku velikosti displeje v RAM. Výchozí hodnota závisí na desce (zapnuto u desek se SDRAM).controllerpouze jako klíčový argument. Předejte instanci třídy řadicího čipu, která se inicializuje spolu s displejem. Pokud je poskytnut, jsou namísto vestavěných příkazů volány metody řadičeinit,display_on,display_offaram_write(jsou-li přítomny).backlightpouze jako klíčový argument. Předejte modul řadiče podsvícení, který se má použít. Ve výchozím nastavení je podsvícení řízeno pomocí GPIO pinu.- 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: int | image.Image | None = None, alpha_palette: image.Image | None = None, hint: int = 0) None¶
Zobrazí
images levým horním rohem na pozici(x, y). Místo obrazu lze předat řetězec s cestou, čímž se obraz v jednom kroku načte a vykreslí.x_scaleměřítko ve směru osy x. Záporné hodnoty překlápějí horizontálně. Pokud jey_scalevynecháno, řídí sex_scalepro zachování poměru stran.y_scaleměřítko ve směru osy y. Záporné hodnoty překlápějí vertikálně (vyžadujetriple_buffer=True). Pokud jex_scalevynecháno, řídí sey_scale.roiobdélník oblasti zájmu(x, y, w, h)zdrojového obrazu, který se má vykreslit.rgb_channelRGB kanál, který se má extrahovat ze zdrojového obrazu RGB565 (0=R, 1=G, 2=B, -1=vše). Rozsah: -1..2.alphaneprůhlednost obrazu. 0 je zcela průhledný (černý), 255 je neprůhledný. Rozsah: 0..255.color_paletteenum barevné palety (např.image.PALETTE_RAINBOW) nebo obraz RGB565 o 256 pixelech používaný jako vyhledávací tabulka barev nad hodnotou stupně šedi zdroje. Aplikuje se po extrakcirgb_channel.alpha_paletteobraz ve stupních šedi o 256 pixelech používaný jako vyhledávací tabulka alfy pro jednotlivé pixely, která modulujealphana základě hodnoty stupně šedi zdroje.hintlogický součet (OR) příznaků:image.AREA: Při zmenšování použít plošné škálování.image.BILINEAR: Použít bilineární škálování.image.BICUBIC: Použít bikubické škálování.image.CENTER: Vycentrovat obraz na displeji (po škálování).image.HMIRROR: Horizontálně zrcadlit obraz.image.VFLIP: Vertikálně překlopit obraz.image.TRANSPOSE: Transponovat obraz (prohodit x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Aplikovat extrakcirgb_channelpřed škálováním.image.APPLY_COLOR_PALETTE_FIRST: Aplikovatcolor_palettepřed škálováním.image.SCALE_ASPECT_KEEP: Škálovat tak, aby se vešel dovnitř displeje.image.SCALE_ASPECT_EXPAND: Škálovat tak, aby vyplnil displej (s oříznutím).image.SCALE_ASPECT_IGNORE: Škálovat tak, aby vyplnil displej (s roztažením).image.ROTATE_90: Otočit o 90 stupňů (VFLIP | TRANSPOSE).image.ROTATE_180: Otočit o 180 stupňů (HMIRROR | VFLIP).image.ROTATE_270: Otočit o 270 stupňů (HMIRROR | TRANSPOSE).
- clear(display_off: bool = False) None¶
Vymaže obrazovku LCD do černa.
display_offpokud je True, vypne logiku displeje namísto vymazání framebufferu. Poté by mělo být také vypnuto podsvícení.
- backlight(value: int | None = None) int | None¶
S argumentem
valuenastaví intenzitu podsvícení (0=vypnuto..100=plné). Bez argumentů vrátí aktuální hodnotu podsvícení.Pokud není při konstrukci předán řadič
DACBacklightneboPWMBacklight, je podsvícení řízeno jako GPIO pin a může nabývat pouze hodnoty 0 (vypnuto) nebo nenulové (zapnuto).
- bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None¶
Odešle
cmdna displej přes sběrnici SPI, volitelně následovanéargs(celočíselný bajt nebo buffer bajtů).dcsvolí rámcování DCS, pokud jej řadič podporuje.
- bus_read(cmd: int, len: int, args: int | bytes | None = None, *, dcs: bool = False) bytearray¶
Odešle
cmdpřes sběrnici SPI a načte zpětlenbajtů, které vrátí jakobytearray.argsse volitelně zapíše před čtením (celočíselný bajt nebo buffer bajtů).dcsvolí rámcování DCS, pokud jej řadič podporuje.