مطالب اینترنتی




در این مقاله طرز ساخت یک کیبورد موزیکال مونوفونیک (تک نتی) آموزش داده می شود که می تواند فرکانس نت های موسیقی را با استفاده از میکروکنترلر ATMega 8 تولید کند.پروژه ای که در این مقاله آورده شده دارای ۱۲ کلید است، کلیدهای مربوط به یک نت و نیز تعدادی کلید برای تنظیمات زیر:

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

فرکانس های نت های موزیکال

تصویر زیر بخش از کلیدهای یک پیانو را نشان می دهد که هر کلید آن دارای یک فرکانس خاص است. نت های موسیقی به شکل زیر نامگذاری می شوند.

برای دریافت فرکانس هر کدام از کلیدهای بالا نیز می توان از این لینک ویکی استفاده کرد. با شناختن فرکانس مخصوص به هر نت از جدول فرکانس ها، می توان با استفاده از میکروکنترلر یک موسیقی ساخت. در این پروژه ۱۲ کلید خاص به همان شکلی که در تصویر بالا نشان داده شده قرار دارد و فرکانس هر نت به اکتاو کلیدی که فشار داده شده است وابسته است. در پیانو از ۰ تا ۸ اکتاو وجود دارد.

ساخت فرکانس مورد نظر با استفاده از یک میکروکنترلر

با استفاده از یک میکروکنترلر که دارای خروجی دیجیتال است می توان امواج مربعی با فرکانس هایی در محدوده نت های موسیقی ایجاد کرد. واحد تایمر – کانتر در میکروکنترلر که دارای ۱۶ بیت است برای تولید موج مربعی با فرکانس مورد نظر به کار گرفته شده است. واحد تایمر – کانتر تایمر در حالت CTC تنظیم شده و هر زمان که یک تطبیق بین مقدار TCNT1 و رجیستر مقایسه ای خروجی رخ دهد، خروجی مقایسه ای پین A1 تغییر وضعیت می دهد. هر زمان که یک کلید فشرده شود، رجیستر مقایسه کننده خروجی مربوط به Timer1 با مقدار فرکانس متناظر مربوط به کلید فشرده شده بارگذاری می شود. دیتاشیت زیر مربوط به رجیستری است که از میان رجیسترهای شرح داده شده معرفی شده است:

در این برنامه کیبورد موزیکال مقادیر رجیستر به شکل هگزا دسیمال بوده که در زیر نشان داده شده است.

  • TCCRA = 0X40
  • TCCR1B = ۰X0B

تایمر با استفاده از مقدار تقسیم کننده به گونه ای تنظیم می شود تا در فرکانسی که از پیش تعیین شده شروع به کار کند. در اینجا از نوسان ساز داخلی ۸ مگاهرتز میکروکنترلر استفاده شده تا علاوه بر کم شدن تعداد تجهیزات خارجی بتوان از پایه های بیشتری از میکروکنترلر به جهت پورت های ورودی و خروجی استفاده کرد. با انتخاب این نوسان ساز فرکانس داخلی مربوط به cpu در میکروکنترلر ۸ مگاهرتز خواهد بود و برای مثال می توان با انتخاب مقدار ۸ برای تقسیم کننده در تایمر، فرکانس آن را به ۱ مگاهرتز تبدیل کرد یعنی این تایمر در هر ثانیه ۱۰۰۰۰۰۰ بار خواهد شمرد. لازم است تا فرکانس ۱۰۰ هرتز را بر روی پین OC1A قرار داده و فرکانس ۱۰۰ هرتز متناظر با مقدار ۱۰۰۰۰ برای شمارنده تایمر خواهد بود.

از آنجایی که لازم است تا شکل موج متقارن باشد، مقدار پین OC1A در اولین نیمه ی دوره زمانی در وضعیت بالا و در نیمه ی دوم دوره زمانی در وضعیت پایین خواهد بود. به دلیل اینکه فرکانس ۱۰۰ هرتز متناظر با مقدار ۱۰۰۰۰ مربوط به شمارنده تایمر است، رجیستر تطبیق مقایسه با مقدار ۵۰۰۰ تنظیم شده است. پس از آنکه واحد تایمر – کانتر از صفر شروع به کار کرد، مقدار پین OC1A در زمانی که مقدار شمارنده به ۵۰۰۰ می رسد تغییر می کند ( برای مثال مقدار پین OC1A از بالاترین به پایین ترین مقدار می رسد). مقدار شمارنده توسط پردازنده و در حالت اجرای تایمر دوباره به صفر بازگردانده می شود. پس از آن دوباره و در زمانی که مقدار شمارش شده به ۵۰۰۰ برسد پین OC1A دوباره تغییر می کند ( در اینجا مقدار آن به بالاترین حالت می رسد). بنابرین یک چرخه کامل می شود و این چرخه تا زمانی که دستوری برای متوقف شدن تایمر دریافت شود ادامه پیدا می کند.

در زمانی که یک مدار شروع به کار کند، هنگامی که یک کلید فشرده شود رجیستر مقایسه خروجی OCR1A با مقدار متناظر مربوط به فرکانس کلید فشرده شده بارگذاری می شود و تایمر شروع به کار می کند. زمانی که کلید فشرده شده رها شود پردازنده منتظر می ماند تا پین OC1A به کمترین مقدار برسد و سپس تایمر متوقف می شود. در غیر این صورت اگر تایمر با پین OCR1A که در وضعیت مقدار بالای خود قرار دارد متوقف شود، بلندگو حتی در وضعیت بدون صدا نیز جریان می کشد زیرا هسته داخل بلندگو مانند یک بار در حال فعالیت است. بنابرین یک نت موسیقی نواخته می شود.

در ساختنی بخوانید : ساخت مدار یک لامپ اضطراری همه کاره با LM358

دیاگرام مدار کیبورد موزیکال

مدار کیبورد موزیکال با استفاده از میکرو کنترلر ATMega8

مدار کیبورد موزیکال با استفاده از میکرو کنترلر ATMega8

این مدار شامل یک میکروکنترلر ATmega8، تعداد ۲۰ عدد کلید از نوع فشاری که به شکل یک ماتریس ۵*۴ منظم شده اند، ۱۲ عدد چراغ LED برای نمایش فشرده شدن کلید، تعدادی مقاومت برای محدود کردن جریان و استفاده برای pull up، یک ترانزیستور از نوع BC547 برای راه اندازی بلندگو (هدفون)، یک سوکت استریو استاندارد ۳٫۵ میلی متری برای اتصال هدفون به میکرو کنترلر می باشد.

نحوه تولید فرکانس پس از فشردن کلید

نحوه معرفی کلیدها به شکلی مشابه با معرفی یک صفحه کلید ماتریسی است. برای توضیح دقیق تر در مورد صفحه کلید ماتریسی می توان از مطالب موجود در این مورد در اینترنت استفاده کرد.کلید های ۱ تا ۱۲ به عنوان نت های موسیقی استفاده شده و کلید های باقی مانده برای کلیدهای عملیاتی و تنظیماتی ساتفاده شده است. بنابرین رمانی که یک کلید فشرده می شود اگر از بین کلیدهای ۱ تا ۱۲ باشد تایمر ۱ با فرکانس مربوط به آن و در نظر گرفتن مقدار اکتاو شروع به کار می کند. برای دسترسی به تمامی نت ها، فرکانس متناظر برای هر اکتاو در یک آرایه دو بعدی قرار داده شده است. در بعد اول اکتاوها و در بعد دوم مقدار فرکانس مربوط به آن نت قرار می گیرد. از آنجایی که ۹ اکتاو وجود دارد و هر اکتاو شامل ۱۲ نت غیر مشابه است، اندازه این آرایه دو بعدی [۹][۱۲] خواهد بود. برای فراخوانی نت ها با استفاده از شماره کلید آنها، محل نت های شماره ۱ تا ۱۲ در آرایه قرار داده شده که منجر به ایجاد آرایه ای با ابعاد [۹][۱۳] می شود.

