فهرست مطالب:

پخش فایلهای صوتی صوتی (Wav) با آردوینو و DAC: 9 مرحله
پخش فایلهای صوتی صوتی (Wav) با آردوینو و DAC: 9 مرحله

تصویری: پخش فایلهای صوتی صوتی (Wav) با آردوینو و DAC: 9 مرحله

تصویری: پخش فایلهای صوتی صوتی (Wav) با آردوینو و DAC: 9 مرحله
تصویری: پخش فایل صوتی ( wav player ) با ال سی دی DWIN 2024, جولای
Anonim
پخش فایلهای صوتی صوتی (Wav) با آردوینو و DAC
پخش فایلهای صوتی صوتی (Wav) با آردوینو و DAC
پخش فایلهای صوتی صوتی (Wav) با آردوینو و DAC
پخش فایلهای صوتی صوتی (Wav) با آردوینو و DAC
پخش فایلهای صوتی صوتی (Wav) با آردوینو و DAC
پخش فایلهای صوتی صوتی (Wav) با آردوینو و DAC

فایل wav Audio را از کارت SD Audino خود پخش کنید. این دستورالعمل به شما نشان می دهد که چگونه می توان یک فایل wav روی SdCard خود را از طریق یک مدار ساده به بلندگو پخش کرد.

فایل wav باید تک بیتی 8 بیتی باشد. من هیچ مشکلی در پخش فایل های 44 کیلوهرتز نداشتم.

در حالی که صداقت ندارد ، کیفیت صدا بسیار رضایت بخش است.

از مانیتور سریال برای انتخاب فایل استفاده می شود. فایلها باید در پوشه ای به نام adlog باشند.

این دستورالعمل متعلق به یک پروژه قبلی است که در آن ضبط های wav را در SdCard ذخیره کردم:

این مدار از یک مبدل ارزان 8 بیتی دیجیتال به آنالوگ (DAC) و یک تقویت کننده صوتی تک تراشه استفاده می کند.

بخشهای کلیدی برای ایجاد وقفه از مقاله عالی آماندا غسایی گرفته شده است:

مرحله 1: الزامات

الزامات
الزامات
الزامات
الزامات

آردوینو- من از مگا استفاده می کنم ، اما دلیلی وجود ندارد که Uno کار نکند.

SdCard reader- برنامه برای موارد زیر تنظیم شده است: MicroSD Breakout Board Regulated with Logic Conversion V2

برای اطلاع از جزئیات راه اندازی SdCard این دستورالعمل را ببینید:

DAC0832 LCN- مبدل 8 بیتی دیجیتال به آنالوگ عالی- چند پوند.

LM386 N-1 Op- ارزان به عنوان تراشه

سوکت تراشه 20 راهه

سوکت تراشه 8 راهه

منبع تغذیه 9 ولت- یک باتری کار می کند.

مرجع ولتاژ LM336 2.5 ولت

10uF خازن * 3 (هر ولتاژ بیش از 9V)

مقاومت 10 اهم

خازن 50nF- (یا جایی نزدیک-47nF ، 56nf ، 68nf- انجام خواهد داد)

خازن 220uF

بلندگوی 64 اهم

پتانسیومتر خطی 10K

کابل برای اتصال 8 خط داده بین آردوینو و مدار-

در Uno 8 اتصال در خط ، در Mega آنها به صورت جفت است.

در مگا از کابل روبان 10 راه با سربرگ IDC 10 جهت استفاده کردم. (2 سیم زاپاس است)

اتصالات سوکت 0V ، 9V و DAC خارج

تخته نوار مس ، لحیم کاری ، سیم ، برش و غیره

مرحله 2: مشخصات

مشخصات
مشخصات

مجموعه سریال 115200 باود

پشتیبانی از Hobbytronics MicroSD Breakout Board با استفاده از Mega در حال انجام است. انتخاب تراشه و سایر پورت ها بین Mega و Uno تغییر می کنند.

فایلهای Wav باید در یک دایرکتوری به نام adlog وجود داشته باشند. با خیال راحت نام آن را به صورت دیگری بگذارید و کد نویسی لازم را دوباره ترتیب دهید.

فایل wav باید تک بیتی 8 بیتی باشد. تا 44 کیلوهرتز تست کرده ام.

مانیتور سریال فایل های wav را در پوشه adlog نمایش می دهد. نام فایلها از خط خروجی مانیتور ارسال می شود.

اندازه فایل فقط با اندازه SdCard محدود می شود.

مرحله 3: شروع به کار

شروع شدن
شروع شدن

کارت خوان SD را وصل کنید. اینها اتصالات مگا هستند.

0 ، 5 ولت

روی پین 52 کلیک کنید

D0 تا پین 50

D1 تا پین 51

CS به پین 53

(برای اتصال پورت Uno به وب سایت تامین کنندگان مراجعه کنید)

شما می خواهید آزمایش کنید که کارت شما در این مرحله کار می کند- از اسکریپت های ارائه شده توسط فروشنده استفاده کنید.

ما باید یک مدار کوچک ایجاد کنیم

ما قصد داریم یک جریان بایت صوتی را از آردوینو ارسال کنیم.

این اعداد بین 0 تا 255 هستند. آنها نشان دهنده ولتاژ هستند.

سکوت 127-128 است.

255 مخروط بلندگو یک طرفه سخت است.

0 از طرف دیگر مخروط بلندگو سخت است.

بنابراین صدا به عنوان اعداد ذخیره شده ضبط می شود که ولتاژهای متفاوتی ایجاد می کند و مخروط های بلندگوی متحرک را ایجاد می کند.

ما می توانیم اعداد از 8 خط را در آردوینو ، همزمان ، با استفاده از "پورت" ارسال کنیم.

اگر 8 خط را به مبدل دیجیتال به آنالوگ وارد کنیم ، آنچه را که روی قلع می گوید انجام می دهد و ولتاژ آنالوگ متناسب با عدد دیجیتال تولید می کند.

تنها کاری که باید انجام دهیم این است که ولتاژ را به یک تقویت کننده عملیاتی کوچک و سپس به یک بلندگو وصل کنیم.

مرحله 4: مدار کوچک

مدار کوچک
مدار کوچک
مدار کوچک
مدار کوچک
مدار کوچک
مدار کوچک
مدار کوچک
مدار کوچک

DAC0832 LCN

این مبدل فوق العاده ارزان 8 بیتی دیجیتال به آنالوگ است. (DAC)

می توان آن را با مجموعه ای از داده ها ، خطوط نمونه داده ، به طور کامل کنترل کرد.

یا می توان تنظیم کرد که همه این کارها به صورت خودکار در "جریان عملیات" انجام شود.

برای نقل قول دفترچه راهنما:

اتصال ساده CS ، WR1 ، WR2 و XFER و بستن ILE بالا به هر دو ثبت داخلی اجازه می دهد تا ورودی های دیجیتالی کاربردی (جریان) را دنبال کرده و مستقیماً بر خروجی آنالوگ DAC تأثیر بگذارند.

خوب ، چهار اتصال به مجموعه تراشه کم و یک مجموعه 9V - آسان است.

ما نمی خواهیم هیچ ولتاژ منفی خارج شود بنابراین در دفترچه راهنما آمده است که ما باید از "حالت تغییر ولتاژ" استفاده کنیم و آنها نمودار را ارائه می دهند.

تنها کاری که ما باید انجام دهیم این است که یک آمپر کوچک صوتی را به جای آمپلی که آنها پیشنهاد می کنند جایگزین کنیم.

تقویت کننده صوتی LM386-N

دفترچه راهنمای آمپر حداقل قطعات را ارائه می دهد- سود 20 را ارائه می دهد (برای ما بسیار زیاد است- اما دارای کنترل صدا).

تنها کاری که باید انجام دهیم این است که یک خازن بین DAC و آمپر اضافه کنیم تا فقط سیگنال های AC را تقویت کنیم.

