جدول المحتويات:

تشغيل ملفات الصوت الصوتية (Wav) باستخدام Arduino و DAC: 9 خطوات
تشغيل ملفات الصوت الصوتية (Wav) باستخدام Arduino و DAC: 9 خطوات

فيديو: تشغيل ملفات الصوت الصوتية (Wav) باستخدام Arduino و DAC: 9 خطوات

فيديو: تشغيل ملفات الصوت الصوتية (Wav) باستخدام Arduino و DAC: 9 خطوات
فيديو: إضافة النطق و الأصوات لمشاريع الأردوينو Arduino TMRpcm wav 2024, يوليو
Anonim
تشغيل ملفات الصوت الصوتية (Wav) باستخدام Arduino و DAC
تشغيل ملفات الصوت الصوتية (Wav) باستخدام Arduino و DAC
تشغيل ملفات الصوت الصوتية (Wav) باستخدام Arduino و DAC
تشغيل ملفات الصوت الصوتية (Wav) باستخدام Arduino و DAC
تشغيل ملفات الصوت الصوتية (Wav) باستخدام Arduino و DAC
تشغيل ملفات الصوت الصوتية (Wav) باستخدام Arduino و DAC

قم بتشغيل ملف wav Audio من بطاقة Audino SD الخاصة بك. سيوضح لك هذا Instructable كيف يمكن تشغيل ملف wav على بطاقة SdCard من خلال دائرة بسيطة إلى مكبر صوت.

يجب أن يكون ملف wav 8 بت أحادي. لم أواجه أي مشكلة في تشغيل ملفات 44 كيلوهرتز.

على الرغم من عدم الدقة العالية ، إلا أن جودة الصوت مرضية للغاية.

يتم استخدام جهاز العرض التسلسلي لتحديد الملف. يجب أن تكون الملفات في مجلد يسمى adlog.

يتبع هذا التوجيه من مشروع سابق حيث قمت بحفظ تسجيلات wav في SdCard:

تستخدم الدائرة محولًا رقميًا إلى تناظري (DAC) رخيص الثمن 8 بت ومكبر صوت بشريحة واحدة.

تم أخذ الأقسام الرئيسية لإعداد المقاطعات من المقالة الممتازة بقلم أماندا غاساي:

الخطوة 1: المتطلبات

متطلبات
متطلبات
متطلبات
متطلبات

Arduino - أستخدم Mega ، ولكن لا يوجد سبب يمنع Uno من العمل.

قارئ بطاقة SdCard- تم تكوين البرنامج لـ: لوحة اندلاع MicroSD المنظمة مع التحويل المنطقي V2

راجع هذا الدليل للحصول على تفاصيل إعداد SdCard: https://www.instructables.com/id/Arduino-Mega-Audio …

DAC0832 LCN- محول رقمي إلى تناظري 8 بت ممتاز- بضعة أرطال.

LM386 N-1 Op amp- رخيص مثل الرقائق

20 طريقة للمقبس رقاقة

مقبس رقاقة ذو 8 اتجاهات

مصدر طاقة 9 فولت - بطارية ستفي بالغرض.

مرجع الجهد LM336 2.5 فولت

10 فائق التوهج مكثف * 3 (أي جهد أكثر من 9 فولت)

10 أوم المقاوم

مكثف 50nF- (أو في مكان ما قريب من 47nF ، 56nf ، 68nf- سيفعل)

220 فائق التوهج مكثف

مكبر صوت 64 أوم

مقياس الجهد الخطي 10 كيلو

كابل لربط خطوط البيانات الثمانية بين Arduino والدائرة-

على Uno ، توجد 8 اتصالات في الخط ، في Mega هم في أزواج.

في Mega ، استخدمت كبل شريط 10 اتجاهات مع رأس IDC 10 اتجاهات. (2 أسلاك احتياطية)

موصلات المقبس لـ 0V ، 9V و DAC

لوح شريط نحاسي ، لحام ، سلك ، قواطع إلخ

الخطوة الثانية: المواصفات

المواصفات
المواصفات

ضبط المسلسل على 115200 باود.

يتوفر الدعم للوحة كسر Hobbytronics MicroSD باستخدام Mega. اختيار الشريحة والمنافذ الأخرى سوف تتغير بين Mega و Uno.

يجب أن تكون ملفات Wav موجودة في دليل يسمى adlog- لا تتردد في تسميتها شيئًا آخر وإعادة ترتيب الترميز اللازم.

يجب أن يكون ملف wav 8 بت أحادي. لقد اختبرت ما يصل إلى 44 كيلو هرتز.

يعرض جهاز العرض التسلسلي ملفات wav في مجلد adlog. يتم إرسال أسماء الملفات من خط إخراج الشاشة.

