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