ما همچنین باید چند خازن را به پین منبع تغذیه هر یک از تراشه های خود اضافه کنیم ، در غیر این صورت از منبع تغذیه 9 ولت خود صدای خش خش می گیریم.

مرحله 5: از آهن لحیم کاری خارج شوید

از آهن لحیم کاری خارج شوید
از آهن لحیم کاری خارج شوید
از آهن لحیم کاری خارج شوید
از آهن لحیم کاری خارج شوید
از آهن لحیم کاری خارج شوید
از آهن لحیم کاری خارج شوید

از آنجا که مدار ساده است ، من قصد ندارم ضربه ضرب به ضربه را وارد کنم.

در اینجا چند نکته وجود دارد:

  • یک تکه تخته نوار مس را حداقل 28 در 28 سوراخ آماده کنید. (بله ، من می دانم که جراحان مغز می توانند آن را کوچکتر کنند)
  • اگر قصد دارید آن را با پیچ نصب کنید ، در ابتدا اجازه دهید که آنها را نصب کنید!
  • تراشه ها را روی پریزها نصب کنید. تراشه ها را فقط زمانی وارد کنید که همه چیز بررسی شده باشد.
  • سیمهای ورودی را از خروجی دور نگه دارید.
  • قطبیت صحیح خازن ها را رعایت کنید.
  • برای مشاهده نمای اصلی مرجع ولتاژ LM336 به نمودار مراجعه کنید. پای تنظیم شده استفاده نمی شود و قابل برش است.
  • به اتصال مستقیم به پایه 8 DAC توجه کنید- برای آزمایش بسیار مفید است.
  • من با کابل روبان و یک اتصال دهنده IDC 10 راهه به Audino متصل شدم.
  • در Uno اتصالات به صورت مستقیم هستند - ممکن است متوجه شوید که تنظیم 8 اتصال ورودی در یک خط مستقیم به شما امکان می دهد با یک اتصال دهنده خریداری شده 8 راهه آماده به Arduino پیوند دهید ،

پس از اتمام کار ، لحیم کاری را بررسی کرده و شکاف بین خطوط مسی را بررسی کنید.

به نظر من یک تیغ اره هک 36 tpi برای تمیز کردن آوار بسیار مفید است. پین های محل قرارگیری تیغه را برداشته و نوک تیغه را به داخل خط می کشم- بدیهی است که تیغه در یک قاب نیست.

مرحله 6: آزمایش DAC

آزمایش DAC
آزمایش DAC

اتصال بین Circuit و Arduino را خاموش بگذارید.

کنترل صدا را روی مدار خود روی وسط تنظیم کنید.

9V DC Power را به مدار جدید خود وصل کنید.

بررسی کنید که مدار خوب است- من هیچ مسئولیتی در قبال مدار شما نمی پذیرم!

خاموش

مدار خود را به آردوینو وصل کنید.

در Mega از پین های 22-29 استفاده کنید. (PORTA) دو پین 5 ولت بالا را اشتباه نگیرید!

در Uno از پین های 0-7 استفاده کنید. این PORTD است

0 ولت منبع تغذیه خود را به آردوینو به 0 ولت وصل کنید.

برق بزن

این برنامه آزمایشی 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

byte 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) ؛

بهترین راه برای یافتن اطلاعات اندازه داده ، جستجوی کلمه "data" در هدر است.

سپس 4 بایت زیر را که مقدار طولانی را تشکیل می دهند استخراج کنید

retval طولانی بدون امضا ؛

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: وقفه ، وقفه…

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

ما از اطلاعات فرکانس برای ایجاد وقفه نرم افزاری در فرکانس مورد نیاز یا نزدیک آن استفاده می کنیم.

همیشه نمی توان وقفه را به طور دقیق تنظیم کرد ، اما کافی است. فرکانس خوانده شده از فایل به زیر روال setintrupt منتقل می شود.