حجم الملف محدود فقط بحجم SdCard.

الخطوة الثالثة: البدء

ابدء
ابدء

قم بتوصيل قارئ بطاقة SD. هذه هي وصلات الميجا.

0 ، 5 فولت

CLK لدبوس 52

D0 لدبوس 50

D1 إلى دبوس 51

CS لدبوس 53

(انظر موقع الموردين للاتصال بمنفذ Uno)

سترغب في اختبار ما إذا كانت بطاقتك تعمل في هذه المرحلة - استخدم البرامج النصية التي يوفرها البائع.

نحن بحاجة لعمل دائرة صغيرة

سنرسل دفقًا من وحدات البايت الصوتية من Arduino.

هذه الأرقام بين 0 و 255. وهي تمثل الجهد.

الصمت هو 127-128.

255 هو مخروط مكبر الصوت صعبًا في اتجاه واحد.

0 هو مخروط مكبر الصوت صعبًا في الاتجاه الآخر.

لذلك يتم تسجيل الصوت كأرقام محفوظة ، مما يؤدي إلى إنشاء فولتية متفاوتة ، مما يؤدي إلى إنشاء أقماع مكبر صوت متحركة.

يمكننا إرسال الأرقام من 8 أسطر على Arduino ، في وقت واحد ، باستخدام "المنفذ".

إذا قمنا بتغذية الأسطر الثمانية في محول رقمي إلى تناظري ، فإنه يقوم بما هو مكتوب على القصدير وينتج جهدًا تناظريًا يتناسب مع الرقم الرقمي.

كل ما نحتاج إلى القيام به بعد ذلك هو حزم الجهد إلى مضخم تشغيلي صغير ثم إلى مكبر صوت.

الخطوة 4: الدائرة الصغيرة

الدائرة الصغيرة
الدائرة الصغيرة
الدائرة الصغيرة
الدائرة الصغيرة
الدائرة الصغيرة
الدائرة الصغيرة
الدائرة الصغيرة
الدائرة الصغيرة

DAC0832 LCN

هذا محول رقمي إلى تناظري رائع ورخيص 8 بت. (DAC)

يمكن التحكم فيه بشكل كامل مع مجموعة من البيانات ، خطوط عينة البيانات.

أو يمكن إعداده للقيام بكل ذلك تلقائيًا في "التدفق خلال العملية".

للاقتباس من الدليل:

ببساطة تأريض CS و WR1 و WR2 و XFER وربط ILE العالي يسمح لكلا المسجلين الداخليين بمتابعة المدخلات الرقمية المطبقة (التدفق من خلال) والتأثير بشكل مباشر على الإخراج التناظري DAC.

حسنًا ، هذا هو أربعة اتصالات لمجموعة الشريحة منخفضة وواحدة مضبوطة على 9 فولت - سهل.

لا نريد إخراج أي جهد سالب لذلك يقول الدليل أنه يجب علينا استخدام "وضع تبديل الجهد" ويقومون بتوفير الرسم التخطيطي.

كل ما نحتاج إلى القيام به هو استبدال مضخم صوت صغير بدلاً من الذي يقترحونه.

مكبر الصوت LM386-N

يوفر دليل Amp مخططًا أدنى للأجزاء - يوفر مكسبًا قدره 20 (الكثير جدًا بالنسبة لنا - ولكنه يحتوي على عنصر تحكم في مستوى الصوت).

كل ما علينا فعله هو إضافة مكثف بين DAC و amp حتى نقوم فقط بتضخيم إشارات التيار المتردد.

يجب أيضًا أن نضيف مكثفين قريبين من دبوس الإمداد لكل شريحة من رقائقنا وإلا سنحصل على همهمة من مصدر 9V الخاص بنا.

الخطوة 5: اخرج مكواة اللحام

اخرج لحام الحديد
اخرج لحام الحديد
اخرج لحام الحديد
اخرج لحام الحديد
اخرج لحام الحديد
اخرج لحام الحديد

نظرًا لأن الدائرة بسيطة ، فأنا لا أنوي توجيه ضربة عن طريق الحساب.

فيما يلي بعض المؤشرات:

  • قم بإعداد قطعة من لوح شريط نحاسي على الأقل 28 × 28 فتحة. (نعم أعلم أن جراحي الدماغ يمكنهم تصغيره)
  • إذا كنت تنوي تركيبها بمسامير ، اتركها في البداية!
  • قم بتركيب الرقائق على المقابس. أدخل الرقائق فقط عندما يتم فحص كل شيء.
  • احتفظ بأسلاك الإدخال بعيدًا عن الخرج.
  • لاحظ القطبية الصحيحة للمكثفات.
  • الرجوع إلى الرسم التخطيطي للعرض الأساسي لمرجع الجهد LM336. لا يتم استخدام ساق الضبط ويمكن قصها.
  • لاحظ الاتصال المباشر بالدبوس 8 من DAC- إنه مفيد جدًا للاختبار.
  • لقد قمت بتوصيل Audino بكابل الشريط وموصل IDC 10 اتجاهات.
  • في Uno ، تكون التوصيلات في خط مستقيم - قد تجد أن ترتيب اتصالات الإدخال الثمانية في خط مستقيم واحد يسمح لك بالارتباط بـ Arduino باستخدام موصل تم شراؤه وجاهزًا من 8 اتجاهات ،

