תוכן עניינים:
2025 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2025-01-13 06:57
מדריכים אלה מראים משהו על הפעלת וידאו ושמע עם ESP32.
שלב 1: תכונות ומגבלות ESP32
מאפיינים
- 4 אוטובוס SPI, 2 אוטובוס SPI זמין עבור מרחב משתמש, הם SPI2 ו- SPI3 או נקראים HSPI ו- VSPI. שני האוטובוסים SPI יכולים לפעול לכל היותר 80 מגה -הרץ. תיאורטית הוא יכול לדחוף 320x240 פיקסלים בצבע 16 סיביות ל- SPI LCD במהירות של 60 fps, אך הוא עדיין לא ספר את תקרת הזמן הנדרשת לקריאת ופענוח נתוני הווידאו.
- אוטובוס SD של 1 סיביות / 4 סיביות יכול לחבר כרטיס SD בפרוטוקול מקורי
- יציאת שמע DAC פנימית של I2S
- מעל 100 KB RAM זמין למאגר וידאו ושמע
- כוח עיבוד הוגן מספיק לפענוח JPEG (הפעלת Motion JPEG) ודחיסת נתוני LZW (הפעלת-g.webp" />
- גרסת ליבה כפולה יכולה לפצל נתוני קריאה מכרטיס SD, לפענח ולדחוף ל- SPI LCD למשימות מרובות במקביל ולהגביר את ביצועי ההפעלה
מגבלות
- אין מספיק זיכרון RAM פנימי בכדי שיהיה לו מאגר מסגרות כפול עבור 320x240 בצבע של 16 סיביות, הוא הגביל את עיצוב ריבוי המשימות. זה יכול להתגבר קצת עם PSRAM חיצוני למרות שהוא איטי יותר מ- RAM פנימי
- אין מספיק כוח עיבוד לפענוח וידאו mp4
- לא בכל גרסת ESP32 יש 2 ליבות, הדוגמא מרובת המשימות מרוויחה רק בגרסה כפולה
הפניה:
שלב 2: פורמט וידאו
RGB565
או שנקרא צבע 16 סיביות הוא פורמט נתונים גולמי הנפוץ בתקשורת בין MCU לתצוגת צבעים. כל פיקסל צבע המיוצג על ידי ערך 16 סיביות, הראשון של 5 סיביות הוא ערך אדום, אחרי 6 סיביות הוא ערך ירוק ולאחר מכן ערך כחול של 5 סיביות. ערך 16 סיביות יכול ליצור 65536 וריאציות צבע ולכן הוא נקרא גם 64K צבעים. אז גודל הדקה של 320x240@30 fps יהיה בגודל: 16 * 320 * 240 * 30 * 60 = 2211840000 סיביות = 276480000 בתים או מעל 260 מגה
זהו פורמט קובץ נפוץ באינטרנט מאז שנות התשעים. הוא מגביל את וריאציית הצבעים של כל מסך עד 256 צבעים ואל תחזור אחסן את הפיקסל באותו צבע כמו המסגרת הקודמת. אז זה יכול להקטין הרבה את גודל הקובץ, במיוחד כאשר כל מסגרת אנימציה לא תשנה יותר מדי פרטים. דחיסת LZW מיועדת לפענוח על ידי מחשב שנות התשעים, כך של- ESP32 יש גם כוח עיבוד הוגן מספיק כדי לפענח אותו בזמן אמת.
Motion JPEG
או שנקרא M-JPEG / MJPEG הוא פורמט דחיסת וידאו נפוץ עבור חומרת לכידת הווידיאו עם כוח עיבוד מוגבל. למעשה זה רק שילוב של מסגרות JPEG דוממות. השווה עם MPEG או MP4, Motion JPEG אין צורך בטכניקה אינטנסיבית חישובית של חיזוי מסגרות, כל מסגרת היא עצמאית. אז זה דורש פחות משאבים כדי לקודד ולפענח.
הפניה:
en.wikipedia.org/wiki/List_of_monochrome_a…
en.wikipedia.org/wiki/GIF
en.wikipedia.org/wiki/Motion_JPEG
שלב 3: פורמט אודיו
PCM
פורמט נתונים גולמיים לאודיו דיגיטלי. ESP32 DAC משתמשים בעומק סיביות של 16 סיביות, כלומר כל נתוני 16 סיביות מייצגים אות אנלוגי מדוגם דיגיטלי. רוב אודיו הווידיאו והשיר משתמשים בדרך כלל בקצב מדגם ב -44100 מגה -הרץ, כלומר 44100 אות אנלוגי מדוגם בכל שנייה. אז, נתוני גלם PCM מונו של אודיו של דקה אחת יהיו בגודל: 16 * 44100 * 60 = 42336000 סיביות = 5292000 בתים או מעל 5 מגה. גודל אודיו הסטריאו יהיה כפול, כלומר מעל 10 מגה -בתים
MP3
MPEG Layer 3 הוא פורמט אודיו דחוס שנמצא בשימוש נרחב לדחיסת שירים מאז שנות התשעים. הוא יכול להקטין באופן דרמטי את גודל הקובץ עד לעשירית מתבנית ה- PCM הגולמית
הפניה:
en.wikipedia.org/wiki/Pulse-code_modulatio…
en.wikipedia.org/wiki/MP3
שלב 4: עיצוב המרה
פרויקט זה משתמש ב- FFmpeg להמיר את הסרטון לפורמט ESP32 קריא.
אנא הורד והתקן את FFmpeg באתר הרשמי שלהם אם עדיין לא:
המרת אודיו PCM
ffmpeg -i input.mp4 -f u16be -acodec pcm_u16le -ar 44100 -ac 1 44100_u16le.pcm
המרה לאודיו MP3
ffmpeg -i input.mp4 -ar 44100 -ac 1 -q: a 9 44100.mp3
המר ל- RGB565
ffmpeg -i input.mp4 -vf "fps = 9, scale = -1: 176: flags = lanczos, crop = 220: in_h: (in_w -220)/2: 0" -c: v rawvideo -pix_fmt rgb565be 220_9fps. rgb
המרה ל--g.webp
ffmpeg -i input.mp4 -vf "fps = 15, קנה מידה = -1: 176: דגלים = lanczos, חיתוך = 220: in_h: (in_w -220)/2: 0, פיצול [s0] [s1]; [s0] palettegen [p]; [s1] [p] paletteuse "-loop -1 220_15fps.gif
המרה ל- Motion JPEG
ffmpeg -i input.mp4 -vf "fps = 30, scale = -1: 176: flags = lanczos, crop = 220: in_h: (in_w -220)/2: 0" -q: v 9 220_30fps.mjpeg
הערה:
ניתן להשתמש באופטימיזציה נוספת של-g.webp" />
שלב 5: הכנת חומרה
לוח Dev ESP32
כל לוח ESP32 dev-core צריך להיות בסדר, הפעם אני משתמש ב- TTGO ESP32-Micro.
תצוגת צבע
כל תצוגת צבע שתומכת ב- Arduino_GFX צריכה להיות בסדר, הפעם אני משתמש בלוח פריצה ILI9225 עם חריץ לכרטיס SD.
תוכל למצוא את רשימת תצוגת הצבעים הנתמכת של Arduino_GFX ב- Github:
github.com/moononournation/Arduino_GFX
כרטיס זיכרון
כל כרטיס SD צריך להיות בסדר, הפעם אני משתמש ב- SanDisk "מהירות רגילה" של 8 ג'יגה -בייט מיקרו SD עם מתאם SD.
שֶׁמַע
אם אתה רוצה להשתמש באוזניות בלבד, פשוט חבר את סיכות האוזניות לסיכה 26 ו- GND יכול להאזין לשמע. או שאתה יכול להשתמש במגבר זעיר להשמעת אודיו עם רמקול.
אחרים
כמה לוחות לחוטים וקרש לחם
שלב 6: ממשק SD
לוח פריצה LCD ILI9225 כלל גם סיכות פריצה של חריץ SD crd. זה יכול לשמש כאוטובוס SPI או אוטובוס SD של 1 סיביות. כפי שצוין בהוראות הקודמות שלי, אני מעדיף להשתמש באוטובוס SD של 1 סיביות, כך שהפרויקט הזה יתבסס על אוטובוס SD של 1 סיביות.
שלב 7: חבר אותו יחד
התמונות לעיל מציגות את פלטפורמת הבדיקה בה אני משתמשת בפרויקט זה. לוח הלחם הלבן מודפס בתלת מימד, ניתן להוריד ולהדפיס אותו ב thingiverse:
החיבור בפועל תלוי איזו חומרה יש לך ביד.
להלן סיכום החיבור:
ESP32
Vcc -> LCD Vcc GND -> LCD GND GPIO 2 -> SD D0/MISO -> נגד 1k -> Vcc GPIO 14 -> SD CLK GPIO 15 -> SD CMD/MOSI GPIO 18 -> LCD SCK GPIO 19 -> LCD MISO GPIO 22 -> LCD LED GPIO 23 -> LCD MOSI GPIO 27 -> LCD DC/RS GPIO 33 -> LCD RST
עיין:
שלב 8: תכנית
Arduino IDE
הורד והתקן את Arduino IDE אם עדיין אינך עושה זאת:
www.arduino.cc/en/main/software
תמיכה ב- ESP32
עקוב אחר הוראות ההתקנה כדי להוסיף תמיכה ב- ESP32 אם עדיין אינך עושה זאת:
github.com/espressif/arduino-esp32
ספריית Arduino_GFX
הורד את ספריות Arduino_GFX האחרונות: (לחץ על "שיבוט או הורד" -> "הורד ZIP")
github.com/moononournation/Arduino_GFX
ייבוא ספריות ב- Arduino IDE. (תפריט "סקיצה" של Arduino IDE -> "כלול ספרייה" -> "הוסף ספריית ZIP" -> בחר קובץ ZIP שהורדת)
אודיו ESP8266
הורד את ספריות האודיו העדכניות ביותר ESP8266: (לחץ על "שיבוט או הורד" -> "הורד ZIP")
github.com/earlephilhower/ESP8266 אודיו
ייבוא ספריות ב- Arduino IDE. (תפריט "סקיצה" של Arduino IDE -> "כלול ספרייה" -> "הוסף ספריית ZIP" -> בחר קובץ ZIP שהורדת)
קוד לדוגמה של RGB565_video
הורד את קוד הדוגמה העדכני ביותר של RGB565_video: (לחץ על "שיבוט או הורד" -> "הורד ZIP")
github.com/moononournation/RGB565_video
נתוני כרטיס SD
העתק את הקבצים המומרים לכרטיס SD והכנס אותם לחריץ כרטיס ה- LCD
הידור והעלאה
- פתח את SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino ב- Arduino IDE
- אם אינך משתמש ב- ILI9225, שנה את קוד המחלקה החדש (סביב שורה 35) לשם הנכון של הכיתה
- לחץ על כפתור "העלאה" של Arduino IDE
- אם לא הצלחת להעלות את התוכנית, נסה לנתק את החיבור בין ESP32 GPIO 2 לבין SD D0/MISO
- אם אתה מוצא שהכיוון אינו נכון, שנה את ערך "הסיבוב" (0-3) בקוד המחלקה החדש
- אם התוכנית פועלת היטב אתה יכול לנסות דוגמא אחרת להתחיל עם SDMMC_*
- אם אין לך חריץ לכרטיס SD או שאין לך FFmpeg מותקן, עדיין תוכל לנסות דוגמת SPIFFS_*
שלב 9: אמת מידה
להלן סיכום הביצועים לפורמט וידאו שונה (220x176) ושמע (44100 MHz):
פוּרמָט | מסגרת לשנייה (fps) |
MJPEG + PCM | 30 |
15 | |
RGB565 + PCM | 9 |
MJPEG + MP3 | 24 |
הערה:
- MJPEG + PCM יכול להגיע ל- fps גבוה יותר, אך אין צורך בהפעלה במסך זעיר העולה על 30 fps
- RGB565 אינו דורש תהליך פענוח אך גודל הנתונים גדול מדי ונדרש זמן רב בעת טעינת נתונים מ- SD, אוטובוס SD של 4 סיביות וכרטיס SD מהיר יותר יכול לשפר אותו מעט (ניחוש פרוע יכול להגיע סביב 12 fps)
- תהליך פענוח MP3 עדיין לא מותאם, הוא מוקדש כעת ליבה 0 לפענוח MP3 וליבה 1 להפעלת וידאו
שלב 10: משחק שמח
עכשיו אתה יכול לנגן וידאו ושמע עם ESP32 שלך, הוא פתח אפשרויות רבות!
אני חושב שאעשה אחר כך טלוויזיה וינטג 'קטנטנה …