คลาส SPIDisplay -- ไดรเวอร์จอแสดงผล SPI

คลาส SPIDisplay ขับเคลื่อนแผง TFT และ OLED ขนาดเล็กที่เชื่อมต่อผ่าน SPI -- ที่พบบ่อยที่สุดคือ SSD1351 128x160 RGB OLED บน OpenMV LCD Shield ไดรเวอร์เป็นเจ้าของบัส SPI และสาย GPIO chip-select / DC ภายใน ดังนั้นผู้เรียกใช้เพียงแค่กำหนดค่าขนาดแผง อัตราการรีเฟรช และแฟล็กทิศทางต่างๆ การเริ่มต้นเฉพาะแผง (ลำดับรีจิสเตอร์ การจัดเฟรมการเขียน RAM) จะถูกกำหนดผ่านอาร์กิวเมนต์คีย์เวิร์ด controller -- ส่งอินสแตนซ์ SSD1351 เพื่อขับเคลื่อน LCD Shield หรือนำคลาสควบคุมของคุณเองมาใช้กับแผงอื่นๆ

เฟรมจะแสดงโดยการเรียก write() พร้อมกับ image.Image ไดรเวอร์จะแปลงต้นฉบับเป็น RGB565 และใช้การปรับขนาด ROI พาเลตต์ และการแปลงทิศทางภายใน ดังนั้นผู้เรียกใช้ไม่จำเป็นต้องปรับขนาดภาพล่วงหน้า ความสว่างของแบ็คไลท์สามารถปล่อยให้เป็น GPIO เปิด/ปิดเรียบง่าย (ค่าเริ่มต้น) หรือขับเคลื่อนด้วย DACBacklight / PWMBacklight โดยส่งค่าเป็นอาร์กิวเมนต์คีย์เวิร์ด backlight

ตัวอย่าง -- ส่งภาพจากกล้องไปยัง SSD1351 OLED ของ OpenMV LCD Shield:

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())

ตัวสร้าง

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 ความกว้างของ SPI LCD เป็นพิกเซล (1..32767)

height ความสูงของ SPI LCD เป็นพิกเซล (1..32767)

refresh อัตราการรีเฟรช LCD เป็นเฮิร์ตซ์ (1..120) ควบคุมอัตราสัญญาณนาฬิกา SPI

bgr ตั้งค่าเป็น True เพื่อสลับช่องสีแดงและสีน้ำเงิน

byte_swap ตั้งค่าเป็น True เพื่อสลับไบต์พิกเซล RGB565 ที่ส่งไปยัง LCD

hmirror ตั้งค่าเป็น True เพื่อพลิกเอาต์พุตจอแสดงผลในแนวนอน

vflip ตั้งค่าเป็น True เพื่อพลิกเอาต์พุตจอแสดงผลในแนวตั้ง

triple_buffer ถ้าเป็น True จะทำให้การอัปเดตหน้าจอไม่บล็อก แต่แลกด้วยการใช้ RAM 3 เท่าของขนาดจอแสดงผล ค่าเริ่มต้นขึ้นอยู่กับบอร์ด (เปิดใช้งานสำหรับบอร์ดที่มี SDRAM)

controller คีย์เวิร์ดเท่านั้น ส่งอินสแตนซ์คลาสชิปควบคุมเพื่อเริ่มต้นพร้อมกับจอแสดงผล เมื่อระบุ จะเรียกใช้เมธอด init, display_on, display_off และ ram_write (ถ้ามี) ของตัวควบคุมแทนคำสั่งที่มีอยู่ภายใน

backlight คีย์เวิร์ดเท่านั้น ส่งโมดูลควบคุมแบ็คไลท์ที่ต้องการใช้ ตามค่าเริ่มต้น แบ็คไลท์จะถูกควบคุมผ่านพิน GPIO

width() int

คืนค่าความกว้างของหน้าจอ

height() int

คืนค่าความสูงของหน้าจอ

refresh() int

คืนค่าอัตราการรีเฟรช

bgr() bool

คืนค่าว่าช่องสีแดงและสีน้ำเงินถูกสลับหรือไม่

byte_swap() bool

คืนค่าว่าไบต์พิกเซล RGB565 ถูกส่งในลำดับกลับหรือไม่

triple_buffer() bool

คืนค่าว่าเปิดใช้งานการบัฟเฟอร์สามชั้นหรือไม่

framesize() int

คืนค่าตัวระบุ framesize ที่ตั้งค่าไว้

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

แสดง image โดยมีมุมซ้ายบนที่ (x, y) สามารถส่งสตริงเส้นทางแทนภาพเพื่อโหลดและวาดในขั้นตอนเดียว

x_scale ตัวคูณสเกลแนวแกน x ค่าลบจะพลิกในแนวนอน หาก y_scale ถูกละไว้ จะตามค่า x_scale เพื่อรักษาอัตราส่วนภาพ

y_scale ตัวคูณสเกลแนวแกน y ค่าลบจะพลิกในแนวตั้ง (ต้องการ triple_buffer=True) หาก x_scale ถูกละไว้ จะตามค่า y_scale

roi สี่เหลี่ยมบริเวณที่สนใจ (x, y, w, h) ของภาพต้นฉบับที่จะวาด

rgb_channel ช่อง RGB ที่จะดึงออกจากภาพต้นฉบับ RGB565 (0=R, 1=G, 2=B, -1=ทั้งหมด) ช่วง: -1..2

alpha ความทึบแสงของภาพ 0 คือโปร่งใสสมบูรณ์ (ดำ) 255 คือทึบแสง ช่วง: 0..255

color_palette enum พาเลตต์สี (เช่น image.PALETTE_RAINBOW) หรือภาพ RGB565 ขนาด 256 พิกเซลที่ใช้เป็นตารางค้นหาสีบนค่าระดับสีเทาของต้นฉบับ ใช้งานหลังจากการดึงด้วย rgb_channel

alpha_palette ภาพ grayscale ขนาด 256 พิกเซลที่ใช้เป็นตารางค้นหาค่า alpha ต่อพิกเซลในการปรับ alpha ตามค่าระดับสีเทาของต้นฉบับ

hint การ OR แบบลอจิคัลของแฟล็ก:

  • image.AREA: ใช้การปรับขนาดแบบ area เมื่อลดขนาด

  • image.BILINEAR: ใช้การปรับขนาดแบบ bilinear

  • image.BICUBIC: ใช้การปรับขนาดแบบ bicubic

  • image.CENTER: จัดกึ่งกลางภาพบนจอแสดงผล (หลังจากการปรับขนาด)

  • image.HMIRROR: พลิกภาพในแนวนอน

  • image.VFLIP: พลิกภาพในแนวตั้ง

  • image.TRANSPOSE: สับเปลี่ยนภาพ (สลับ x/y)

  • image.EXTRACT_RGB_CHANNEL_FIRST: ใช้การดึงช่องสีด้วย rgb_channel ก่อนการปรับขนาด

  • image.APPLY_COLOR_PALETTE_FIRST: ใช้ color_palette ก่อนการปรับขนาด

  • image.SCALE_ASPECT_KEEP: ปรับขนาดให้พอดีภายในจอแสดงผล

  • image.SCALE_ASPECT_EXPAND: ปรับขนาดให้เต็มจอแสดงผล (ตัดส่วนเกิน)

  • image.SCALE_ASPECT_IGNORE: ปรับขนาดให้เต็มจอแสดงผล (ยืดภาพ)

  • image.ROTATE_90: หมุน 90 องศา (VFLIP | TRANSPOSE)

  • image.ROTATE_180: หมุน 180 องศา (HMIRROR | VFLIP)

  • image.ROTATE_270: หมุน 270 องศา (HMIRROR | TRANSPOSE)

clear(display_off: bool = False) None

ล้างหน้าจอ LCD เป็นสีดำ

display_off ถ้าเป็น True จะปิดลอจิกของจอแสดงผลแทนที่จะล้างบัฟเฟอร์เฟรม ควรปิดแบ็คไลท์ด้วยหลังจากนั้น

backlight(value: int | None = None) int | None

เมื่อส่ง value จะกำหนดความเข้มของแบ็คไลท์ (0=ปิด..100=เต็มที่) เมื่อไม่มีอาร์กิวเมนต์ จะคืนค่าแบ็คไลท์ปัจจุบัน

หากไม่มีการส่งตัวควบคุม DACBacklight หรือ PWMBacklight ตอนสร้าง แบ็คไลท์จะถูกขับเคลื่อนเป็นพิน GPIO และเปลี่ยนแปลงได้เพียงจาก 0 (ปิด) เป็นค่าไม่เป็นศูนย์ (เปิด)

bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None

ส่ง cmd ไปยังจอแสดงผลผ่านบัส SPI โดยอาจตามด้วย args (ไบต์จำนวนเต็มหรือบัฟเฟอร์ไบต์) dcs เลือกการจัดเฟรม DCS เมื่อตัวควบคุมรองรับ

bus_read(cmd: int, len: int, args: int | bytes | None = None, *, dcs: bool = False) bytearray

ส่ง cmd ผ่านบัส SPI และอ่าน len ไบต์กลับมา คืนค่าเป็น bytearray args จะถูกเขียนก่อนการอ่านตามตัวเลือก (ไบต์จำนวนเต็มหรือบัฟเฟอร์ไบต์) dcs เลือกการจัดเฟรม DCS เมื่อตัวควบคุมรองรับ

ioctl(cmd: int, arg: object | None = None) object

ส่ง ioctl cmd เฉพาะของตัวควบคุมพร้อม arg ที่เป็นตัวเลือก โยน ValueError หากจอแสดงผลพื้นฐานไม่รองรับ ioctl