عند الانتهاء - تحقق من اللحام وتحقق من الفجوات بين المسارات النحاسية.

أجد شفرة منشار الاختراق للصغار تبلغ 36 طنًا في البوصة مفيدة جدًا لإزالة الحطام. أقوم بإزالة دبابيس تحديد الشفرة وحرك طرف الشفرة في المسار - من الواضح أن الشفرة ليست في إطار.

الخطوة 6: اختبار DAC

اختبار DAC
اختبار DAC

اترك الاتصال بين الدائرة وأردوينو مغلقًا.

اضبط التحكم في مستوى الصوت في دائرتك على منتصف الطريق.

قم بتشغيل 9V DC Power إلى دائرتك الجديدة.

تحقق من أن الدائرة على ما يرام - لا يمكنني تحمل أي مسؤولية عن دائرتك!

انقطاع التيار الكهربائي

قم بتوصيل دائرتك بـ Arduino.

على Mega استخدام دبابيس 22-29. (PORTA) لا تخطئ في دبابيس 5 فولت أعلاه!

على Uno ، استخدم الدبابيس 0-7. هذا هو PORTD

قم بتوصيل 0V الخاص بمصدر الطاقة الخاص بك إلى 0V على Arduino.

رفع الطاقة.

افتح برنامج الاختبار هذا DAC_TEST

بالنسبة إلى UNO ، استبدل جميع الإشارات إلى PORTA إلى PORTD

استبدل DDRA بـ DDRD- تحدد هذه التعليمات جميع الأسطر الثمانية للإخراج دفعة واحدة. هذا هو سجل اتجاه البيانات.

اضبط شاشتك التسلسلية على 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 ++) {

إذا (headbuf == 'd') {

إذا (headbuf [i + 1] == 'a') {

إذا (headbuf [i + 2] == 't') {

إذا (headbuf [i + 3] == 'a') {

// أخيرًا لدينا

ميبوس = أنا + 4 ؛

أنا = 60 ؛

}

}

}

}

}

tempfile.seek (mypos) ؛

retval = headbuf [mypos + 3] ؛

retval = (retval << 8) | headbuf [mypos + 2] ؛

retval = (retval << 8) | headbuf [mypos + 1] ؛

retval = (retval << 8) | هيدبوف [ميبوس] ؛

حسنًا ، لدينا طول البيانات والتردد!

تتبع البيانات الصوتية الـ 4 بايت التي تشكل قيمة طول البيانات.

الخطوة 8: مقاطعة ، مقاطعة…

يقطع ، يقطع…
يقطع ، يقطع…

نستخدم معلومات التردد لإنشاء مقاطعة البرنامج عند التردد المطلوب أو بالقرب منه.

لا يمكن دائمًا تعيين المقاطعة بدقة ، لكنها كافية. يتم تمرير تردد القراءة من الملف إلى الروتين الفرعي setintrupt.

