جدول المحتويات:

مصباح مزاج LED بقيمة 1 دولار مع ATtiny13 و WS2812: 7 خطوات
مصباح مزاج LED بقيمة 1 دولار مع ATtiny13 و WS2812: 7 خطوات

فيديو: مصباح مزاج LED بقيمة 1 دولار مع ATtiny13 و WS2812: 7 خطوات

فيديو: مصباح مزاج LED بقيمة 1 دولار مع ATtiny13 و WS2812: 7 خطوات
فيديو: عرفتوا ليه المترو بيتقلب وبيعمل حوادث شاهد الفيديو للنهايه 2024, شهر نوفمبر
Anonim
مصباح مزاج LED بسعر 1 دولار مع ATtiny13 و WS2812
مصباح مزاج LED بسعر 1 دولار مع ATtiny13 و WS2812

من قبل arduinocelentano تابع المزيد من قبل المؤلف:

خادم CalDAV الشخصي على كمبيوتر أحادي اللوحة
خادم CalDAV الشخصي على كمبيوتر أحادي اللوحة
خادم CalDAV الشخصي على كمبيوتر أحادي اللوحة
خادم CalDAV الشخصي على كمبيوتر أحادي اللوحة
غزاة LCD: لعبة مثل غزاة الفضاء على شاشة عرض أحرف LCD مقاس 16 × 2
غزاة LCD: لعبة مثل غزاة الفضاء على شاشة عرض أحرف LCD مقاس 16 × 2
غزاة LCD: لعبة مثل غزاة الفضاء على شاشة عرض أحرف LCD مقاس 16 × 2
غزاة LCD: لعبة مثل غزاة الفضاء على شاشة عرض أحرف LCD مقاس 16 × 2
Octarine: لعبة مطابقة الألوان مع WS2812 RGB LEDs
Octarine: لعبة مطابقة الألوان مع WS2812 RGB LEDs
Octarine: لعبة مطابقة الألوان مع WS2812 RGB LEDs
Octarine: لعبة مطابقة الألوان مع WS2812 RGB LEDs

هذا مصباح مزاج منخفض التكلفة بأربعة أوضاع.

1. شرارة قوس قزح. شرارة من الضوء تتحرك صعودًا مرة تلو الأخرى وتغير اللون تدريجيًا.

2. توهج قوس قزح. توهج ثابت يغير اللون تدريجيًا.

3. محاكاة النار شمعة.

4. إيقاف.

يمكنك تبديل الأوضاع من خلال النقر على زر اللمس في الأعلى. يتم حفظ الوضع الحالي في ذاكرة EEPROM بعد إيقاف التشغيل.

ما مدى صغر حجم ATtiny13؟

كانت الفكرة هي الحصول على الحد الأقصى من الميزات من الحد الأدنى من الأجهزة ، وهو شيء أكثر تعقيدًا من التبديل الآلي أو مقياس الحرارة ، وهو مشروع قريب من حافة هذا المتحكم الدقيق. بعد كل شيء ، القيود تجعلك تفكر بطريقة إبداعية ، أليس كذلك؟ حسنًا ، بدا الأمر كذلك في البداية.

كان التحدي الأكبر في هذا المشروع هو دفع كل الكود إلى ATtiny13. يحتوي المتحكم الدقيق على فلاش 1 كيلو بايت وذاكرة وصول عشوائي بسعة 64 بايت. نعم ، عندما أقول "بايت" ، أعني تلك التي تتكون من ثمانية بتات. 64 بايت لجميع المتغيرات المحلية ومكدس المكالمات. لتوضيح الأمر ، ضع في اعتبارك أنه يتعين علينا التحكم في 8 مصابيح LED RGB. يتم تعريف كل منها بـ 3 بايت (واحد للقناة الأحمر والأخضر والأزرق على التوالي). لذلك ، فقط لتخزين حالة 8 مصابيح LED ، سنحتاج إلى تنفيذ مصفوفة من 8 هياكل 3 بايت لكل منها ، وسيستغرق مؤشر بداية هذه المصفوفة بايت واحدًا إضافيًا. وبالتالي ، تم إخراج 25 من 64 بايت. لقد استخدمنا للتو 39٪ من ذاكرة الوصول العشوائي ولم نبدأ بالفعل بعد. بالإضافة إلى ذلك ، لتخزين سبعة ألوان أساسية بألوان قوس قزح ، ستحتاج إلى 7 × 3 = 21 بايت ، وبالتالي فإن 72٪ من ذاكرة الوصول العشوائي قد نفدت. حسنًا ، بالنسبة للألوان الأساسية ، فأنا أبالغ: لسنا بحاجة إليها جميعًا في نفس الوقت في ذاكرة الوصول العشوائي ولا تتغير أبدًا ، لذلك يمكن تنفيذها كمصفوفة ثابتة يتم تخزينها في فلاش بدلاً من ذاكرة الوصول العشوائي. على أي حال ، فإنه يعطي انطباعًا عامًا عن الأجهزة المستخدمة.

تذكرت عبارة Knuth حول التحسين المبكر ، لقد بدأت من وضع نماذج أولية لثلاثة أوضاع للمصباح بشكل منفصل لمعرفة ما سيحدث. لقد اختبرتها بشكل منفصل للتأكد من أنها تعمل بشكل صحيح وأن كل واحدة تناسبها متحكم. استغرق الأمر بضع أمسيات لإنجازها وسار كل شيء على ما يرام … حتى حاولت تجميعها معًا داخل بيان التبديل. أبلغت الأداة المساعدة avr-size عن حجم قسم نصي يبلغ 1.5 كيلوبايت (مع علامة -s لـ avr-gcc). في تلك اللحظة ، كانت نيتي الأصلية هي الحصول على بعض ATtiny25 مع فلاش 2Kb وكان من الممكن أن تكون هذه هي النهاية السعيدة لهذه القصة.

لكن بطريقة ما شعرت أنه بعد التحسين الكبير يمكنني تقليص هذا الرمز السيء إلى 1 كيلوبايت. ومع ذلك ، فقد استغرق الأمر أسبوعًا آخر لإدراك أنه من المستحيل وأسبوع آخر لتحقيق ذلك على أي حال. اضطررت إلى قص قوس قزح إلى خمسة ألوان أساسية (بدون اختلاف بصري كبير). لقد تخلصت من عبارات الحالة واستخدمت سلسلة من if-then-if لتقليل حجم الشفرة الثنائية. تحتاج الرسوم المتحركة للنار إلى مولد أرقام شبه عشوائي ضخم إلى حد كبير ، لذلك قمت بتطبيق نسخة مبسطة من LFSR بقيمة أولية ثابتة. لا يهمني طول دورة PRNG الكاملة وأبحث فقط عن توازن النسب بين حجم الكود و "رسوم متحركة واقعية للنيران". لقد نفذت أيضًا الكثير من التحسينات الطفيفة التي لا أتذكرها الآن ، بل وتمكنت من وميض جميع الأوضاع باستثناء إطلاق النار على الشريحة. عندما نفدت الأفكار ، كان إجمالي الشفرة حوالي 1200 بايت.

لقد استغرقت المهلة وكنت أقرأ كثيرًا عن تحسين كود AVR. كنت على وشك التخلي عن كل شيء وإعادة كتابته بلغة التجميع ، لكنني أعطيته الفرصة الأخيرة. أثناء اندفاع التحسين النهائي ، قمت بقص قوس قزح إلى ثلاثة ألوان أساسية وجعلت الألوان الأخرى قابلة للحساب بسرعة ، وفحصت كل شيء واتبعت توصيات تحسين AVR وأخيرًا …

avrdude: كتابة فلاش (1004 بايت):

الكتابة | ################################################## | 100٪ 0.90 ث

ليست هناك حاجة للقول إنني استخدمت كل ذاكرة الوصول العشوائي تقريبًا وبايت واحد فقط من EEPROM لتخزين الوضع الحالي. أنا لا أعني أن هذا هو تنفيذ مثالي ونهائي. إنه يعمل فقط ويناسب الميكروكونترولر. أنا متأكد من أنه يمكنك القيام بذلك بشكل أفضل. أنا حقا. أريد فقط أن أشارك متعة حل مشكلة تبدو غير عملية كنت تعتبرها شبه مستحيلة في البداية. "وبالتالي ، فإن القرصنة تعني استكشاف حدود الممكن …" - ريتشارد ستالمان.

اللوازم:

1x ATtiny13 MCU (0.28 دولار = 0.24 دولار لـ MCU في حزمة SOP-8 و 0.04 دولار لمحول DIP8)

8x WS2812 RGB LEDs (أوصي بلوحة أو قطعة من شريط LED) (0.42 دولار)

1x TTP223 زر اللمس (0.10 دولار)

1x Micro USB إلى محول DIP (0.14 دولار)

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

1x 100nF مكثف سيراميك (<0.01 دولار)

1x 10-47 درجة فهرنهايت مكثف إلكتروليتي (<0.01 دولار أمريكي)

الإجمالي <0.97 دولار

الخطوة 1: إعداد البرنامج

إعداد البرنامج
إعداد البرنامج

ستحتاج إلى سلسلة أدوات avr-gcc لتجميع شفرة المصدر والأداة المساعدة avrdude لتحميل ذاكرة القراءة فقط الخاصة بوحدة التحكم الدقيقة. عملية التثبيت بسيطة ومباشرة إلى حد كبير ، ولكنها تعتمد على نظام التشغيل الخاص بك. إذا كنت تستخدم نوعًا من GNU / Linux ، فمن المحتمل أن يكون لديك بالفعل حزم مناسبة في شجرة مستودعك. يمكن تنزيل الكود المصدري لهذا المشروع من هنا:

github.com/arduinocelentano/t13_ws2812_lamp

ستحتاج أيضًا إلى مكتبة light_ws2812:

github.com/cpldcpu/light_ws2812

بمجرد حصولك على سلسلة أدوات avr-gcc ومصادر المشروع ، قم بتشغيل المحطة الطرفية واكتب الكود التالي:

مسار القرص المضغوط / إلى / المشروع

صنع

الخطوة الثانية: برمجة المتحكم الدقيق

برمجة المتحكم الدقيق
برمجة المتحكم الدقيق
برمجة المتحكم الدقيق
برمجة المتحكم الدقيق
برمجة المتحكم الدقيق
برمجة المتحكم الدقيق

إذا كان لديك نوع من مبرمج USBASP ، فقم فقط بتوصيله بـ Attiny وفقًا ل pinout الخاص به. عادةً ما يبدو الأمر هكذا ، لكنني أوصي بشدة بمراجعة pinout الفعلي الخاص بك!

بدلاً من ذلك ، يمكنك استخدام لوحة Arduino كمبرمج. افتح Arduino IDE وابحث عن مثال Arduino ISP في قائمة "File → Examples". بعد تحميل الرسم التخطيطي ، تعمل لوحة Arduino كمبرمج. ستعطيك التعليقات الموجودة في رمز الرسم فكرة عن التثبيت.

الآن تشغيل

جعل الفلاش

وميض MCU و

جعل الصمامات

لتعيين بت الصمامات.

موصى به: