class RGBDisplay – מנהל התקן תצוגת RGB

המחלקה RGBDisplay מנהלת מסכי LCD מסוג RGB מקבילי 24 סיביות דרך בקר ה-LTDC (LCD-TFT) של STM32. ה-LTDC מזרים פיקסלים ישירות מתוך חוצץ פריימים (frame buffer) מגובה SDRAM בשעון הפיקסלים הנבחר, כך שניתן להגיע לקצבי רענון גבוהים (עד 120 Hz) ללא מעורבות של ה-CPU.

ב-OpenMV Cam Pure Thermal אותו אפיק RGB מקבילי 24 סיביות מזין גם מקודד HDMI מסוג TFP410 שעל הלוח, כך שגם יציאת ה-HDMI שלו מונעת דרך מחלקה זו – השתמשו ב-display_on=False כדי להחשיך את ה-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, שאפיק ה-RGB המקבילי 24 סיביות שלו מניע גם את ה-LCD שעל הלוח וגם את מקודד ה-HDMI מסוג TFP410 – כך נשמר ה-LCD שעל הלוח מוחשך תוך המשך הזנת מקודד ה-HDMI. ב-OpenMV Cam אחרות אין יעד משותף וניתן להשאיר ערך זה כברירת המחדל.

triple_buffer אם True, הופך עדכונים למסך ללא חוסמים במחיר של פי 3 מגודל התצוגה ב-RAM.

portrait מחליף בין רוחב לגובה של ה-framesize.

controller העבירו מופע של מחלקת שבב בקר כדי לאתחל אותו יחד עם התצוגה.

backlight העבירו מופע של מודול בקר תאורה אחורית לשימוש. כברירת מחדל התאורה האחורית תישלט באמצעות פין GPIO.

deinit() None

משחרר את פיני ה-I/O ואת ה-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, מכבה את לוגיקת התצוגה במקום לנקות את חוצץ הפריימים (frame buffer) לשחור. כדאי גם לכבות את התאורה האחורית לאחר מכן כדי להבטיח שהמסך יהפוך לשחור, שכן תצוגות רבות נראות לבנות כאשר רק התאורה האחורית דולקת.

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 היא רביעיית מלבן אזור העניין (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 פיקסלים בסך הכל המשמשת כטבלת חיפוש אלפא לכל פיקסל על ערך גווני האפור של תמונת הקלט. מוחל לאחר חילוץ rgb_channel.

hint הוא OR לוגי של הדגלים:

  • image.AREA: שימוש בקנה מידה לפי שטח בעת הקטנה במקום השכן הקרוב ביותר.

  • image.BILINEAR: שימוש בקנה מידה דו-קווי במקום השכן הקרוב ביותר.

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