فهرست مطالب:
- تدارکات
- مرحله 1: دور زدن
- مرحله 2: نمودار زمان بندی
- مرحله 3: برنامه نویسی ماکروها و تعاریف
- مرحله 4: برنامه نویسی حلقه اصلی
- مرحله 5: برنامه نویسی توابع کمکی
- مرحله ششم: برنامه نویسی روالهای Protothread
- مرحله 7: داخلی
تصویری: برنامه نویسی همزمان Attiny85 یا کدو با چشمان چند رنگ: 7 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:52
توسط jumbleviewJumbleview.info بیشتر توسط نویسنده دنبال کنید:
درباره: من به عنوان مهندس نرم افزار در یکی از شرکت های Bay Area (کالیفرنیا) کار می کنم. هر زمان که وقت داشتم دوست داشتم کنترلرهای کوچک را برنامه ریزی کنم ، اسباب بازی های مکانیکی بسازم و پروژه های بهسازی خانه بسازم. اطلاعات بیشتر درباره jumbleview »
این پروژه نحوه کنترل دو LED معمولی آند سه رنگ 10 میلی متری (چشم های چند رنگ کدو تنبل هالووین براق) با تراشه Attiny85 را نشان می دهد. هدف پروژه این است که خواننده را با هنر برنامه نویسی همزمان و استفاده از کتابخانه پیش ساخته Adam Dunkels آشنا کند. این پروژه فرض می کند که خواننده درباره کنترلرهای 8 بیتی AVR می داند ، می تواند برنامه C بنویسد و تجربه ای در استودیو Atmel دارد.
کد پروژه منتشر شده در GitHub:
تدارکات
قبل از برنامه نویسی هنوز باید مدار را ساخت. در اینجا اجزاء آمده است:
- کنترل کننده Attiny85 (هر منبع الکترونیکی).
- دو LED سه رنگ 10 میلی متری با آند مشترک. LED های Adafruit
- مقاومت 100 اهم ، 120 اهم ، 150 اهم 0.125 یا 0.250 وات (هر منبع الکترونیکی).
- هدر شش پین برای رابط ISP AVR. می توان از این هدر Adafruit تهیه کرد
- مقداری تخته نان یا تخته قالب چاپ شده. من از این https://www.adafruit.com/product/589 استفاده کردم
- رابط AVR ISP MKII و Atmel Studio 6.1 (نسخه بعدی نیز باید کار کند).
مرحله 1: دور زدن
طراحی از پنج پین تراشه استفاده می کند:
- دو پین برای کنترل آند استفاده می شود: هر آند LED به پین اختصاصی متصل شده است.
- سه پین (از طریق مقاومت) به کاتدهای LED متصل شده است (کاتد یک رنگ هر led به یک پین متصل شده است)
یکی می پرسد: چرا از هر شش پین ورودی/خروجی تراشه استفاده نکنید تا آندهای LED مستقیماً به +5 ولت متصل شوند و هر کاتد دارای پین اختصاصی خود باشد؟ این امر برنامه نویسی را ساده می کند. افسوس ، مشکل وجود دارد: پین PB5 (RESET) یک پین ضعیف است که می تواند فقط 2 میلی آمپر جریان تولید کند ، در حالی که نیاز به 20 میلی آمپر پوند است.
البته می توان برای این پین ضعیف تقویت کننده ترانزیستور ساخت ، اما من خودم تا جایی که امکان دارد ترجیح می دهم مشکل را از طریق کد حل کنم.
مرحله 2: نمودار زمان بندی
نمودار زمان بندی به ما کمک می کند تا بفهمیم برای برنامه نویسی به چه چیزهایی نیاز داریم.
دو ردیف بالای نمودار تغییر ولتاژ در آندهای LED را نشان می دهد. ولتاژ پین های متصل به آندهای LED با فرکانس ~ 250 هرتز نوسان می کند. این نوسان ولتاژ برای LED سمت چپ برعکس نوسان LED سمت راست است. هنگامی که ولتاژ روی آند زیاد است LED مربوطه می تواند روشن باشد. وقتی کم است LED مربوطه تیره است. این بدان معناست که هر LED ممکن است در فاصله 2 میلی ثانیه روشن باشد و در طول 2 میلی ثانیه دیگر تاریک باشد. از آنجا که چشم انسان دارای اینرسی است ، چشمک زدن 250 هرتز توسط ناظر قابل مشاهده نیست. در سه ردیف زیر نمودار تغییر ولتاژ در پین های متصل به کاتد LED نشان داده شده است. اجازه دهید به اولین ستون نمودار نگاه کنیم. این مورد زمانی نشان می دهد که LED سمت چپ به رنگ قرمز و LED سمت راست به رنگ سبز باشد. در اینجا کاتدهای RED پایین می مانند در حالی که آند چپ زیاد است ، کاتد GREEN پایین می ماند در حالی که آند راست بالا است و کاتد آبی همیشه پایین می ماند. ستون های دیگر روی نمودار ترکیبی از ولتاژ کاتد و آند را برای رنگ های مختلف نشان می دهد.
همانطور که می بینیم وابستگی متقابل به حالت پین وجود دارد. حل برخی چارچوب ها آسان نخواهد بود. و اینجاست که کتابخانه protothread به کار می آید.
مرحله 3: برنامه نویسی ماکروها و تعاریف
مثال در مراحل برنامه نویسی نسخه کمی ساده شده را نشان می دهد. برنامه کوتاه می شود و برخی از تعریف نمادین با ثابت های صریح جایگزین می شود.
بگذارید از ابتدا شروع کنیم. برنامه شامل فایل های همراه Atmel Studio و همچنین عنوان کتابخانه protothread می باشد. در مرحله بعد دو ماکرو برای دستکاری سطوح پین ها و برخی تعاریف برای نامگذاری منطقی سیگنال های پین وجود دارد. تا اینجا چیز خاصی نیست.
مرحله 4: برنامه نویسی حلقه اصلی
سپس اجازه دهید در انتها نگاه کنیم تا ببینیم روش اصلی شامل چه چیزی است.
عملکرد اصلی پس از انجام مقدماتی در حلقه برای همیشه باقی می ماند. در آن حلقه مراحل بعدی را انجام می دهد:
- برای LED سمت چپ روال پیش رو را فراخوانی می کند. ولتاژ پین ها را تغییر می دهد.
- دو میلی ثانیه تأخیر ایجاد کنید. در ولتاژ پین تغییری ایجاد نمی شود.
- برای استفاده از LED مناسب ، پروتوتود را فراخوانی می کند. ولتاژ پین را تغییر می دهد.
- 2 MS را به تأخیر بیندازید. در ولتاژ پین تغییری ایجاد نمی شود.
مرحله 5: برنامه نویسی توابع کمکی
قبل از شروع به بحث در مورد نخ های اولیه ، باید برخی از عملکردهای کمکی را بررسی کنیم. ابتدا عملکردهایی برای تنظیم رنگ خاص وجود دارد. آنها سر راست هستند. تعداد زیادی عملکرد مانند تعداد رنگهای پشتیبانی شده (هفت) و یک عملکرد دیگر برای تنظیم LED تیره (NoColor) وجود دارد.
و یک تابع دیگر وجود دارد که به طور معمول توسط روال protothread به کار می رود. نام آن DoAndCountdown () است.
از نظر فنی استفاده از چنین عملکردی اجباری نیست ، اما به نظر من مناسب است. سه استدلال دارد:
- اشاره گر برای عملکرد تنظیم رنگ LED (مانند RedColor یا GreenColor یا غیره)
- مقدار اولیه شمارنده معکوس: تعداد دفعاتی که این تابع باید در مرحله خاصی از نخ اولیه فراخوانی شود.
- اشاره گر به شمارنده معکوس. فرض بر این است که هنگام تغییر رنگ ، شمارنده معکوس 0 است ، بنابراین در ابتدا کد تکرار به آن شمارنده مقدار اولیه اختصاص می دهد. پس از هر شمارنده تکرار کاهش می یابد.
Function DoAndCountdown () مقدار شمارنده معکوس را برمی گرداند.
مرحله ششم: برنامه نویسی روالهای Protothread
و در اینجا هسته چارچوب است: روال protothread. برای سادگی مثال فقط به سه مرحله محدود می شود: برای تغییر رنگ به قرمز ، سبز و آبی.
تابع با دو آرگومان فراخوانی می شود:
- اشاره گر به ساختار نخ اولیه این ساختار قبل از شروع حلقه اصلی توسط main مقداردهی شد.
- اشاره گر به شمارنده معکوس. قبل از شروع حلقه اصلی روی 0 روی main تنظیم شده بود.
عملکرد ولتاژها را فعال می کند تا LED سمت چپ فعال شود و سپس بخش protothread را شروع می کند. این بخش بین ماکروهای PT_BEGIN و PT_END است. در داخل کدی وجود دارد که در مورد ما فقط ماکروهای PT_WAIT_UNTIL را تکرار می کند. این ماکروها به صورت زیر عمل می کنند:
- فراخوانی تابع DoAndCountdown. این ولتاژ را بر روی کاتد LED تنظیم می کند تا رنگ خاصی را منتشر کند.
- نتیجه برگشتی در مقایسه با 0.
- وقتی دفعه بعد به protothread فراخوانی می شود ، دوباره کد را قبل از PT_BEGIN اجرا می کند ، سپس مستقیماً داخل ماکروهای PT_WAIT_UNTIL که دفعه قبل از آنها برگشت ، می پرد.
- چنین اقداماتی تا زمانی که نتیجه DoAndCountdown 0 باشد تکرار می شود. در این صورت بازگشتی وجود ندارد ، برنامه در protothread باقی می ماند و خط بعدی کد را اجرا می کند. در مورد ما PT_WAIT_UNTIL بعدی است اما به طور کلی تقریباً می تواند هر کد C باشد.
- در اجرای اولیه دوم شمارنده معکوس PT_WAIT_UNTIL صفر است ، بنابراین DoAndCountdown () آن را روی مقدار اولیه تنظیم می کند. ماکروهای دوم دوباره 250 بار اجرا می شوند تا شمارنده معکوس به 0 برسد.
- وضعیت ساختار pt به محض رسیدن کنترل به ماکروهای PT_END بازنشانی می شود. هنگامی که تابع protothread دفعه بعد فراخوانی می شود ، بخش protothread بلافاصله بعد از PT_BEGIN خط کد را شروع می کند.
برای LED مناسب ، روال پیش ساخته مشابهی وجود دارد. در مثال ما فقط ترتیب رنگ های مختلف را اعمال می کند ، اما اگر ممکن است کاملاً متفاوت عمل کنیم: هیچ اتصال محکمی بین روال LED چپ و راست وجود ندارد.
مرحله 7: داخلی
کل برنامه کمتر از 200 خط کد (با نظرات و خطوط خالی) است و کمتر از 20 of حافظه کد Attiny85 را می گیرد. در صورت لزوم ، می توان از چندین روال پیش ساخته دیگر استفاده کرد و منطق بسیار پیچیده تری را به آنها اختصاص داد.
کتابخانه Protothreads ساده ترین شکل برنامه نویسی همزمان کامپیوتر است. برنامه نویسی همزمان روشی است که به برنامه اجازه می دهد تا آن را به قسمتهای منطقی تقسیم کند: گاهی به آنها coroutines ، گاهی thread ، گاهی task ها می گویند. اصل بر این است که هر وظیفه ای می تواند قدرت پردازنده یکسانی را در اختیار داشته باشد در حالی که کد را کم و بیش خطی و مستقل از سایر قسمت ها نگه می دارد. وظایف از دیدگاه منطقی ممکن است به طور همزمان اجرا شوند.
برای سیستم های پیشرفته ، کنترل چنین وظایفی یا با هسته سیستم عامل یا با زمان اجرا زبان که توسط کامپایلر قابل اجرا است ، انجام می شود. اما در مورد برنامه های کاربردی protothreads ، برنامه نویس آن را به صورت دستی با استفاده از کتابخانه ماکروهای protothreads در روال وظایف و استناد به چنین روالهایی (معمولاً خارج از حلقه اصلی) کنترل می کند.
احتمالاً می خواهید بدانید در واقع پروتودرید چگونه کار می کند؟ جادو کجا پنهان شده است؟ Protothreads به ویژگی ویژه زبان C متکی هستند: این واقعیت است که دستور C switch ممکن است در if یا بلوک دیگری (مانند while یا for) تعبیه شده باشد. جزئیاتی که ممکن است در سایت Adam Dunkels پیدا کنید
داخلی قطعات الکترونیکی این پروژه بسیار ساده است. عکس بالا به شما سرنخ می دهد. من مطمئن هستم که شما می توانید بهتر عمل کنید.
توصیه شده:
کدو تنبل هالووین با چشم متحرک آناتارونیک - این کدو می تواند چشم خود را گرد کند!: 10 مرحله (همراه با تصاویر)
کدو تنبل هالووین با چشم متحرک آناتارونیک | این کدو تنبل می تواند چشم خود را گرد کند!: در این دستورالعمل می آموزید چگونه یک کدو تنبل هالووین درست کنید که هنگام حرکت چشم همه را وحشت زده می کند. فاصله ماشه سنسور اولتراسونیک را در مقدار مناسب تنظیم کنید (مرحله 9) ، و کدو تنبل شما را هرکسی که جرات خوردن شمع دارد ، متحجر می کند
کدو تنبل Arduino Halloween کدو تنبل: 4 مرحله
کدو تنبل Arduino کدو تنبل هالووین: هدف از این دستورالعمل ایجاد راهی ارزان و آسان برای ایجاد تزئینات هالووین در خانه بدون هیچ گونه مهارت قبلی یا ابزارهای فانتزی بود. با استفاده از منابع آسان برای منبع از اینترنت ، شما نیز می توانید H و ساده و شخصی خود را ایجاد کنید
راهنمای برنامه نویسی پردازش جالب برای طراح-کنترل رنگ: 10 مرحله
راهنمای برنامه نویسی پردازش جالب برای طراح-کنترل رنگ: در فصل های قبل ، ما بیشتر در مورد نحوه استفاده از کد برای انجام شکل دهی به جای نکات آگاهی در مورد رنگ صحبت کرده ایم. در این فصل ، ما قصد داریم این جنبه از دانش را عمیق تر بررسی کنیم
ساعت و برنامه نویسی فعالیتهای ارتعاشی پوشیدنی ATtiny85 ATtiny85 با Arduino Uno: 4 مرحله (همراه با تصاویر)
سازمان دیده بان و برنامه نویسی فعالیتهای ارتعاشی پوشیدنی ATtiny85 ATtiny85 با Arduino Uno: چگونه ساعت ردیابی فعالیت های پوشیدنی را بسازیم؟ این یک ابزار پوشیدنی است که هنگام تشخیص رکود برای ارتعاش طراحی شده است. آیا بیشتر وقت خود را مثل من در کامپیوتر می گذرانید؟ آیا ساعت ها بدون این که بدانید نشسته اید؟ سپس این دستگاه f
چراغ های LED چند رنگ رنگ Reactive - سنسور تشخیص صدا آردوینو - نوار LED RGB: 4 مرحله
چراغ های LED چندرنگ Reactive Music | سنسور تشخیص صدا آردوینو | RGB LED Strip: پروژه چراغ های LED چند رنگ LED فعال در برابر موسیقی. در این پروژه ، از یک نوار LED 5050 RGB ساده (نه LED WS2812 آدرس پذیر) ، سنسور تشخیص صدا آردوینو و آداپتور 12 ولت استفاده شد