תוכן עניינים:

הפעלת קבצי שמע (WAV) עם Arduino ו- DAC: 9 שלבים
הפעלת קבצי שמע (WAV) עם Arduino ו- DAC: 9 שלבים

וִידֵאוֹ: הפעלת קבצי שמע (WAV) עם Arduino ו- DAC: 9 שלבים

וִידֵאוֹ: הפעלת קבצי שמע (WAV) עם Arduino ו- DAC: 9 שלבים
וִידֵאוֹ: המרת קבצי אודיו בחינם ובקלות | מעודכן 2020 2024, יולי
Anonim
הפעלת קבצי שמע (WAV) עם Arduino ו- DAC
הפעלת קבצי שמע (WAV) עם Arduino ו- DAC
הפעלת קבצי שמע (WAV) עם Arduino ו- DAC
הפעלת קבצי שמע (WAV) עם Arduino ו- DAC
הפעלת קבצי שמע (WAV) עם Arduino ו- DAC
הפעלת קבצי שמע (WAV) עם Arduino ו- DAC

הפעל קובץ 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

בדיקת ה- DAC
בדיקת ה- 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
קריאת כותרת ה- 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.

ספר לי איך זה נשמע.

מוּמלָץ: