תוכן עניינים:
2025 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2025-01-13 06:57
סיכום
כשאני חושב על בלוטות 'אני חושב על מוזיקה אך למרבה הצער רוב המיקרו -בקרים אינם יכולים להשמיע מוזיקה באמצעות בלוטות'. ה- Raspberry Pi יכול אבל זה מחשב. אני רוצה לפתח מסגרת מבוססת Arduino עבור מיקרו -בקרי הפעלה של שמע באמצעות Bluetooth. כדי להגמיש את שרירי המיקרו-בקר שלי באופן מלא אני הולך להוסיף בזמן אמת לעיבוד אותות דיגיטליים (DSP) לאודיו (סינון מעבר גבוה, סינון מעבר נמוך ודחיסת טווח דינמי). עבור הדובדבן למעלה, אוסיף שרת אינטרנט שניתן להשתמש בו כדי להגדיר את ה- DSP באופן אלחוטי. הסרטון המוטבע מציג את היסודות של אודיו Bluetooth בפעולה. זה גם מראה לי שימוש בשרת האינטרנט לביצוע סינון של מעבר גבוה, סינון מעבר נמוך ודחיסת טווח דינמי. השימוש הראשון בדחיסת טווח דינאמי גורם בכוונה לעיוות כדוגמא לבחירות פרמטריות גרועות. הדוגמה השנייה מבטלת את העיוות הזה.
עבור פרויקט זה, ה- ESP32 הוא המיקרו -בקר המועדף עליך. הוא עולה פחות מ -10 ליש ט והוא עמוס בתכונות ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic ומעבד כפול ליבות של 240MHz. ה- DAC המשולב יכול לשחק אודיו מבחינה טכנית אך הוא לא יישמע נהדר. במקום זאת אשתמש במפענח הסטריאו של Adafruit I2S כדי לייצר אות קו יציאה. ניתן לשלוח אות זה בקלות לכל מערכת HiFi כדי להוסיף באופן מיידי אודיו אלחוטי למערכת ה- HiFi הקיימת שלך.
אספקה
יש לקוות שלרוב היצרנים יהיו קרשי לחם, מגשרים, כבלי USB, מגהצי הלחמה של ספק כוח ויצטרכו להוציא רק 15 ליש ט על ה- ESP32 ועל מפענח הסטריאו. אם לא, כל החלקים הנדרשים מפורטים להלן.
- ESP32 - נבדק ב- ESP32 -PICO -KIT וב- TinyPico - £ 9.50/ £ 24
- מפענח סטריאו Adafruit I2S - 5.51 ליש"ט
- לוח לחם - 3 - 5 ליש"ט ליחידה
- חוטי מגשר - 3 ליש"ט
- אוזניות קוויות/מערכת Hi -Fi - £ £
- כותרות דחיפה או מלחם - £ 2.10 / £ 30
- כבל מיקרו USB - £ 2.10/ £ 3
- מחבר 3.5 מ"מ ל- RCA/ שקע 3.5 מ"מ לשקע (או כל מה שהרמקול שלך צריך) - 2.40 ליש"ט/ 1.50 ליש"ט
- ספק כוח USB - 5 ליש"ט
שלב 1: בנייה - לוח הלחם
אם קנית את ה- ESP32-PICO-KIT לא תצטרך להלחים סיכות מכיוון שהוא מגיע מולחם מראש. פשוט הניחו אותו על לוח הלחם.
שלב 2: בנייה - כותרות דחיפה/הלחמה
אם ברשותך מגהץ, הלחם את הסיכות למפענח הסטריאו בהתאם להנחיות באתר Adafruit. בזמן כתיבת הברזל שלי היה בעבודה שהיתה נעולה. לא רציתי לשלם עבור מגהץ זמני אז קיצצתי כמה כותרות דחיפה מפימורוני. חתכתי אותם כך שיתאימו למפענח הסטריאו. זהו אינו הפתרון הטוב ביותר (ולא כיצד נועדו להשתמש בכותרות) אך זוהי החלופה הזולה ביותר למגהץ. חבר את הכותרת החתוכה ללוח הלחם. אתה צריך רק שורה אחת של 6 סיכות למפענח. אתה יכול להוסיף עוד שישה לצד השני ליציבות אבל זה לא הכרחי עבור מערכת אב טיפוס זו. הסיכות לחריץ הכותרות לתוכן הן vin, 3vo, gnd, wsel, din ו- bclk.
שלב 3: בנייה - חוט את סיכות החשמל
הנח את מפענח הסטריאו על כותרות הדחיפה (vin, 3vo, gnd, wsel, din ו- bclk סיכות) ודחוף אותן ביחד. שוב, באופן אידיאלי זה צריך להיעשות עם מגהץ, אבל הייתי צריך לאלתר. תבחין כי כל החוטים במדריך זה כחולים. זה בגלל שלא היו לי חוטי מגשר אז חתכתי חוט אחד ארוך לחתיכות קטנות יותר. כמו כן, אני עיוור צבעים ולא ממש אכפת לי מצבע החוט. סיכות החשמל מחוברות כדלקמן:
3v3 (ESP32) -> ל- vin במפענח סטריאו
gnd (ESP32) -> ל- gnd במפענח סטריאו
שלב 4: בנייה - חיווט I2S
כדי לשלוח את אודיו ה- Bluetooth מה- ESP32 למפענח הסטריאו אנו הולכים להשתמש בשיטת תקשורת דיגיטלית הנקראת I2S. מפענח הסטריאו ייקח את האות הדיגיטלי הזה ויהפוך אותו לאות אנלוגי שניתן לחבר אותו לרמקול או ל- HiFi. I2S דורש רק 3 חוטים ופשוט להבנה. קו שעון הסיביות (bclk) מסתובב גבוה ונמוך כדי לציין כי סיביות חדשות מועברות. קו הנתונים-out (dout) מסתובב גבוה או נמוך כדי לציין אם לביט הזה ערך של 0 או 1 ושורת בחירת המילה (wsel) מסתובבת גבוה או נמוך כדי לציין אם הערוץ השמאלי או הימני מועבר. לא כל מיקרו -בקר תומך ב- I2S אך ל- ESP32 יש 2 קווי I2S. זה הופך אותו לבחירה ברורה לפרויקט הזה.
החיווט הוא כדלקמן:
27 (ESP32) -> wsel (מפענח סטריאו)
25 (ESP32) -> דין (מפענח סטריאו)
26 (ESP32) -> bclk (מפענח סטריאו)
שלב 5: התקנת ספריית BtAudio
אם עדיין לא התקנת אותם התקן את Arduino IDE ואת ליבת ה- Arduino עבור ESP32. לאחר שהתקנת אותם, בקר בדף Github שלי והורד את המאגר. בתוך מזהה Arduino תחת סקיצה >> כלול ספרייה >> בחר "הוסף ספריית ZIP". לאחר מכן בחר את קובץ ה- zip שהורדת. זה אמור להוסיף את ספריית btAudio שלי לספריות הארדואינו שלך. כדי להשתמש בספרייה יהיה עליך לכלול את הכותרת הרלוונטית בסקיצה של Arduino. אתה תראה זאת בשלב הבא.
שלב 6: שימוש בספריית BtAudio
לאחר ההתקנה, חבר את ה- ESP32 למחשב באמצעות מיקרו USB ולאחר מכן חבר את מפענח הסטריאו לרמקול באמצעות חוט 3.5 מ"מ. לפני שתעלה את המערכון תצטרך לשנות כמה דברים בעורך Arduino. לאחר שבחרת את הלוח שלך יהיה עליך לערוך את ערכת המחיצות תחת כלים >> תוכנית מחיצות ולבחור באפשרות "אין OTA (גדול אפליקציה)" או "מינימלי SPIFFS (אפליקציות גדולות עם OTA)". זה הכרחי מכיוון שפרויקט זה משתמש הן ב- WiFi והן ב- Bluetooth ששתיהן ספריות כבדות מאוד בזיכרון. לאחר שתעשה זאת העלה את הסקיצה הבאה ל- ESP32.
#לִכלוֹל
// קובע את שם מכשיר השמע btAudio audio = btAudio ("ESP_Speaker"); הגדרת void () {// מזרימה נתוני אודיו ל- ESP32 audio.begin (); // פלט את הנתונים שהתקבלו ל- I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } לולאת חלל () {}
את הסקיצה ניתן לחלק באופן כללי ל -3 שלבים:
- צור אובייקט btAudio גלובלי שקובע את "שם ה- Bluetooth" של ה- ESP32 שלך
- הגדר את ESP32 לקבלת שמע באמצעות שיטת btAudio:: begin
- הגדר את סיכות I2S בשיטת btAudio:: I2S.
זהו בצד התוכנה! כל שעליך לעשות הוא ליזום את חיבור ה- Bluetooth ל- ESP32 שלך. פשוט סרוק מכשירים חדשים בטלפון/מחשב נייד/נגן MP3 שלך ויופיע "ESP_Speaker". ברגע שאתה שמח שהכל עובד (מוזיקה מתנגנת) תוכל לנתק את ה- ESP32 מהמחשב שלך. הפעל אותו באמצעות ספק הכוח USB והוא יזכור את הקוד האחרון שהעלית אליו. כך תוכל להשאיר את ESP32 שלך מוסתר מאחורי מערכת ה- HiFi שלך לנצח.
שלב 7: DSP - סינון
הרחבת המקלט בעיבוד אותות דיגיטליים
אם ביצעת את כל השלבים (ולא השארתי כלום) כעת יש לך מקלט Bluetooth מתפקד במלואו עבור מערכת ה- HiFi שלך. למרות שזה מגניב זה לא ממש דוחף את המיקרו -בקר לגבול. ל- ESP32 שתי ליבות הפועלות במהירות 240MHz. זה אומר שהפרויקט הזה הוא הרבה יותר מסתם מקלט. יש לו את היכולת להיות מקלט Bluetooth עם מעבד אותות דיגיטליים (DSP). מחשבי DSP מבצעים למעשה פעולות מתמטיות על האות בזמן אמת. פעולה שימושית אחת נקראת Digital Filtering. תהליך זה מחליש תדרים באות מתחת או מעל תדר ניתוק מסוים, תלוי אם אתה משתמש במסנן מעבר גבוה או נמוך.
מסנני מעבר גבוה
מסנני High-Pass מחלישים תדרים מתחת לפס מסוים. בניתי ספריית מסננים למערכות Arduino המבוססות על קוד מה- earlevel.com. ההבדל העיקרי הוא ששיניתי את מבנה המעמד כדי לאפשר בנייה של מסננים מסדר גבוה יותר בקלות. מסנני סדר גבוה יותר מדכאים תדרים מעבר לחתך שלך ביעילות רבה יותר אך הם דורשים הרבה יותר חישוב. עם זאת, עם היישום הנוכחי, אתה יכול אפילו להשתמש במסננים מסדר שישי לאודיו בזמן אמת!
הסקיצה זהה לזו שנמצאה בשלב הקודם, פרט לכך ששינינו את הלולאה הראשית. כדי לאפשר את המסננים אנו משתמשים בשיטת btAudio:: createFilter. שיטה זו מקבלת 3 טיעונים. הראשון הוא מספר מפל המסננים. מספר מפל המסננים הוא חצי בסדר המסנן. עבור מסנן מסדר שישי, הארגומנט הראשון צריך להיות 3. עבור מסנן בסדר השמיני, הוא יהיה 4. הארגומנט השני הוא ניתוק המסנן. הגדרתי את זה ל- 1000Hz כדי שישפיע ממש על הנתונים. לבסוף, אנו מציינים את סוג הפילר עם הארגומנט השלישי. זה צריך להיות highpass עבור מסנן high-pass ו- lowpass עבור מסנן low-pass. התסריט שלהלן מעביר את הפסקת התדר בין 1000 הרץ ל -2 הרץ. אתה אמור לשמוע השפעה דרמטית על הנתונים.
#לִכלוֹל
אודיו btAudio = btAudio ("ESP_Speaker"); הגדרת חלל () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } לולאת חלל () {עיכוב (5000); audio.createFilter (3, 1000, highpass); עיכוב (5000); audio.createFilter (3, 2, highpass); }
מסנני מעבר נמוך
מסנני מעבר נמוך עושים את ההפך ממסנני מעבר גבוה ומדכאים תדרים מעל תדר מסוים. הם יכולים להיות מיושמים באותו אופן כמו מסנני מעבר גבוה, למעט שהם דורשים לשנות את הארגומנט השלישי ל- lowpass. עבור הסקיצה להלן אני מחליף את הפסקת המעבר הנמוכה בין 2000Hz ל 20000Hz. אני מקווה שתשמע את ההבדל. זה אמור להישמע די עמום כאשר מסנן המעבר הנמוך הוא ב -2000 הרץ.
#לִכלוֹל
אודיו btAudio = btAudio ("ESP_Speaker"); הגדרת חלל () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } לולאת חלל () {עיכוב (5000); audio.createFilter (3, 2000, lowpass); עיכוב (5000); audio.createFilter (3, 20000, lowpass); }
שלב 8: DSP - דחיסת טווח דינמי
רקע כללי
דחיסת טווח דינמי היא שיטת עיבוד אותות המנסה לאזן את עוצמת השמע. הוא דוחס צלילים חזקים, המתנשאים מעל רף מסוים, לרמה של שקטים ולאחר מכן, מגביר את שניהם. התוצאה היא חווית האזנה הרבה יותר שווה. זה היה שימושי מאוד בזמן שצפיתי במופע עם מוזיקת רקע רועשת מאוד ושירה שקטה מאוד. במקרה זה, הגדלת עוצמת הקול לא עזרה מכיוון שזה רק הגביר את מוזיקת הרקע. בעזרת דחיסת טווח דינמי, יכולתי להפחית את מוזיקת הרקע החזקה לרמת השירה ולשמוע הכל כמו שצריך שוב.
הקוד
דחיסת טווח דינמי אינה כרוכה רק בהורדת עוצמת הקול או סף האות. זה קצת יותר חכם מזה. אם אתה מוריד את עוצמת הקול צלילים שקטים יופחתו, כמו גם הרמים. אחת הדרכים לעקוף זאת היא סף האות אך הדבר גורם לעיוות חמור. דחיסת טווח דינאמי כרוכה בשילוב של סף רך וסינון כדי למזער את העיוות שאדם יקבל אם היית מגביל/קולט את האות. התוצאה היא איתות שבו הצלילים החזקים "נחתכים" ללא עיוות והשקטים נותרים כפי שהם. הקוד שלהלן עובר בין שלוש רמות דחיסה שונות.
- דחיסה עם עיוות
- דחיסה ללא עיוות
- ללא דחיסה
#לִכלוֹל
אודיו btAudio = btAudio ("ESP_Speaker"); הגדרת חלל () {audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); } לולאת חלל () {עיכוב (5000); audio.compress (30, 0.0001, 0.0001, 10, 10, 0); עיכוב (5000); audio.compress (30, 0.0001, 0.1, 10, 10, 0); עיכוב (5000); audio.decompress (); }
דחיסת טווח דינמי מסובכת ולשיטות btAudio:: לדחוס יש פרמטרים רבים. אנסה להסביר אותם (לפי הסדר) כאן:
- סף - הרמה שבה השמע מצטמצם (נמדד בדציבלים)
- זמן התקפה - הזמן שלוקח למדחס להתחיל לעבוד לאחר הסף חורג
- זמן שחרור - הזמן שלוקח למדחס להפסיק לפעול.
- יחס הפחתה - הגורם שבאמצעותו הדחיסה של השמע.
- רוחב הברך - הרוחב (בדציבלים) סביב הסף שבו המדחס עובד באופן חלקי (צליל טבעי יותר).
- הרווח (דציבלים) המתווסף לאות לאחר הדחיסה (הגדלה/הפחתה של עוצמת הקול)
העיוות הנשמע מאוד בשימוש הראשון בדחיסה נובע מכך שהסף נמוך מאוד וזמן ההתקפה וזמן השחרור קצר מאוד ביעילות וכתוצאה מכך התנהגות סף קשה. זה נפתר בבירור במקרה השני על ידי הגדלת זמן השחרור. זה בעצם גורם למדחס לפעול בצורה הרבה יותר חלקה. כאן, הראיתי רק כיצד שינוי פרמטר אחד יכול להשפיע באופן דרמטי על השמע. עכשיו תורך להתנסות בפרמטרים שונים.
היישום (מתמטיקה הקסם - אופציונלי)
גיליתי שיישום נאיבי של דחיסת הטווח הדינמי הוא מאתגר. האלגוריתם דורש להמיר מספר שלם של 16 סיביות לדציבלים ולאחר מכן להפוך אותו חזרה למספר שלם של 16 סיביות לאחר עיבוד האות. שמתי לב ששורת קוד אחת לוקחת 10 מיקרו שניות לעיבוד נתוני סטריאו. מכיוון שאודיו סטריאו שנדגם ב -44.1 קילוהרץ משאיר רק 11.3 מיקרו -שניות עבור ה- DSP, זה איטי באופן בלתי מתקבל על הדעת … עם זאת, על ידי שילוב טבלת חיפוש קטנה (400 בתים) והליך אינטרפולציה המבוסס על ההבדלים המחולקים של נטוון, אנו יכולים להשיג דיוק של כמעט 17 סיביות תוך 0.2 מיקרו -שניות. צירפתי מסמך pdf עם כל המתמטיקה למתעניינים באמת. זה מסובך, הוזהרתם!
שלב 9: ממשק ה- Wifi
כעת יש לך מקלט Bluetooth המסוגל להריץ DSP בזמן אמת. למרבה הצער, אם אתה רוצה לשנות את כל הפרמטרים של DSP, יהיה עליך להתנתק מה- HiFi שלך, להעלות סקיצה חדשה ולאחר מכן להתחבר מחדש. זה מגושם. כדי לתקן זאת פיתחתי שרת אינטרנט בו תוכל להשתמש כדי לערוך את כל פרמטרי ה- DSP מבלי להתחבר מחדש למחשב שלך. הסקיצה לשימוש בשרת האינטרנט להלן.
#לִכלוֹל
#include btAudio audio = btAudio ("ESP_Speaker"); webDSP אינטרנט; הגדרת חלל () {Serial.begin (115200); audio.begin (); int bck = 26; int ws = 27; int dout = 25; audio. I2S (bck, dout, ws); // החלף עם מזהה ה- WiFi והסיסמה שלך const char* ssid = "SSID"; const char* password = "PASSWORD"; web.begin (ssid, סיסמה ושמע); } לולאת חלל () {web._server.handleClient (); }
הקוד מקצה כתובת IP ל- ESP32 שלך בה תוכל להשתמש כדי לגשת לדף האינטרנט. בפעם הראשונה שאתה מפעיל קוד זה עליך לצרף אותו למחשב שלך. כך תוכל לראות את כתובת ה- IP שהוקצתה ל- ESP32 שלך במסך הטורי. אם אתה רוצה לגשת לדף אינטרנט זה פשוט הזן את כתובת ה- IP הזו בכל דפדפן אינטרנט (נבדק על כרום).
כעת עלינו להכיר את שיטת הפעלת ה- Bluetooth ו- I2S. ההבדל העיקרי הוא השימוש באובייקט webDSP. אובייקט זה לוקח את ה- Wifi SSID והסיסמה שלך כארגומנטים כמו גם מצביע לאובייקט btAudio. בלולאה הראשית אנו מקבלים את אובייקט webDSP ללא הרף להאזין לנתונים נכנסים מדף האינטרנט ולאחר מכן לעדכן את פרמטרי ה- DSP. כנקודת סגירה, יש לציין כי Bluetooth ו- Wifi משתמשים באותו רדיו ב- ESP32. המשמעות היא שאולי תצטרך לחכות עד 10 שניות מרגע הזנת פרמטרים בדף האינטרנט ועד למידע שהגיע למעשה ל- ESP32.
שלב 10: תוכניות עתידיות
אני מקווה שנהנית מההדרכה ועכשיו הוספת Bluetooth Bluetooth ו- DSP ל- HiFi שלך. עם זאת, אני חושב שיש הרבה מקום לצמיחה בפרויקט הזה ורציתי להצביע על כמה כיוונים עתידיים שאוכל לנקוט.
- אפשר הזרמת אודיו ב- Wifi (לאיכות השמע הטובה ביותר)
- השתמש במיקרופון I2S כדי לאפשר פקודות קוליות
- לפתח אקולייזר נשלט WiFi
- עשה את זה יפה (קרש הלחם לא צורח עיצוב מוצר נהדר)
כשאני אנסה ליישם את הרעיונות האלה אכין עוד מדריכים. או שאולי מישהו אחר ייישם את התכונות האלה. זו השמחה של הפיכת הכל לקוד פתוח!