فهرست مطالب:

انتخاب کننده DIP Tune با استفاده از 1 پین: 4 مرحله
انتخاب کننده DIP Tune با استفاده از 1 پین: 4 مرحله

تصویری: انتخاب کننده DIP Tune با استفاده از 1 پین: 4 مرحله

تصویری: انتخاب کننده DIP Tune با استفاده از 1 پین: 4 مرحله
تصویری: 😉 وقتی شوهرش سرکاره، ربات مرد تمام خواسته های زن را برآورده می کند 2024, جولای
Anonim
انتخاب DIP Tune با استفاده از 1 پین
انتخاب DIP Tune با استفاده از 1 پین

مدتی پیش من روی پروژه "جعبه موسیقی" کار می کردم که باید بین 10 قطعه آهنگ مختلف را انتخاب می کرد. یک انتخاب طبیعی برای انتخاب یک آهنگ خاص ، یک سوئیچ 4 پین بود زیرا 4 سوئیچ 2 را فراهم می کند4= 16 تنظیمات مختلف. با این حال ، اجرای نیروی بی رحم برای این رویکرد به 4 پین دستگاه ، یک پین برای هر سوئیچ نیاز دارد. از آنجا که من قصد داشتم از ATtiny85 برای توسعه استفاده کنم ، از دست دادن 4 پین بسیار زیاد بود. خوشبختانه به مقاله ای برخورد کردم که یک روش مبتکرانه برای استفاده از 1 پین آنالوگ برای مدیریت ورودی های سوئیچ متعدد را شرح می داد.

تکنیک چند سوئیچ ؛ 1 ورودی از یک مدار تقسیم ولتاژ برای ارائه یک عدد صحیح منحصر به فرد برای هر 16 ترکیب احتمالی تنظیم سوئیچ استفاده می کند. این مجموعه از 16 شناسه صحیح سپس در برنامه کاربردی برای مرتبط کردن یک عمل با یک تنظیم استفاده می شود.

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

مرحله 1: سخت افزار مورد نیاز

سخت افزار مورد نیاز
سخت افزار مورد نیاز

استفاده از UNO به عنوان بستر پیاده سازی ، تعداد اجزای سخت افزاری مورد نیاز را به حداقل می رساند. اجرای روش ورودی چند سوئیچ تنها به یک سوئیچ 4 پینی ، 5 مقاومت مورد استفاده برای تقسیم ولتاژ و سیم اتصال برای اتصالات نیاز دارد. یک زنگ پیزو برای پیکربندی انتخاب کننده تنظیمات جعبه موسیقی به پیکربندی اضافه می شود. به صورت اختیاری ، بسته به نوع سوئیچ استفاده شده ، استفاده از سوکت 8 * 2 پین 2 برای اتصال سوئیچ شیب دار به نانبرد از آنجا که به نظر می رسد پین های سوئیچ استاندارد برای لحیم کاری به یک تخته چوبی ساخته شده اند که مستقیماً به تخته نان متصل نمی شوند. سوکت اتصالات سوئیچ را تثبیت می کند و هنگام تنظیم سوئیچ های تعویض ، سوئیچ را به راحتی بلند نمی کند.

نام منبع احتمالی چگونه استفاده می شود
سوئیچ شیب 4 پین انتخاب آهنگ
سوکت پین 2x4 (اختیاری) آمازون پست های اکثر سوئیچ های دیپ سوئیچ را به خوبی در تخته نان نگه نمی دارند. یک سوکت به محکم تر شدن اتصال کمک می کند. یک راه حل دیگر پیدا کردن یک سوئیچ دیپ است که واقعاً برای استفاده از تخته نان با پین های IC معمولی ساخته شده است.

مقاومت ها:

  • 10K 2 2
  • 20 هزار
  • 40K
  • 80 هزار
اجرای تقسیم ولتاژ
وزوز پیزو منفعل آمازون ملودی را به وسیله برنامه از طریق عملکرد آردوینو اجرا کنید

مرحله 2: توضیح روش چند سوئیچ

توضیح روش چند سوئیچ
توضیح روش چند سوئیچ

این بخش مفاهیم اساسی روش چند سوئیچ را مورد بحث قرار می دهد و معادلات مورد نیاز برای محاسبه مستقل شناسه های منحصر به فرد برای هر یک از 16 پیکربندی تنظیمات احتمالی سوئیچ را ایجاد می کند. این شناسه ها را می توان در یک برنامه کاربردی برای پیوند پیکربندی سوئیچ با یک عمل استفاده کرد. به عنوان مثال ، ممکن است بخواهید تنظیمات - روشن 1 ، 2 خاموش ، 3 خاموش ، 4 خاموش (1 ، 0 ، 0 ، 0) - برای بازی Amazing Grace و (0 ، 1 ، 0 ، 0) برای پخش شیر امشب می خوابد. برای اختصار و مختصر بودن ، شناسه های پیکربندی در بقیه سند به عنوان مقایسه کننده نامیده می شوند.

تصویر
تصویر

مفهوم اساسی برای روش چند سوئیچ مدار تقسیم ولتاژ است که از 2 مقاومت سری متصل به ولتاژ ورودی تشکیل شده است. سرب ولتاژ خروجی بین مقاومتها ، R وصل شده است1 و آر2، همانطور که در بالا نشان داده شده. ولتاژ خروجی تقسیم کننده با ولتاژ ورودی ضرب در نسبت مقاومت R محاسبه می شود2 به مجموع R1 و آر2 (معادله 1). این نسبت همیشه کمتر از 1 است بنابراین ولتاژ خروجی همیشه کوچکتر از ولتاژ ورودی است.

همانطور که در نمودار طراحی بالا نشان داده شده است ، چند سوئیچ به عنوان تقسیم کننده ولتاژ با R پیکربندی شده است2 ثابت و R1 برابر با مقاومت ترکیبی/معادل مقاومت 4 سوئیچ دیپ. مقدار R1 بستگی به این دارد که کدام سوئیچ ها روشن هستند و بنابراین به مقاومت کامپوزیت کمک می کند. از آنجا که مقاومتهای سوئیچ شیب به موازات یکدیگر هستند ، معادله محاسبه مقاومت معادل از نظر متقابل مقاومتهای جزء بیان می شود. برای پیکربندی ما و موردی که همه سوئیچ ها روشن هستند ، معادله تبدیل می شود

1/R1 = 1/80000 + 1/40000 + 1/20000 + 1/10000

دادن R1 = 5333.33 ولت با توجه به این واقعیت که اکثر تنظیمات حداقل یکی از سوئیچ ها را خاموش کرده اند ، از حالت سوئیچ به عنوان ضرب کننده استفاده می شود:

1/R1 = ث1*1/80000 + ثانیه2*1/40000 + ثانیه3*1/20000 + ثانیه4*1/10000 (2)

جایی که ضرب کننده حالت ، sمن، در صورت روشن بودن کلید برابر 1 و در صورت خاموش بودن کلید برابر 0 است. R1 اکنون می توان برای محاسبه نسبت مقاومت مورد نیاز در معادله 1 استفاده کرد. با استفاده از موردی که همه سوئیچ ها دوباره روشن هستند به عنوان مثال

نسبت = R2/(R1+R2) = 10000/(5333.33+10000) =.6522

آخرین مرحله در محاسبه مقدار مقایسه کننده پیش بینی شده ضرب RATIO در 1023 به منظور شبیه سازی اثر تابع analogRead است. سپس شناسه موردی که همه سوئیچ ها روشن هستند وجود دارد

مقایسه کننده15 = 1023*.6522 = 667

اکنون همه معادلات برای محاسبه شناسه ها برای 16 تنظیمات سوئیچ امکان پذیر است. به طور خلاصه:

  1. R1 با استفاده از معادله 2 محاسبه می شود
  2. R1 و آر2 برای محاسبه نسبت مقاومت مرتبط استفاده می شود
  3. برای بدست آوردن مقدار مقایسه ، RATIO در 1023 ضرب می شود
  4. به صورت اختیاری ، ولتاژ خروجی پیش بینی شده نیز می تواند به عنوان RATIO*Vin محاسبه شود

مجموعه مقایسه کننده ها فقط به مقادیر مقاومت بکار رفته در تقسیم ولتاژ بستگی دارد و امضای منحصر به فردی برای پیکربندی است. از آنجا که ولتاژهای خروجی تقسیم کننده از اجرا به اجرا در نوسان است (و برای خواندن خوانده می شود) ، منحصر به فرد در این زمینه به این معنی است که در حالی که دو مجموعه شناسه ممکن است دقیقاً یکسان نباشند ، اما به اندازه کافی نزدیک هستند که تفاوت های مقایسه اجزاء در یک قبل کوچک قرار می گیرد. فاصله مشخص شده پارامتر اندازه فاصله باید به اندازه کافی بزرگ انتخاب شود تا نوسانات مورد انتظار را در نظر بگیرد اما به اندازه کافی کوچک باشد تا تنظیمات مختلف سوئیچ با یکدیگر همپوشانی نداشته باشند. معمولاً 7 برای فاصله نیم عرض خوب عمل می کند.

مجموعه ای از مقایسه کننده ها برای یک پیکربندی خاص را می توان با چندین روش بدست آورد - برنامه نمایشی را اجرا کرده و مقادیر مربوط به هر تنظیم را ثبت کنید. برای محاسبه از صفحه گسترده در بخش بعدی استفاده کنید. یک مجموعه موجود را کپی کنید همانطور که در بالا ذکر شد ، همه مجموعه ها به احتمال زیاد کمی متفاوت خواهند بود اما باید کار کنند. پیشنهاد می کنم در صورت تغییر شدید مقاومت یا افزودن مقاومت بیشتر ، از مجموعه شناسه های نویسنده روش برای تنظیم چند سوئیچ و صفحه گسترده از بخش بعدی استفاده کنید.

برنامه نمایشی زیر استفاده از مقایسه ها را برای شناسایی تنظیمات فعلی سوئیچ نشان می دهد. در هر چرخه برنامه یک analogRead برای به دست آوردن شناسه برای پیکربندی فعلی انجام می شود. سپس این شناسه در سراسر لیست مقایسه مقایسه می شود تا مطابقت پیدا شود یا لیست تمام شود. اگر مطابقت یافت شد ، یک پیام خروجی برای تأیید صادر می شود. اگر پیدا نشد هشدار صادر می شود تاخیر 3 ثانیه ای در حلقه وارد می شود تا پنجره خروجی سریال مملو از پیام ها نشود و برای بازنشانی پیکربندی دیپ سوئیچ مدتی وقت بگذارید.

//-------------------------------------------------------------------------------------

// برنامه نمایشی برای خواندن خروجی تقسیم ولتاژ و استفاده از آن برای شناسایی پیکربندی // سوئیچ جریان فعلی با مشاهده مقدار خروجی در یک آرایه از مقادیر // مقایسه برای هر تنظیم ممکن. مقادیر موجود در آرایه جستجو می توانند // یا از پیکربندی قبلی برای پیکربندی یا از طریق محاسبه // بر اساس معادلات زیر به دست آیند. // ---------------------------------------------------- -------------------------------------- int مقایسه [16] = {0 ، 111 ، 203 ، 276 ، 339 ، 393 ، 434 ، 478 ، 510 ، 542 ، 567 ، 590 ، 614 ، 632 ، 651 ، 667} ؛ // تعریف متغیرهای پردازش int dipPin = A0؛ // پین آنالوگ برای ورودی تقسیم ولتاژ int dipIn = 0؛ // دارای ولتاژ تقسیم کننده ترجمه شده توسط analogRead int count = 0؛ // حلقه شمارنده int epsilon = 7؛ // مقایسه فاصله نیم عرض bool dipFound = false؛ // true اگر خروجی تقسیم کننده ولتاژ فعلی در جدول بالا مشاهده شود void setup () {pinMode (dipPin، INPUT)؛ // پیکر تقسیم ولتاژ را به عنوان INPUT Serial.begin (9600) پیکربندی کنید ؛ // فعال کردن ارتباط سریال} حلقه void () {تاخیر (3000)؛ // خروجی را از پیمایش سریع نگه دارید // مقداردهی اولیه پارامترهای جستجو = 0؛ dipFound = false؛ // خواندن و ثبت ولتاژ خروجی جریان فعلی dipIn = analogRead (dipPin) ؛ Serial.print ("خروجی تقسیم کننده") ؛ Serial.print (dipIn) ؛ // لیست مقایسه را برای مقدار جاری جستجو کنید ((تعداد <16) && (! dipFound)) {if (abs (dipIn - comparator [count]) <= epsilon) {// آن را پیدا کرد dipFound = true؛ Serial.print ("در ورودی یافت می شود") ؛ Serial.print (تعداد) ؛ Serial.println ("value" + String (comparator [count])) ؛ زنگ تفريح؛ } شمارش ++ ؛ } if (! dipFound) {// مقدار در جدول نیست؛ نباید اتفاق بیفتد Serial.println ("OOPS! Not found؛ بهتر است با Ghost Busters تماس بگیرید")؛ }}

مرحله 3: صفحه گسترده مقایسه کننده

تصویر
تصویر

محاسبات 16 مقايسه كننده در صفحه گسترده نشان داده شده در بالا آمده است. فایل اکسل همراه برای دانلود در انتهای این بخش موجود است.

ستون های صفحه گسترده A-D مقادیر مقاومت سوئیچ و 16 تنظیمات سوئیچ ممکن را ثبت می کند. لطفاً توجه داشته باشید که کلید سخت افزاری DIP نشان داده شده در نمودار طراحی سرسخت در واقع از چپ به راست به جای شماره گذاری از راست به چپ نشان داده شده در صفحه گسترده شماره گذاری می شود. من این را تا حدودی گیج کننده دیدم ، اما جایگزین پیکربندی "1" (0 ، 0 ، 0 ، 1) را در اول لیست قرار نمی دهد. ستون E از فرمول 2 بخش قبل برای محاسبه مقاومت معادل تقسیم کننده ولتاژ R استفاده می کند1 برای تنظیم ستون F از این نتیجه برای محاسبه RATIO مقاومت مرتبط استفاده می کند و در نهایت ، ستون G RATIO را در مقدار analogRead max (1023) ضرب می کند تا مقدار مقایسه کننده پیش بینی شده را بدست آورد. 2 ستون نهایی شامل مقادیر واقعی از اجرای برنامه نمایشی به همراه تفاوت بین مقادیر پیش بینی شده و واقعی است.

در قسمت قبل به سه روش برای به دست آوردن مجموعه ای از مقادیر مقایسه کننده از جمله پسوند این صفحه گسترده اشاره شده است در صورتی که مقادیر مقاومت به طور قابل توجهی تغییر کرده یا کلیدهای بیشتری اضافه شوند. به نظر می رسد تفاوتهای کوچک در مقادیر مقاومت بر نتایج نهایی تأثیر چندانی ندارد (این خوب است زیرا مشخصات مقاومت ، مثلاً 5 tole تحمل می دهد و مقاومت به ندرت برابر مقدار اعلام شده واقعی آن است).

مرحله 4: پخش آهنگ

پخش آهنگ
پخش آهنگ

برای نشان دادن نحوه استفاده از تکنیک چند سوئیچ در برنامه ، برنامه نمایشی مقایسه از بخش "توضیح روش" برای پیاده سازی پردازش انتخاب آهنگ برای برنامه جعبه موسیقی اصلاح شده است. پیکربندی برنامه به روز شده در بالا نشان داده شده است. تنها چیزی که به سخت افزار اضافه می شود یک زنگ پیزو منفعل برای پخش آهنگ انتخابی است. تغییر اساسی در نرم افزار افزودن یک روال معمول برای پخش آهنگ ، پس از شناسایی ، با استفاده از زنگ و روال آردوینو است.

قطعات لحن موجود در یک فایل هدر ، Tunes.h ، همراه با تعریف ساختارهای پشتیبانی لازم وجود دارد. هر آهنگ به عنوان آرایه ای از ساختارهای مربوط به نت شامل فرکانس و مدت زمان نت ها تعریف می شود. فرکانس های یادداشت در یک فایل هدر جداگانه ، Pitches.h قرار دارد. فایلهای برنامه و سرصفحه در انتهای این قسمت برای بارگیری در دسترس هستند. هر سه فایل باید در یک دایرکتوری قرار گیرند.

انتخاب و شناسایی به شرح زیر انجام می شود:

  1. "کاربر" سوئیچ های دیپ را در پیکربندی مربوط به آهنگ مورد نظر تنظیم می کند
  2. در هر چرخه حلقه برنامه ، شناسه تنظیمات سوئیچ فعلی از طریق analogRead به دست می آید
  3. شناسه پیکربندی مرحله 2 با هر یک از مقایسه کنندگان موجود در لیست لحن موجود مقایسه می شود
  4. اگر مطابقت پیدا شد ، روال playTune با اطلاعات مورد نیاز برای دسترسی به لیست آهنگ های یادداشت فراخوانی می شود

    با استفاده از عملکرد لحن آردوینو ، هر نت از طریق زنگ صدا پخش می شود

  5. اگر مطابقت پیدا نشد ، اقدامی انجام نمی شود
  6. 1-5 را تکرار کنید

تنظیمات سوئیچ DIP برای آهنگ های موجود در جدول زیر نشان داده شده است که در آن 1 به معنی روشن بودن کلید ، 0 خاموش است. به یاد بیاورید که نحوه سوئیچ دیپ سوئیچ سوئیچ 1 را در سمت چپ ترین حالت (موقعیتی که مربوط به مقاومت 80K است) قرار می دهد.

نام سوئیچ 1 سوئیچ 2 سوئیچ 3 سوئیچ 4
دنی پسر 1 0 0 0
خرس کوچک 0 1 0 0
شیر امشب می خوابد 1 1 0 0
هیچ کس مشکل را نمی داند 0 0 1 0
گریس شگفت انگیز 0 0 0 1
فضای خالی 1 0 0 1
MockingBird Hill 1 0 1 1

کیفیت صدا از زنگ پیزو قطعا عالی نیست اما حداقل قابل تشخیص است. در واقع اگر تن ها اندازه گیری شوند ، بسیار نزدیک به فرکانس دقیق نت ها هستند. یکی از تکنیک های جالب استفاده شده در برنامه ، ذخیره داده های آهنگ در قسمت فلش/حافظه برنامه به جای بخش حافظه داده پیش فرض با استفاده از دستور PROGMEM است. بخش داده ها متغیرهای پردازش برنامه را نگه می دارد و بسیار کوچکتر است ، حدود 512 بایت برای برخی از میکروکنترلرهای ATtiny.

توصیه شده: