فهرست مطالب:

یک چراغ خلق LED 1 دلاری با ATtiny13 و WS2812: 7 مرحله
یک چراغ خلق LED 1 دلاری با ATtiny13 و WS2812: 7 مرحله

تصویری: یک چراغ خلق LED 1 دلاری با ATtiny13 و WS2812: 7 مرحله

تصویری: یک چراغ خلق LED 1 دلاری با ATtiny13 و WS2812: 7 مرحله
تصویری: Using Digispark Attiny85 Mini Arduino boards: Lesson 108 2024, نوامبر
Anonim
یک چراغ خلق LED 1 دلاری با ATtiny13 و WS2812
یک چراغ خلق LED 1 دلاری با ATtiny13 و WS2812

توسط arduinocelentano بیشتر توسط نویسنده دنبال کنید:

سرور CalDAV شخصی در رایانه تک برد
سرور CalDAV شخصی در رایانه تک برد
سرور CalDAV شخصی در رایانه تک برد
سرور CalDAV شخصی در رایانه تک برد
مهاجمان LCD: مهاجمان فضایی مانند بازی بر روی صفحه نمایش 16x2 کاراکتر LCD
مهاجمان LCD: مهاجمان فضایی مانند بازی بر روی صفحه نمایش 16x2 کاراکتر LCD
مهاجمان LCD: مهاجمان فضایی مانند بازی بر روی صفحه نمایش 16x2 کاراکتر LCD
مهاجمان LCD: مهاجمان فضایی مانند بازی بر روی صفحه نمایش 16x2 کاراکتر LCD
Octarine: یک بازی تطبیق رنگ با LED های WS2812 RGB
Octarine: یک بازی تطبیق رنگ با LED های WS2812 RGB
Octarine: یک بازی تطبیق رنگ با LED های WS2812 RGB
Octarine: یک بازی تطبیق رنگ با LED های WS2812 RGB

این یک چراغ خلق کم هزینه با چهار حالت است.

1. جرقه رنگین کمان. جرقه ای از نور هر از گاهی به سمت بالا حرکت می کند و به تدریج رنگ آن را تغییر می دهد.

2. درخشش رنگین کمان. درخشندگی پایدار که به تدریج رنگ را تغییر می دهد.

3. شبیه سازی آتش شمع.

4. خاموش.

با ضربه زدن روی یک دکمه لمسی در بالا می توانید حالت ها را تغییر دهید. حالت فعلی پس از خاموش شدن در حافظه EEPROM ذخیره می شود.

ATtiny13 چقدر کوچک است؟

ایده این بود که حداکثر امکانات را از حداقل سخت افزار بدست آوریم ، چیزی پیچیده تر از کلید یا دماسنج خودکار ، پروژه ای نزدیک به لبه این میکروکنترلر کوچک. پس از همه ، محدودیت ها باعث می شوند شما خلاق فکر کنید ، درست است؟ خوب ، در ابتدا به نظر می رسید.

چالش برانگیزترین در این پروژه این بود که تمام کد را در ATtiny13 قرار دهیم. میکروکنترلر دارای 1K بایت فلش و فقط 64 بایت RAM است. بله ، وقتی می گویم "بایت" ، منظور من آنهایی است که از هشت بیت تشکیل شده است. 64 بایت برای همه متغیرهای محلی و پشته تماس. برای روشن تر شدن ، در نظر داشته باشید که ما باید 8 LED RGB را کنترل کنیم. هر یک از آنها با 3 بایت (به ترتیب یک کانال قرمز ، سبز و آبی) تعریف شده است. بنابراین ، فقط برای ذخیره وضعیت 8 LED ، ما باید یک آرایه از 8 ساختار 3 بایت را پیاده سازی کنیم و یک اشاره گر به ابتدای این آرایه یک بایت دیگر طول می کشد. بنابراین ، 25 از 64 بایت خارج شده است. ما فقط 39 RAM از RAM استفاده کرده ایم و هنوز هنوز شروع به کار نکرده ایم. علاوه بر این ، برای ذخیره هفت رنگ اصلی رنگین کمان ، به 7 × 3 = 21 بایت نیاز دارید ، بنابراین 72 RAM RAM خالی است. خوب ، در مورد رنگهای اصلی ، من اغراق می کنم: ما به همه آنها در RAM همزمان نیاز نداریم و هرگز تغییر نمی کنند ، بنابراین ممکن است به عنوان یک آرایه ثابت برای ذخیره در فلش به جای RAM اجرا شوند. به هر حال ، این یک تصور کلی در مورد سخت افزار استفاده شده است.

با به خاطر آوردن بیانیه Knuth در مورد بهینه سازی زودرس ، از نمونه سازی سه حالت لامپ به طور جداگانه شروع کردم تا ببینم چه اتفاقی می افتد. من آنها را جداگانه آزمایش کرده ام تا مطمئن شوم که درست کار می کنند و هر کدام با میکروکنترلر من سازگار است. انجام آن چند شب طول کشید و همه چیز خوب پیش رفت … تا زمانی که سعی کردم آنها را در دستور switch قرار دهم. ابزار اندازه avr اندازه بخش متن 1.5 کیلوبایت (با پرچم -s از avr-gcc) را گزارش کرد. در آن لحظه قصد اصلی من این بود که مقداری ATtiny25 را با فلاش 2 کیلوبایت بگیرم و این می تواند پایان خوش این داستان باشد.

اما به نوعی احساس کردم که پس از بهینه سازی قابل توجه ، می توانم آن کد تقلب را به 1 کیلوبایت کاهش دهم. با این حال ، یک هفته دیگر طول کشید تا متوجه شوید که غیرممکن است و به هر حال انجام آن یک هفته دیگر به طول انجامید. من مجبور شدم رنگین کمان را به پنج رنگ اصلی برسانم (بدون تفاوت بصری قابل توجه). من از دستورات پرونده خلاص شدم و برای کاهش اندازه کد دودویی از زنجیره ای if-then-if استفاده کردم. انیمیشن آتش به یک مولد شماره شبه تصادفی نیاز دارد که بسیار حجیم است ، بنابراین من یک نسخه ساده شده از LFSR با مقدار اولیه ثابت را پیاده کردم. من به طول دوره کامل PRNG اهمیت نمی دهم و فقط به دنبال ایجاد تعادل بین اندازه کد و "انیمیشن آتش واقعی" هستم. من همچنین بسیاری از بهینه سازی های جزئی را که در حال حاضر به خاطر ندارم پیاده کردم و حتی موفق شدم همه حالت ها را جدا از آتش در تراشه فلش کنم. وقتی ایده هایم تمام شد ، کل کد من حدود 1200 بایت بود.

من وقت گذاشتم و مطالب زیادی در مورد بهینه سازی کد AVR خوانده بودم. من در آستانه تسلیم شدن و بازنویسی همه چیز به زبان اسمبلی بودم اما آخرین فرصت را به آن دادم. در آخرین شتاب بهینه سازی ، من رنگین کمان را به سه رنگ اصلی برش داده و رنگهای دیگر را در حین کار محاسبه کردم ، همه چیز را بررسی کردم و توصیه های بهینه سازی AVR را دنبال کردم و در نهایت…

avrdude: نوشتن فلش (1004 بایت):

نوشتن | ################################################## | 100٪ 0.90s

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

تدارکات:

1x ATtiny13 MCU (0.28 دلار = 0.24 دلار برای MCU در بسته SOP-8 و 0.04 دلار برای آداپتور DIP8)

LED های 8x WS2812 RGB (من یک تخته یا یک تکه نوار LED را توصیه می کنم) (0.42 دلار)

1x دکمه لمسی TTP223 (0.10 دلار)

1 برابر میکرو USB به آداپتور DIP (0.14 دلار)

1x مقاومت 10kΩ (<0.01 دلار)

1x خازن سرامیکی 100nF (<0.01 دلار)

1x 10-47µF خازن الکترولیتی (<0.01 دلار)

مجموع <0.97 دلار

مرحله 1: راه اندازی نرم افزار

راه اندازی نرم افزار
راه اندازی نرم افزار

برای گردآوری کد منبع و ابزار avrdude برای بارگذاری ROM میکروکنترلر ، به ابزارآلات avr-gcc احتیاج دارید. فرآیند نصب بسیار ساده و ساده است ، اما بستگی به سیستم عامل شما دارد. اگر از نوعی GNU/Linux استفاده می کنید ، احتمالاً بسته های مناسبی را در درخت مخزن خود دارید. کد منبع این پروژه را می توانید در اینجا بارگیری کنید:

github.com/arduinocelentano/t13_ws2812_lamp

همچنین به یک کتابخانه light_ws2812 نیاز دارید:

github.com/cpldcpu/light_ws2812

پس از در اختیار داشتن ابزار ابزار avr-gcc و منابع پروژه ، ترمینال خود را اجرا کرده و کد زیر را تایپ کنید:

مسیر cd/به/پروژه

بساز

مرحله 2: برنامه نویسی میکروکنترلر

برنامه نویسی میکروکنترلر
برنامه نویسی میکروکنترلر
برنامه نویسی میکروکنترلر
برنامه نویسی میکروکنترلر
برنامه نویسی میکروکنترلر
برنامه نویسی میکروکنترلر

اگر برنامه نویسی USBASP دارید ، فقط آن را با توجه به pinout خود به Attiny وصل کنید. معمولاً اینطور به نظر می رسد ، اما من اکیداً توصیه می کنم که pinout واقعی خود را بررسی کنید!

متناوبا ، می توانید از برد Arduino به عنوان برنامه نویس استفاده کنید. Arduino IDE را باز کنید و مثال ISP Arduino را در منوی "File → Examples" پیدا کنید. پس از بارگذاری طرح ، برد Arduino شما به عنوان برنامه نویس عمل می کند. نظرات موجود در کد طرح به شما سرنخی برای راه اندازی می دهد.

حالا فرار کن

فلش بساز

برای فلش کردن MCU و

فیوز بزن

برای تنظیم بیت فیوز

توصیه شده: