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

คลาส RGBDisplay ขับเคลื่อนจอ LCD RGB แบบขนาน 24 บิต ผ่านตัวควบคุม LTDC (LCD-TFT) ของ STM32 โดย LTDC จะส่งพิกเซลโดยตรงจากบัฟเฟอร์เฟรมที่อยู่บน SDRAM ตามความถี่พิกเซลที่กำหนด ทำให้อัตราการรีเฟรชสูง (สูงสุด 120 Hz) โดยไม่ต้องใช้ CPU

บน OpenMV Cam Pure Thermal บัสขนาน 24 บิตเดียวกันยังเชื่อมต่อกับ TFP410 HDMI encoder บนบอร์ด ดังนั้นเอาต์พุต HDMI จึงขับเคลื่อนผ่านคลาสนี้ด้วย -- ใช้ display_on=False เพื่อปิดจอ LCD บนบอร์ดในขณะที่ยังส่งพิกเซลไปยัง encoder ต่อไป

ความละเอียดของแผง LCD เลือกผ่าน framesize โดยใช้ค่าคงที่ที่กำหนดในโมดูล display (QVGA, VGA, WVGA, HD, FHD, ...) ลำดับการเริ่มต้นของแผงเฉพาะจะถูกกำหนดผ่านอาร์กิวเมนต์คีย์เวิร์ด controller (เช่น ST7701 สำหรับแผงที่ใช้ ST7701) ความสว่างของแบ็คไลท์ถูกควบคุมเป็น GPIO แบบเรียบง่ายตามค่าเริ่มต้น หรือผ่าน DACBacklight / PWMBacklight หากมีการส่งค่าเป็น backlight

เฟรมจะแสดงโดยการเรียก write() พร้อมกับ image.Image โดยไดรเวอร์จะจัดการการแปลง RGB การปรับขนาด ROI พาเลตต์ และการแปลงทิศทางภายใน

ตัวอย่าง -- ส่งภาพจากกล้องไปยังแผง 480x272 ที่ 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)

ตัวสร้าง

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 ความละเอียดมาตรฐานที่รองรับหนึ่งรายการ (ดูค่าคงที่ในโมดูล display)

refresh กำหนดอัตราการรีเฟรชหน้าจอเป็นเฮิร์ตซ์ (30-120) ค่านี้ควบคุมความถี่พิกเซลของ RGB LCD

display_on เปิดใช้งานเอาต์พุต LCD ในเครื่อง ส่ง False บน OpenMV Cam Pure Thermal ซึ่งบัสขนาน 24 บิตขับเคลื่อนทั้งจอ LCD บนบอร์ดและ TFP410 HDMI encoder -- ค่านี้จะทำให้จอ LCD บนบอร์ดดับขณะที่ยังส่งข้อมูลให้ HDMI encoder บนบอร์ดอื่นๆ ของ OpenMV Cam ไม่มีเอาต์พุตร่วม และสามารถปล่อยให้เป็นค่าเริ่มต้นได้

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

portrait สลับความกว้างและความสูงของ framesize

controller ส่งอินสแตนซ์คลาสชิปควบคุมเพื่อเริ่มต้นพร้อมกับจอแสดงผล

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

deinit() None

คืนทรัพยากรพินอินพุต/เอาต์พุตและ RAM ที่ใช้โดยคลาส ฟังก์ชันนี้จะถูกเรียกโดยอัตโนมัติเมื่อถูกทำลาย

width() int

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

height() int

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

triple_buffer() bool

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

bgr() bool

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

byte_swap() bool

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

framesize() int

คืนค่าคงที่ framesize ที่ใช้ตั้งค่าจอแสดงผล

refresh() int

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

clear(display_off: bool = False) None

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

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

backlight(value: int | None = None) int

กำหนดค่าการหรี่แบ็คไลท์ LCD ตั้งแต่ 0 (ปิด) ถึง 100 (เต็มที่) ส่งโดยไม่มีอาร์กิวเมนต์เพื่อดูค่าแบ็คไลท์ปัจจุบัน

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

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

แสดงภาพ image โดยมีมุมซ้ายบนเริ่มต้นที่ตำแหน่ง x, y สามารถส่งสตริงเส้นทางแทนออบเจ็กต์ภาพเพื่อโหลดภาพจากดิสก์โดยอัตโนมัติ

x_scale ควบคุมขนาดการปรับสเกลของภาพที่แสดงในทิศทาง x หากค่านี้เป็นลบ ภาพจะถูกพลิกในแนวนอน หาก y_scale ไม่ได้ระบุ จะตรงกับ x_scale เพื่อรักษาอัตราส่วนภาพ

y_scale ควบคุมขนาดการปรับสเกลของภาพที่แสดงในทิศทาง y หากค่านี้เป็นลบ ภาพจะถูกพลิกในแนวตั้ง (ต้องการการบัฟเฟอร์สามชั้น) หาก x_scale ไม่ได้ระบุ จะตรงกับ y_scale เพื่อรักษาอัตราส่วนภาพ

roi คือ tuple สี่เหลี่ยมผลประโยชน์ (x, y, w, h) ของภาพที่ต้องการแสดง

rgb_channel คือช่อง RGB (0=R, 1=G, 2=B) ที่จะดึงออกจากภาพ RGB565 และแสดงผลในระดับสีเทา -1 ปิดใช้งานการดึงช่องสี

alpha ควบคุมความทึบแสงของภาพ ตั้งแต่ 0 (โปร่งใสสมบูรณ์ / ดำ) ถึง 255 (ทึบแสง)

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

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

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

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

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

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

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