תוכן עניינים:
- שלב 1: דרישות
- שלב 2: המפרט
- שלב 3: תחילת העבודה
- שלב 4: המעגל הקטן
- שלב 5: צא מהברזל
- שלב 6: בדיקת ה- DAC
- שלב 7: קריאת כותרת ה- Wav
- שלב 8: הפרעה, הפרעה…
- שלב 9: הפרעות ואיגום כפול
וִידֵאוֹ: הפעלת קבצי שמע (WAV) עם Arduino ו- DAC: 9 שלבים
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:16
הפעל קובץ wav אודיו מכרטיס ה- SD שלך Audino. מדריך זה יראה לך כיצד ניתן לשחק קובץ wav בכרטיס ה- SdCard שלך באמצעות מעגל פשוט לרמקול.
קובץ ה- wav חייב להיות מונו של 8 סיביות. לא הייתה לי בעיה להפעיל קבצי 44 קילוהרץ.
אמנם לא היי-נאמנות, אבל איכות הצליל מספקת מאוד.
הצג הטורי משמש לבחירת הקובץ. הקבצים חייבים להיות בתיקייה בשם adlog.
הוראה זו נובעת מפרויקט קודם שבו שמרתי הקלטות wav בכרטיס ה- SdCard:
המעגל משתמש בממיר זול של 8 ביט דיגיטלי לאנלוגי (DAC) ומגבר שמע שבב יחיד.
קטעי מפתח להקמת הפרעות נלקחו מתוך המאמר המצוין של אמנדה גסאיי:
שלב 1: דרישות
Arduino- אני משתמש במגה, אולם אין סיבה שהונו לא יעבוד.
קורא SdCard- התוכנית מוגדרת עבור: לוח פריצת MicroSD המוסדר עם המרת לוגיקה V2
עיין במדריך זה לפרטי התקנת SdCard:
DAC0832 LCN- ממיר דיגיטלי 8 אנלוגי מצוין- כמה קילוגרמים.
מגבר LM386 N-1 אופ- זול כמו שבבים
שקע שבבים 20 כיוונים
שקע שבבים 8 כיוונים
ספק כוח 9 וולט- סוללה תספיק.
LM336 התייחסות מתח 2.5 וולט
קבלים 10uF * 3 (כל מתח מעל 9V)
נגד 10 אוהם
קבל 50nF- (או איפשהו ליד 47nF, 56nf, 68nf- יעשה)
קבל 220uF
רמקול 64 אוהם
פוטנציומטר לינארי 10K
כבל לקישור 8 קווי הנתונים בין הארדואינו למעגל-
ב- Uno 8 החיבורים בתור, במגה הם בזוגות.
במגה השתמשתי בכבל סרט 10 כיוונים עם כותרת IDC לכיוון 10. (2 חוטים פנויים)
מחברי שקעים עבור 0V, 9V ו- DAC out
לוח רצועת נחושת, הלחמה, חוט, חותכים וכו '
שלב 2: המפרט
סדרה מוגדרת על 115200 baud.
קיימת תמיכה בלוח הפריצה Hobbytronics MicroSD באמצעות מגה. שבב הבחירה ויציאות אחרות ישתנו בין מגה ליו.
קבצי ה- WAV חייבים להתקיים בספרייה בשם adlog- אל תהסס לקרוא לה משהו אחר ולסדר מחדש את הקידוד הדרוש.
קובץ ה- wav חייב להיות מונו של 8 סיביות. בדקתי עד 44KHz.
הצג הטורי מציג את קבצי ה- wav בתיקיית adlog. שמות קבצים נשלחים מקו הפלט של הצג.
גודל הקובץ מוגבל רק על ידי גודל SdCard.
שלב 3: תחילת העבודה
חבר את קורא כרטיסי ה- SD. אלה הם החיבורים למגה.
0, 5V
CLK לפין 52
D0 לסיכה 50
D1 לסיכה 51
CS לפין 53
(עיין באתר הספקים לחיבור יציאת Uno)
תרצה לבדוק שהכרטיס שלך עובד בשלב זה- השתמש בסקריפטים שסופק על ידי הספק.
אנחנו צריכים לעשות מעגל קטן
אנו הולכים לשלוח זרם של בייט אודיו מהארדואינו.
מספרים אלה הם בין 0 ל 255. הם מייצגים את המתח.
שתיקה היא 127-128.
255 הוא קונוס רמקולים קשה לכיוון אחד.
0 הוא קונוס רמקולים בצורה הפוכה.
אז האודיו מוקלט כמספרים שנשמרו, היוצרים מתחים משתנים, היוצרים חרוטי רמקולים נעים.
אנו יכולים לשלוח את המספרים מתוך 8 שורות ב- Arduino, בו זמנית, באמצעות "יציאה".
אם אנו מזינים את 8 הקווים לממיר דיגיטלי לאנלוגי, הוא עושה מה שהוא אומר על הפח ומייצר מתח אנלוגי הפרופורציונאלי למספר הדיגיטלי.
כל שעלינו לעשות הוא לארוז את המתח למגבר תפעולי קטן ולאחר מכן לרמקול.
שלב 4: המעגל הקטן
ה- DAC0832 LCN
זהו ממיר דיגיטלי לאנלוגי מעולה 8 זול. (DAC)
ניתן לשלוט בו באופן מלא עם מערך של אחיזת נתונים, קווי דגימת נתונים.
או שניתן להגדיר את כל הפעולות באופן אוטומטי ב"הזרמה דרך פעולה ".
לצטט את המדריך:
פשוט הארקה של CS, WR1, WR2 ו- XFER וקשירת ILE גבוהה מאפשרת לשני הרשמים הפנימיים לעקוב אחר הכניסות הדיגיטליות המיושמות (זרימה) ולהשפיע ישירות על הפלט האנלוגי של DAC.
בסדר זה ארבעה חיבורים לשבב המוגדר נמוך ומערך אחד ל- 9V - קל.
אנחנו לא רוצים שמתחים שליליים יוצאים אז המדריך אומר שצריך להשתמש ב"מצב מיתוג מתח "והם מספקים את התרשים.
כל שעלינו לעשות הוא להחליף מגבר אודיו קטן במקום זה שהם מציעים.
מגבר השמע LM386-N
מדריך המגבר מספק תרשים חלקים מינימלי- המספק רווח של 20 (יותר מדי בשבילנו- אבל יש לו שליטה על עוצמת הקול).
כל שעלינו לעשות הוא להוסיף קבל בין ה- DAC למגבר כך שנגביר רק אותות AC.
עלינו גם להוסיף כמה קבלים קרוב לפין האספקה של כל אחד מהשבבים שלנו אחרת נקבל זמזום מהספק 9V שלנו.
שלב 5: צא מהברזל
מכיוון שהמעגל פשוט אין לי כוונה לתת מכה במכה.
להלן מספר הצעות:
- הכינו חתיכת לוח רצועות נחושת לפחות 28 על 28 חורים. (כן אני יודע שמנתחי מוח יכולים להקטין אותו)
- אם אתה מתכוון להרכיב אותו בעזרת ברגים, אפשר זאת בהתחלה!
- הרכיבו את השבבים על שקעים. הכנס את הצ'יפס רק כשהכל נבדק.
- הרחק את חוטי הקלט מהפלט.
- שימו לב לקוטביות הנכונה עבור הקבלים.
- עיין בתרשים לתצוגת הבסיס של התייחסות המתח LM336. רגל ההתאמה אינה בשימוש וניתנת לחיתוך.
- שימו לב לחיבור הישיר לפין 8 של ה- DAC- הוא שימושי מאוד לבדיקה.
- התחברתי לאודינו עם כבל סרט ומחבר IDC 10 כיווני.
- ב- Uno החיבורים נמצאים בקו ישר - אתה עשוי לגלות שסידור 8 חיבורי הקלט בקו ישר יחיד מאפשר לך לקשר ל- Arduino עם חיבור 8 כיווני קנוי ומוכן,
בסיום- בדוק את ההלחמה ובדוק את הפערים בין פסי הנחושת.
אני מוצא להב מסור לגרעין של 36 tpi שימושי מאוד לפינוי פסולת. אני מסיר את סיכות האיתור של הלהב ומחליק את קצה הלהב למסלול- ברור שהלהב אינו נמצא במסגרת.
שלב 6: בדיקת ה- DAC
השאר את החיבור בין המעגל והארדואינו כבוי.
הגדר את בקרת עוצמת הקול במעגל שלך באמצע.
הפעל את מתח 9V DC למעגל החדש שלך.
בדוק שהמעגל תקין- אני לא יכול לקבל אחריות על המעגל שלך!
כיבוי
חבר את המעגל שלך ל- Arduino.
במגה השתמש בסיכות 22-29. (פורטה) אל תטעו בשני סיכות 5V למעלה!
ב- Uno השתמש בסיכות 0-7. זהו PORTD
חבר את 0V של ספק הכוח שלך ל- 0V של ה- Arduino.
הפעל כוח.
פתח את תוכנית הבדיקה הזו DAC_TEST
עבור UNO, החלף את כל ההפניות ל- PORTA ל- PORTD
החלף את DDRA ב- DDRD- הוראה זו קובעת את כל 8 השורות לפלט בבת אחת. זהו רישום כיוון הנתונים.
הגדר את הצג הטורי שלך ל- 115200.
חבר מד מתח בין DAC החוצה ל- OV
התוכנית תגדיר את הפלט ל -255 - כל הקווים מופעלים - מתח מרבי.
פלט 128- חצי מתח מרבי.
פלט 0- אפס מתח (או כנראה כמעט אפס).
לאחר מכן הוא יעלה שלב בינוני: 1, 2, 4, 8, 16, 32, 64, 128
המתח אמור לעלות בהתמדה.
אם המתח יורד לאחור בזמן שהמספר עולה כנראה שיש לך שני חוטים מחוברים הפוכים.
כמו כן, עליך לשמוע את הרמקול לוחץ בשקט כשהמתח משתנה
שלב 7: קריאת כותרת ה- Wav
קבצי WAV נשמרים בתדירות ובגודל נתונים מוגדרים.
מידע זה מצוי בכותרת של 44 בתים בתחילת קובץ wav.
למרות שתוכנות מסוימות מרחיבות את הכותרת (לאחר בת 35), מה שהופך את מיקום גודל הנתונים לקשה יותר לאתר.
כדי לקרוא את הכותרת אנו יוצרים מאגר ומעתיקים את תחילת הקובץ.
התדירות מאוחסנת ב- 4 בתים החל מ- 24 בתים לתוך הקובץ.
// תדירות קריאה שצוין בכותרת קובץ wav
בייט headbuf [60]
tempfile.seek (0);
tempfile.read (headbuf, 60);
retval = headbuf [27];
retval = (retval << 8) | headbuf [26];
retval = (retval << 8) | headbuf [25];
retval = (retval << 8) | headbuf [24];
Serial.print (F ("תדירות הקבצים"));
Serial.print (retval);
הדרך הטובה ביותר למצוא את מידע גודל הנתונים היא לחפש את המילה "נתונים" בכותרת.
לאחר מכן חלץ את 4 הבייטים שאחריו, המרכיבים את הערך הארוך
הסתגלות ארוכה ללא סימן;
int mypos = 40;
עבור (int i = 36; i <60; i ++) {
if (headbuf == 'd') {
if (headbuf [i+1] == 'a') {
if (headbuf [i+2] == 't') {
if (headbuf [i+3] == 'a') {
// סוף סוף יש לנו את זה
mypos = i+4;
i = 60;
}
}
}
}
}
tempfile.seek (mypos);
retval = headbuf [mypos+3];
retval = (retval << 8) | headbuf [mypos+2];
retval = (retval << 8) | headbuf [mypos+1];
retval = (retval << 8) | headbuf [mypos];
בסדר יש לנו את אורך הנתונים ותדירותם!
נתוני השמע עוקבים אחר 4 הבייטים המרכיבים את ערך אורך הנתונים.
שלב 8: הפרעה, הפרעה…
אנו משתמשים במידע התדרים כדי ליצור הפרעה לתוכנה בתדירות הנדרשת או בקרבתה.
לא תמיד ניתן להגדיר את ההפסקה במדויק, אך היא מספקת. התדירות הנקראת מהקובץ מועברת לשגרת המשנה שנקבעה.
set setrupt void (freq float) {float bitval = 8; // 8 עבור טיימרים של 8 סיביות 0 ו -2, 1024 עבור טיימר 1 בתים
setocroa = (16000000/(freq*bitval)) - 0.5;
// ערך setocroa דורש חיסור של -1. עם זאת הוספת 0.5 סיבובים ל -0.5 הקרוב ביותר
// הרזולוציה של הטיימר מוגבלת
// נקבע בסופו של דבר לפי גודל ביטוואל
cli (); // השבת הפרעות // הגדר הפרעה של טיימר 2
TCCR2A = 0; // הגדר את כל רשם TCCR2A ל -0
TCCR2B = 0; // אותו דבר לגבי TCCR2B
TCNT2 = 0; // לאתחל את ערך המונה ל -0
// להגדיר השווה את רשימת ההתאמות לתוספות תדר (hz)
OCR2A = setocroa; // = (16*10^6) / (תדירות*8) - 1 (חייב להיות <256)
// הפעל את מצב CTC
TCCR2A | = (1 << WGM21); // הגדר סיביות CS21 עבור 8 מכשירי מיון מראש
TCCR2B | = (1 << CS21); // אפשר הפסק טיימר השווה
// TIMSK2 | = (1 << OCIE2A); // זה עובד, וכך גם השורה הבאה
sbi (TIMSK2, OCIE2A); // אפשר הפסקת טיימר 2
sei (); // לאפשר הפרעות
הקוראים המבינים יראו sbi (TIMSK2, OCIE2A)
הגדרתי כמה פונקציות (נרכשות באינטרנט) להגדרה וניקוי סיביות רגיסטר:
// מגדיר ניקוי סיביות רגיסטר#ifndef cbi
#define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))
#endif
// מגדיר להגדרת סיביות רגיסטר
#ifndef sbi
#define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))
#endif
פונקציות אלה מספקות שיחה קלה להגדרה או ניקוי ההפרעה.
אז ההפסקה פועלת, מה אנחנו יכולים לגרום לה לעשות?
שלב 9: הפרעות ואיגום כפול
במהירות של 22 קילוהרץ מוצג בייט של נתוני שמע כל 0.045 אלפיות השנייה
512 בתים (גודל המאגר) נקראים ב -2.08 אלפיות השנייה.
כך שלא ניתן לקרוא את המאגר מכרטיס ה- SDCC במחזור כתיבה אחד.
עם זאת 512 בתים נכתבים ליציאה ב -23.22 ms.
אז כל שעלינו לעשות הוא להקים קובץ חדש הנקרא בכל פעם שהמאגר מתרוקן ויש לנו מספיק זמן לקבל את הנתונים לפני שיידרש חסימת נתונים חדשה … בהנחה שאנו משתמשים בשני מאגרים, מרוקנים אחד כאשר אנו ממלאים אחר.
זהו חוצץ כפול.
קריאת הקובץ תואט על ידי ההפסקה החוזרת על עצמה, אך היא תסתיים.
יש לי התקנה של שני מאגרי 512 בתים הנקראים bufa ו- bufb.
אם הדגל כבר נכון אנו קוראים מפורטא אחרת אנו קוראים מפורטב
כאשר מיקום המאגר (bufcount) מגיע לגודל המאגר (BUF_SIZE 512) הגדרנו דגל בשם readit ל- true.
שגרת לולאת החלל מחפשת את הדגל הזה ומתחילה בלוק קריאה:
if (readit) {if (! aready) {
// ליזום בלוק SDCard לקרוא ל- bufa
tempfile.read (bufa, BUF_SIZE);
} אחר {
// ליזום בלוק SDCard לקרוא ל- bufb
tempfile.read (bufb, BUF_SIZE);
}
readit = false;
}
לאחר סיום הדגלים השגרתיים readit = false.
בתוך שגרת ההפסקה עלינו לבדוק כי לולאת הריק הסתיימה על ידי בדיקה אם readit == false.
במקרה זה אנו מסמנים כי נדרשת קריאה נוספת ומחליפים את הדגל מוכן להחליף מאגר.
אם כרטיס ה- SD עדיין קורא, עלינו לעקוב אחר קריאה אחת (נגד-; bufcount--;) ולצאת מההפרעה כדי לנסות שוב מאוחר יותר. (קליקים באות פלט השמע מרמזים שזה קרה).
כאשר כל הנתונים נקראים ההפסקה מתבטלת, היציאה שוב מוגדרת לערך המתח הבינוני של 128 וקובץ השמע נסגר.
לפני הפעלת הסקריפט dac2.ino בפעם הראשונה, הגדר את עוצמת הקול שלך ל -50%. זה יהיה חזק מדי, אבל זה עדיף על 100%!
אם בקרת עוצמת הקול פועלת בהחלפה הפוכה של ההובלות בקצוות מנוגדים של פוטנציומטר 10K.
ספר לי איך זה נשמע.
מוּמלָץ:
הפעלת קריפטו דמוי ביטקוין ב- Raspberry Pi: 5 שלבים
הפעלת קריפטו דמוית ביטקוין ב- Raspberry Pi: הוראות להפעלת צומת. מערכת ההפעלה US-OS עשויה מ- raspbian הפעלת חבילת us-cryptoplatform. אינך צריך לבקש אישור להצטרף. פשוט פעל לפי ההוראות הפשוטות האלה ו הפעל צומת המרוויח מטבע קריפטוגרפי כל דקה
Neopixel Ws2812 זוהר LED זוהר עם M5stick-C - הפעלת קשת על Neopixel Ws2812 שימוש ב- M5stack M5stick C באמצעות Arduino IDE: 5 שלבים
Neopixel Ws2812 זוהר LED זוהר עם M5stick-C | הפעלת קשת על Neopixel Ws2812 שימוש ב- M5stack M5stick C שימוש ב- Arduino IDE: היי חברים במדריך זה נלמד כיצד להשתמש ב- LEDs של neopixel ws2812 או ברצועת led או מטריקס או LED עם לוח פיתוח m5stack m5stick-C עם Arduino IDE ואנו נכין דפוס קשת איתו
ארדואינו מדבר - משחק MP3 עם Arduino ללא כל מודול - הפעלת קובץ Mp3 מארדואינו באמצעות PCM: 6 שלבים
ארדואינו מדבר | משחק MP3 עם Arduino ללא כל מודול | השמעת קובץ Mp3 מארדואינו באמצעות PCM: במדריך זה נלמד כיצד לנגן קובץ mp3 עם ארדואינו מבלי להשתמש במודול שמע כלשהו, כאן נשתמש בספריית PCM עבור ארדואינו המנגנת 16 סיביות PCM בתדר 8 קילוהרץ אז אפשר לעשות זאת
הפעלת קבצי .iso בנגן VMWare: 3 שלבים
Running.iso קבצים ב- VMWare Player: VMPlayer יכול להיות שימושי מאוד, במיוחד לניסיון הפצות לינוקס, אך בעוד שיש הרבה הפצות שונות. באתר VMWare זמין להורדה כבר היו לי כמה קבצי ISO של לינוקס מסתובבים במסמכים שלי, אבל VM Pl
כיצד לתקן קבצי נתונים שאינם נתמכים ולהוריד את קבצי הווידיאו האהובים עליך עבור PSP הנייד שלך: 7 שלבים
כיצד לתקן קבצי נתונים שאינם נתמכים ולהוריד את קבצי הווידיאו האהובים עליך ל PSP הנייד שלך: השתמשתי ב- Media Go, ועשיתי כמה מהטריקים כדי לגרום לקבצי וידאו שאינם נתמכים לעבוד ב- PSP שלי. אלה כל השלבים שעשיתי , כאשר קיבלתי לראשונה את קבצי הווידאו הבלתי נתמכים שלי לעבוד על ה- PSP שלי. זה עובד 100% עם כל קבצי הווידאו שלי על PSP Po שלי