setintrupt (التكرار العائم) باطل {float bitval = 8 ؛ // 8 لمؤقتات 8 بت 0 و 2 ، 1024 للمؤقت 1 بايت

setocroa = (16000000 / (التكرار * bitval)) - 0.5 ؛

// تتطلب قيمة setocroa طرحًا من -1. مع ذلك ، نضيف 0.5 جولات إلى أقرب 0.5

// دقة جهاز ضبط الوقت محدودة

// تحدد في النهاية بحجم bitval

cli () ؛ // تعطيل المقاطعات // تعيين المقاطعة timer2

TCCR2A = 0 ؛ // قم بتعيين سجل TCCR2A بالكامل على 0

TCCR2B = 0 ؛ // نفس الشيء لـ TCCR2B

TCNT2 = 0 ؛ // تهيئة قيمة العداد إلى 0

// تعيين سجل مطابقة المقارنة لزيادات التردد (هرتز)

OCR2A = سيتوكرو ؛ // = (16 * 10 ^ 6) / (التردد * 8) - 1 (يجب أن يكون <256)

// قم بتشغيل وضع CTC

TCCR2A | = (1 << WGM21) ؛ // تعيين CS21 بت لـ 8 جهاز قياس مسبق

TCCR2B | = (1 << CS21) ؛ // تمكين الموقت مقارنة المقاطعة

// TIMSK2 | = (1 << OCIE2A) ؛ // هذا يعمل ، كما يفعل السطر التالي

sbi (TIMSK2 ، OCIE2A) ؛ // تمكين المقاطعة على المؤقت 2

سي () ؛ // تمكين المقاطعات

سيكون القراء المميزون قد رصدوا sbi (TIMSK2 ، OCIE2A)

لقد قمت بإعداد وظيفتين (مكتسبة عبر الإنترنت) لإعداد ومسح بتات التسجيل:

// يحدد لمسح وحدات البت # ifndef cbi

#define cbi (sfr، bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))

#إنهاء إذا

// يعرّف لتحديد بتات التسجيل

#ifndef sbi

# تعريف sbi (sfr ، بت) (_SFR_BYTE (sfr) | = _BV (بت))

#إنهاء إذا

توفر هذه الوظائف مكالمة سهلة لتعيين المقاطعة أو مسحها.

إذاً المقاطعة جارية ، ماذا يمكننا أن نجعلها تفعل؟

الخطوة 9: المقاطعات والتخزين المؤقت المزدوج

المقاطعات والتخزين المؤقت المزدوج
المقاطعات والتخزين المؤقت المزدوج
المقاطعات والتخزين المؤقت المزدوج
المقاطعات والتخزين المؤقت المزدوج

عند 22 كيلوهرتز ، يتم إخراج بايت من البيانات الصوتية كل 0.045 مللي ثانية

تتم قراءة 512 بايت (حجم المخزن المؤقت) في 2.08 مللي ثانية.

لذلك لا يمكن قراءة المخزن المؤقت من بطاقة SDCard في دورة كتابة واحدة.

ومع ذلك ، تتم كتابة 512 بايت إلى المنفذ في 23.22 مللي ثانية.

لذلك كل ما يتعين علينا القيام به هو إعداد ملف جديد للقراءة في كل مرة يفرغ فيها المخزن المؤقت ولدينا وقت كافٍ للحصول على البيانات قبل أن تكون هناك حاجة إلى كتلة بيانات جديدة … بافتراض أننا نستخدم مخازن مؤقتة ، ونفرغ أحدهما بينما نملأ الآخر.

هذا هو التخزين المؤقت المزدوج.

سيتم إبطاء قراءة الملف بسبب المقاطعة المتكررة ، ولكنها ستنتهي.

لقد قمت بإعداد اثنين من المخازن المؤقتة 512 بايت تسمى bufa و bufb.

إذا كانت العلامة بالفعل صحيحة نقرأ من porta وإلا نقرأ من portb

عندما يصل موضع المخزن المؤقت (bufcount) إلى حجم المخزن المؤقت (BUF_SIZE 512) ، قمنا بتعيين علامة تسمى readit إلى true.

يبحث روتين الحلقة الفارغة عن هذه العلامة ويبدأ في قراءة كتلة:

إذا (اقرأ) {إذا (! جاهز) {

// بدء قراءة كتلة SDCard إلى bufa

tempfile.read (bufa، BUF_SIZE) ،

} آخر {

// بدء قراءة كتلة SDCard إلى bufb

tempfile.read (bufb، BUF_SIZE) ،

}

readit = خطأ ؛

}

عند الانتهاء من العلامات الروتينية ، اقرأها = خطأ.

ضمن روتين المقاطعة ، يجب أن نتحقق من انتهاء الحلقة الفارغة عن طريق التحقق مما إذا كانت readit == false.

في هذه الحالة ، نشير إلى أن هناك حاجة إلى قراءة أخرى وقم بتبديل الإشارة المسبقة لتبديل المخازن المؤقتة.

إذا كانت SDcard لا تزال تقرأ ، فيجب علينا الرجوع إلى مسار القراءة مرة أخرى (عداد - ؛ bufcount - ؛) والخروج من المقاطعة لإعادة المحاولة لاحقًا. (تشير النقرات في إشارة خرج الصوت إلى حدوث ذلك.)

عندما تتم قراءة جميع البيانات ، يتم إلغاء المقاطعة ، ويتم إعادة ضبط المنفذ على قيمة الجهد المتوسط 128 ويتم إغلاق ملف الصوت.

قبل تشغيل البرنامج النصي dac2.ino لأول مرة ، اضبط مستوى الصوت على 50٪. سيكون هذا مرتفعًا جدًا ، لكنه أفضل من 100٪!

إذا كان التحكم في مستوى الصوت يعمل في التبديل العكسي ، فإن العملاء المتوقعين على طرفي نقيض من مقياس الجهد 10K.

اسمحوا لي أن أعرف كيف يبدو.

موصى به: