คลาส DSIDisplay -- ไดรเวอร์ดิสเพลย์ DSI¶
คลาส DSIDisplay ขับเคลื่อนแผง MIPI-DSI ผ่านตัวควบคุม DSI host ของ STM32 MIPI DSI เป็นโปรโตคอลดิสเพลย์แบบอนุกรมที่ใช้ lane clock หนึ่งเส้นบวก data lane หนึ่งเส้นขึ้นไปเป็น differential pair ทำให้สามารถส่งเนื้อหาความละเอียดสูง (สูงสุด 1080p) ด้วยสายน้อยกว่า RGB แบบขนาน 24 บิตมาก พิกเซลจะสตรีมโดยตรงจาก framebuffer ที่อยู่บน SDRAM ด้วยอัตราการรีเฟรชที่เลือก โดย CPU ไม่มีส่วนร่วมในการรีเฟรช
ความละเอียดของแผงเลือกผ่าน framesize โดยใช้ค่าคงที่ในโมดูล display (QVGA, VGA, HD, FHD, ...) ลำดับการเริ่มต้นเฉพาะแผงจะเชื่อมต่อผ่านอาร์กิวเมนต์ controller โดย ST7701 ครอบคลุมแผง DSI ที่ใช้ ST7701 ขนาด 480x800 ทั่วไป คำสั่ง DCS สามารถส่งออกนอกแบนด์ผ่าน bus_write() / bus_read() ความสว่างของแบ็คไลท์ขับเคลื่อนด้วย GPIO แบบง่ายโดยค่าเริ่มต้น หรือใช้ DACBacklight / PWMBacklight หากส่งเป็น backlight
เฟรมจะแสดงโดยเรียก write() ด้วย image.Image ไดรเวอร์จัดการการแปลง RGB การปรับขนาด ROI palette และการแปลงทิศทางภายใน
ตัวอย่าง -- สะท้อนภาพกล้องไปยังแผง DSI ที่ใช้ ST7701 ขนาด 480x800:
import csi
import display
import image
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
lcd = display.DSIDisplay(framesize=display.TFWVGA,
controller=display.ST7701())
while True:
lcd.write(csi0.snapshot(), hint=image.SCALE_ASPECT_KEEP)
คอนสตรักเตอร์¶
- class display.DSIDisplay(framesize: int = FWVGA, *, refresh: int = 60, display_on: bool = True, triple_buffer: bool = True, portrait: bool = False, channel: int = 0, controller: Any | None = None, backlight: Any | None = None)¶
framesizeความละเอียดมาตรฐานที่รองรับ (เช่นdisplay.FWVGA)refreshตั้งค่าอัตราการรีเฟรชหน้าจอในหน่วย hertz ช่วงที่ถูกต้องคือ 30 ถึง 120 ค่านี้ควบคุม DSI LCD clockdisplay_onเปิดใช้งานดิสเพลย์triple_bufferจัดสรร framebuffer สามตัวเพื่อให้การอัปเดตดิสเพลย์ไม่มี tear จำเป็นสำหรับการพลิกแนวตั้งในwrite()portraitสลับความกว้างและความสูงของ framesizechannelช่องสัญญาณ MIPI DSI เสมือนที่จะใช้สื่อสารกับดิสเพลย์controllerส่งคลาสชิปตัวควบคุมที่นี่เพื่อเริ่มต้นพร้อมกับดิสเพลย์ เช่นdisplay.ST7701()ซึ่งเป็นตัวควบคุมดิสเพลย์มาตรฐานสำหรับ MIPI DSIbacklightระบุโมดูลตัวควบคุมแบ็คไลท์ที่จะใช้ โดยค่าเริ่มต้นแบ็คไลท์จะควบคุมผ่านพิน GPIO- 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,yimageอาจเป็น path string แทนออบเจกต์ภาพเพื่อโหลดภาพจากดิสก์โดยอัตโนมัติ เช่นwrite("test.jpg")x_scaleควบคุมการปรับขนาดภาพในทิศทาง x (float) หากค่านี้เป็นลบภาพจะพลิกในแนวนอน หากไม่ระบุy_scaleจะใช้ค่าเดียวกับx_scaleเพื่อรักษาอัตราส่วนy_scaleควบคุมการปรับขนาดภาพในทิศทาง y (float) หากค่านี้เป็นลบภาพจะพลิกในแนวตั้ง การพลิกแนวตั้งต้องใช้triple_buffer=Trueหากไม่ระบุx_scaleจะใช้ค่าเดียวกับy_scaleroiคือ tuple สี่เหลี่ยมบริเวณที่สนใจ (ROI) (x, y, w, h) ของภาพที่จะแสดงrgb_channelคือช่องสัญญาณ RGB (0=R, 1=G, 2=B) ที่จะดึงจากภาพ RGB565 และแสดงบนดิสเพลย์ในระดับสีเทา-1ปิดการดึง ช่วงที่ถูกต้องคือ -1 ถึง 2alphaควบคุมความทึบของภาพ 255 แสดงภาพทึบ ค่าที่ต่ำกว่าจะผสมไปทางสีดำ และ 0 ทำให้ภาพดำสนิท ช่วงที่ถูกต้องคือ 0 ถึง 255color_paletteอาจเป็น enum ของ color palette หรือภาพ RGB565 ขนาด 256 พิกเซลที่ใช้เป็นตาราง color lookup จากค่า grayscale ของภาพอินพุต ใช้หลังจากดึงrgb_channelalpha_paletteอาจเป็นภาพ grayscale ขนาด 256 พิกเซลที่ใช้เป็นตาราง alpha lookup ที่ปรับalphaตามค่า grayscale ของพิกเซลอินพุต ใช้หลังจากดึงrgb_channelhintคือการ OR ตรรกะของแฟล็กต่อไปนี้:image.AREA: ใช้การปรับขนาดแบบพื้นที่เมื่อลดขนาด แทนค่าเริ่มต้นแบบ nearest neighborimage.BILINEAR: ใช้การปรับขนาดแบบ bilinear แทนค่าเริ่มต้นแบบ nearest neighborimage.BICUBIC: ใช้การปรับขนาดแบบ bicubic แทนค่าเริ่มต้นแบบ nearest neighborimage.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 framebuffer เป็นสีดำ
display_offหาก True จะปิดตรรกะดิสเพลย์แทนการล้าง framebuffer
- backlight(value: int | None = None) int¶
ตั้งค่าความสว่างของแบ็คไลท์ LCD จาก 0 (ปิด) ถึง 100 (เปิด) ส่งอาร์กิวเมนต์เปล่าเพื่อรับค่าแบ็คไลท์ปัจจุบัน
หากไม่ได้ส่งตัวควบคุม
DACBacklightหรือPWMBacklightให้กับคอนสตรักเตอร์ แบ็คไลท์จะถูกควบคุมเป็นพิน GPIO และจะเปลี่ยนได้แค่จาก 0 (ปิด) เป็นไม่ใช่ศูนย์ (เปิด) เท่านั้น
- bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None¶
ส่งคำสั่ง DSI
cmdไปยังดิสเพลย์argsคือ integer หรือ buffer ที่เป็นตัวเลือก สำหรับพารามิเตอร์คำสั่งdcsหาก True จะส่งคำสั่งเป็นแพ็คเก็ต DCS (Display Command Set)