جدول فرکانسی که در زیر قرار داده شده به شکل یک آرایه دو بعدی است و آرایه فرکانس شامل نت ها در شکل C,C و غیره … است که برابر با کلید های ۱ تا ۱۲ است. در برنامه، این بخش در قسمت تعاریف عمومی یا global آورده شده است. این نوشته های الفبایی را می توان با اعداد واقعی جایگزین کرد.

کد برنامه کیبورد موزیکال

جدول فرکانسی نت ها

اکنون با استفاده از این آرایه می توان هر کدام از نت های موسیقی را نواخت. برای مثال اگر نت C5 مورد نظر باشد ( C امین نت از پنجمین اکتاو) تنها کافیست فرکانس [۵][۱] فراخوانی شود. بنابرین پس از فشرده شدن یک کلید، نت متناظر با آن نواخته می شود. توجه شود که اکتاوی که به عنوان پیش فرض بر روی برنامه قرار داده شده است اکتاو چهارم می باشد که می توان آن را در زمان اجرای برنامه تغییر داد. یک پیانو شامل نت ها تا ‘A8’ است که نت های پس از آن با نام A8 در آرایه داده شده تکرار شده است.

نمایش کلید فشار داده شده یا نت هر کلید

این مدار شامل یک بخش نمایش دهنده برای هر کدام از ۱۲ نت موسیقی است. این بخش نه تنها کلید فشرده شده را نشان می دهد بلکه نتی که در حال نواخته شدن هست را نیز نمایش می دهد از انجایی که ۱۲ نت وجود دارد به طور عمومی نیاز به ۱۲ پین ورودی/خروجی در میکروکنترلر است. اما در اینجا از روش ماتریسی استفاده شده است که این کار تعداد پین های ورودی/خروجی را با استفاده از تعریف یک ماتریس ۳*۴ از ۱۲ به ۷ عدد کاهش می دهد. چراغ های LED به گونه ای تنظیم شده اند که ۴ ستون و ۳ ردیف وجود دارد. ستون ها قطب های منفی LED ها و ردیف ها قطب های مثبت آنها هستند. برای فعال سازی یک LED، پین مربوط به ستون باید در سطح منطقی ۱ بوده و پین مربوط به ردیف باید در سطح منطقی ۰ قرار گیرد.

در ساختنی بخوانید : گرم کننده لنز های تلکسوپ برای رصد در روزهای سرد

هر زمان که یک کلید فشرده شود، LED متناظر با آن فورا و پس از شناسایی کلید فعال می شود. پس از رها شدن آن کلید، چراغ LED متناظر نیز غیر فعال می گردد. در زمان نواخته شدن نت، چراغ LED با فراخوانی یک عملکرد تعریف شده توسط کاربر که به شکل ‘key_led()’ تعریف می شود، فعال می گردد. خروجی صوتی که در ویدیوی زیر نشان داده شده است تفاوت بین اکتاو اول و دوم و نیز زوشن شدن LED با فشردن کلید متناظر با آن را نشان می دهد .

تغییر و نشان داده اکتاو

پس از تشخیص فشار دادن یک کلید، اگر کلید در بین کلید های شماره ۱ تا ۱۲ نباشد، مشخص می شود که یک کلید عملکردی فشرده شده که این کلیدها در بخش ‘switch statement’ معرفی شده اند. موارد ۱۵ و ۱۶ به ترتیب برای بالابردن و پایین آوردن اکتاو قرار داده شده اند. در این بخش از یک شمارنده دهدهی برای نشان دادن انتخاب صحیح اکتاو استفاده شده است. اگر یک میکروکنترلر با تعداد زیادی پین ورودی/خروجی برای این پروژه انتخاب شود، می توان این کانتر دهدهی را حذف کرده و ان را مستقیما با استفاده از پین های ورودی/خروجی میکروکنترلر نمایش داد.

اگر کلید ۱۵ فشار داده شود مقدار اکتاو نهایتا تا عدد ۸ بالا می رود و در غیر این صورت اگر کلید ۱۶ فشار داده شود اکتاو نهایتا تا عدد ۰ پایین می آید. پس از هر بار افزایش یا کاهش اکتاو، یک سیگنال اصلی جهت ریست کردن شمارنده دهدهی فرستاده می شود و مجموعه حاوی پالسهای مربوط به اکتاو جدید به شمارنده دهدهی ارسال می شود بنابرین مقدار صحیح اکتاو بر روی یک نمایشگر نواری نشان داده می شود.

پخش کردن یک صوت برنامه ریزی شده

هر صوت حاوی تعداد محدودی نت است که به شکل یک چرخه نواخته می شوند. چرخه نت ها دارای ۴ بایت اطلاعات است:

  • اکتاو هر نت
  • خود نت
  • زمان هر نت
  • زمان فاصله خالی که باید قبل از نواختن نت بعدی قرار داده شود.

با قرار دادن تعدادی چرخه نت در پشت سر هم می توان یک موسیقی کامل را تشکیل داد. برای یک موسیقی نیاز به یک آرایه تک بعدی است که موسیقی در آن ذخیره شود. محل ۰ ام در هر آرایه حاوی مجموع مکان هایی است که برای دانستن نقطه پایان موسیقی در آرایه استفاده شده است.

اولین مکان در هر چرخه نت شامل اکتاو نت و دومین مکان حاوی شماره واقعی نت است. اکنون سومین مکان حاوی مقداری متناسب با زمان است. برای مثال زمان برابر با ۱ نشان می دهد که شمارنده تایمر باید از ۰ تا ۲۵۵ را در یک چرخه فرکانس بشمارد. به طور مشابه، مکان چهارم حاوی مقدار متناظر با فاصله زمانی خالی بین دو نت می باشد که کمترین مقدار این فاصله ۱ است.

هنگامی که دستوری برای پخش یک موسیقی دریافت می شود، اولین نت از مکان یک و دو ( اکتاو و نت) از مکان مربوط به صوت در آرایه خوانده می شود و زمان نواخته شدن نت در متغیر ‘duration’ و در مکان سوم آرایه قرار می گیرد. اکنون تایمر ۲شروع به کار کرده و پردازنده ستونی که شامل کلید Stop است را فعال می کند و تا زمانی که صوت در حال پخش به پایان برسد درون حلقه ‘do while’ توقف می کند. هر زمانی پس از اینکه شمارنده به ۲۵۵ برسد یک وقفه ایجاد می شود و متغیر موقتی ‘temp3’ در زیر برنامه وقفه افزایش می یابد و بررسی می کند که آیا این متغیر برابر با مدت زمان صوت یا duration برابر شده است یا خیر. اگر temp3 با duration برابر شده باشد، سپس تایمر۲ و تایمر۱ متوقف شده و پخش صوت خاتمه می یابد. در این زمان مقدار متغیر temp3 ریست شده و به ۰ باز می گردد و چهارمین مکان از آرایه مربوط به صوت برای مشخص شدن فاصله خالی زمانی بین دو نت خوانده می شود. دوباره تایمر۲ شروع به کار کرده و متغیر temp3 مانند قبل برای بررسی برابر شدنش با duration بررسی می شود. در صورت برابری تایمر۲ متوقف شده و مقدار temp3، ۰ می شود و این چرخه برای هر نت تکرار می شود. این عملیات تا زمانی که بخش tune_index از اندازه آرایه مربوط به صوت کمتر شود ادامه می یابد ( مقدار موجود در مکان صفرم از آرایه صوت). زیر برنامه وقفه برای پخش پشت سر هم نت های مربوط به صوت پس از شروع به کار آن در زیر نشان داده شده است:

در ساختنی بخوانید : آموزش ساخت : با زیپ ها و نمد گردنبند زیپی درست کنید

زمانی که مقدار tune_index به پایان مکان آرایه صوت می رسد، مقدار متغیر ‘end_tune’ به ۱ تغییر می کند. این متغیر برای بیرون آمدن از حلقه ‘do while’ استفاده می شود. حلقه do wihe کلید stop را در زمان پخش صوت نشان می دهد. اگر کلید stop در زمان پخش یک صوت فشرده شود، شرط حلقه do while غلط شده و پخش صوت با متوقف شدن تایمر پایان می یابد.

در کد برنامه ای که برای دانلود قرار داده شده، نت صوت معروف تولدت مبارک” در آرایه tune[1] قرار داده شده است. می توان صوت های مورد نظر دیگر را در بخش مربوط به آن تعیرف کرده و در آرایه های tune[2] و tune[3] و … قرار داد. شماره مربوط به صوت هایی که در برنامه تعریف می شود با افزایش عدد صحیح در کنار کلمه tune شکل می گیرد و برای پخش آنها می توان با استفاده از کلید های ‘Next’ یا ‘Previous’ در بین آنها جا به جا شد.

ضبط یک صوت

برای ضبط یک صوت، روشی که در پخش یک صوت انجام شد به صورت مع در پیش گرفته می شود. برای مثال چهار بایت برای هر چرخه نت از ورودی و تغییرات کلیدها خوانده می شود. هنگامی که یک کلید فشرده می شود، فرکانس به صورت معمول تولید می شود. برای ضبط اطلاعات مربوط به تایمری که فعال شده و اکتاو و نت، شماره کلید باید در آرایه ‘tune’ نوشته شود. در این قسمت صوت ضبط شده در ‘tune[0][tune_index]’ نوشته می شود. پس از رها شدن کلید، تایمر متوقف شده و مقدار شمارش شده در آرایه ذخیره می شود. سپس دوباره تایمر برای ذخیره فاصله زمانی میان کلید فشرده شده اول و دوم فعال می شود ( زمان سکوت بین دو نت متوالی). هنگامی که کلید دوم فشرده می شود، تایمر متوقف شده و مقدار شمارش شده در آرایه ذخیره می شود. شمارشگر مربوط به آرایه در هر جا که نیاز باشد افزایش می یابد و بنابرین اطلاعات یک چرخه نت خوانده شده و پس از آن در حافظه RAM میکروکنترلر ذخیره می شود.

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

در این قسمت از تایمر۰ برای اندازه گیری زمان فشرده شدن کلید استفاده شده است. این تایمر با تقسیم زمانی ۲۵۶ (Fcpu/256) راه اندازی شده و وقفه سرریز نیز فعال است. هر زمان که سرریز رخ دهد، متغیر تایمر ۰ در زیر برنامه وقفه به میزان ۱ عدد افزایش پیدا می کند. مقدار رجیستر مربوط به شمارنده زمان برای پخش و ضبط یک صوت از نوع هگزادسیمال و به شکل زیر است:

  • برای تایمر۲: TCCR2= 0X0E
  • OCR2 = 0XFF
  • برای تایمر۰: TCCR0 = 0X04

ذخیره یک صوت

ر این پروژه امکان ذخیره صوت در بخش EEPROM وجود دارد. شمارنده صوت یا tune index در مکان صفرم از آرایه صوت نوشته شده است. یک حلقه for با میزان اجرا شدن برابر با tune index فعال می شود و آرایه صوت را در حافظه EEPROM می نویسد. در زمانی روشن شدن دستگاه یا ری استارت آن، این صوت بر روی آرایه tune[0] کپی می شود. این صوت تا زمانی که صوت دیگری بر روی آن جایگزین نشود در حافظه EEPROM باقی می ماند. با استفاده از میکروکنترلری که دارای فضای کافی RAM و EEPROM باشد به سادگی می توان کد برنامه را برای ذخیره صوت های چندتایی تغییر داد.

بلندگوی استفاده شده در این پروژه کیبورد موزیکال، یک هدفون است اما می توان این دستگاه را به یک تقویت کننده متصل کرد. تجربیات خود را با ساختنی در میان بگذارید.

منبع

بیشتر بخوانید:

[ad_2]

لینک منبع

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


آخرین جستجو ها