void setintrupt (freq freq) {float bitval = 8؛ // 8 برای تایمرهای 8 بیتی 0 و 2 ، 1024 برای تایمر 1 بایت

setocroa = (16000000/(Freq*bitval)) - 0.5 ؛

// مقدار setocroa به تفریق -1 نیاز دارد. با این حال 0.5 دور به نزدیکترین 0.5 اضافه کنید

// وضوح تایمر محدود است

// در نهایت با مقدار bitval تعیین می شود

cli ()؛ // وقفه ها را غیرفعال کنید // وقفه تایمر 2 را تنظیم کنید

TCCR2A = 0 ؛ // کل ثبت TCCR2A را روی 0 تنظیم کنید

TCCR2B = 0 ؛ // همان برای TCCR2B

TCNT2 = 0 ؛ // مقدار اولیه شمارنده را تا 0 تنظیم کنید

// تنظیم مقایسه مسابقه برای افزایش فرکانس (هرتز)

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 تعریف می کند

#تعریف cbi (sfr ، bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))

#اندیف

// برای تنظیم بیت های ثبات تعریف می کند

#ifndef sbi

#debine sbi (sfr، bit) (_SFR_BYTE (sfr) | = _BV (bit))

#اندیف

این توابع یک تماس آسان برای تنظیم یا پاک کردن وقفه ارائه می دهند.

بنابراین وقفه در حال اجرا است ، چه کاری می توانیم انجام دهیم؟

مرحله 9: وقفه ها و بافر دوگانه

وقفه ها و بافر دوگانه
وقفه ها و بافر دوگانه
وقفه ها و بافر دوگانه
وقفه ها و بافر دوگانه

در 22 کیلوهرتز هر بایت داده صوتی هر 0.045 میلی ثانیه خروجی می شود

512 بایت (اندازه بافر) در 2.08 میلی ثانیه خوانده می شود.

بنابراین بافر را نمی توان در یک چرخه نوشتن از SDCard خواند.

با این حال 512 بایت در 23.22 میلی ثانیه به پورت نوشته می شود.

بنابراین تنها کاری که باید انجام دهیم این است که هر بار که بافر خالی می شود یک فایل جدید را تنظیم کنیم و زمان کافی برای دریافت داده ها قبل از نیاز به یک بلوک جدید داده داریم … با فرض اینکه از دو بافر استفاده می کنیم ، یکی را هنگام پر کردن دیگری خالی می کنیم.

این بافر دوگانه است.

با وقفه مکرر ، خواندن فایل کند می شود ، اما انجام می شود.

من دو بافر 512 بایت به نام bufa و bufb راه اندازی کرده ام.

اگر alaady flag درست است ما از porta می خوانیم در غیر این صورت از portb می خوانیم

هنگامی که موقعیت بافر (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.

در روال وقفه باید بررسی کنیم که حلقه void با بررسی اینکه readit == false باشد به پایان رسیده است.

در این صورت ما سیگنال می دهیم که یک خواندن دیگر لازم است و پرچم aready را برای تغییر بافر تغییر می دهیم.

اگر کارت SD هنوز در حال خواندن است ، باید یک خوانش را پشت سر بگذاریم (counter--؛ bufcount--؛) و از وقفه خارج شویم تا بعداً دوباره امتحان کنیم. (کلیک بر روی سیگنال خروجی صدا نشان می دهد که این اتفاق افتاده است.)

هنگامی که تمام داده ها خوانده می شوند ، وقفه لغو می شود ، پورت دوباره روی مقدار ولتاژ متوسط 128 تنظیم می شود و فایل صوتی بسته می شود.

قبل از اجرای اسکریپت dac2.ino برای اولین بار ، میزان صدای خود را روی 50٪ تنظیم کنید. این بسیار بلند خواهد بود ، اما بهتر از 100 است!

اگر کنترل صدا شما به صورت معکوس عمل می کند ، سیمهای منتهی در انتهای مخالف پتانسیومتر 10K را تغییر دهید.

به من بگو چگونه صدا می دهد.

توصیه شده: