תוכן עניינים:

מנורת מצב רוח LED 1 $ עם ATtiny13 ו- WS2812: 7 שלבים
מנורת מצב רוח LED 1 $ עם ATtiny13 ו- WS2812: 7 שלבים

וִידֵאוֹ: מנורת מצב רוח LED 1 $ עם ATtiny13 ו- WS2812: 7 שלבים

וִידֵאוֹ: מנורת מצב רוח LED 1 $ עם ATtiny13 ו- WS2812: 7 שלבים
וִידֵאוֹ: איתי לוי - בגלל הרוח (Prod. By Yinon Yahel) 2024, נוֹבֶמבֶּר
Anonim
מנורת מצב רוח LED 1 $ עם ATtiny13 ו- WS2812
מנורת מצב רוח LED 1 $ עם ATtiny13 ו- WS2812

מאת arduinocelentano עקוב אחר מאת המחבר:

שרת CalDAV אישי במחשב לוח אחד
שרת CalDAV אישי במחשב לוח אחד
שרת CalDAV אישי במחשב לוח אחד
שרת CalDAV אישי במחשב לוח אחד
LCD Invaders: משחק הפולשים כמו Space על תצוגת תווים LCD בגודל 16x2
LCD Invaders: משחק הפולשים כמו Space על תצוגת תווים LCD בגודל 16x2
LCD Invaders: משחק כמו פולשים בחלל בתצוגת תווים LCD בגודל 16x2
LCD Invaders: משחק כמו פולשים בחלל בתצוגת תווים LCD בגודל 16x2
אוקטרינה: משחק התאמת צבעים עם נוריות WS2812 RGB
אוקטרינה: משחק התאמת צבעים עם נוריות WS2812 RGB
אוקטרינה: משחק התאמת צבעים עם נוריות WS2812 RGB
אוקטרינה: משחק התאמת צבעים עם נוריות WS2812 RGB

זוהי מנורת מצב רוח בעלות נמוכה עם ארבעה מצבים.

1. ניצוץ קשת. ניצוץ אור נע פעם אחר פעם כלפי מעלה ומשנה את הצבע בהדרגה.

2. זוהר קשת. זוהר יציב שמשנה את הצבע בהדרגה.

3. הדמיית אש לנרות.

4. כבוי.

תוכל להחליף מצבים על ידי הקשה על כפתור מגע למעלה. המצב הנוכחי נשמר בזיכרון EEPROM לאחר כיבוי.

כמה זעיר ATtiny13?

הרעיון היה להשיג תכונות מקסימליות מחומרה מינימלית, משהו מורכב יותר מאשר מתג אוטומטי או מדחום, פרויקט קרוב לקצה המיקרו -בקר הזעיר הזה. אחרי הכל, ההגבלות גורמות לך לחשוב יצירתי, נכון? ובכן, זה נראה כך בהתחלה.

המאתגר ביותר בפרויקט זה היה לדחוף את כל הקוד לתוך ATtiny13. לבקר המיקרו יש פלאש של 1K בתים ורק 64 בתים RAM. כן, כשאני אומר "בתים", אני מתכוון לאלה המורכבים משמונה סיביות. 64 בתים עבור כל המשתנים המקומיים וערימת השיחות שלך. כדי להבהיר, שקול שעלינו לשלוט על 8 נוריות RGB. כל אחד מהם מוגדר על ידי 3 בתים (אחד לערוץ אדום, ירוק וכחול בהתאמה). אז, רק כדי לאחסן את מצב 8 הנורות, נצטרך ליישם מערך של 8 מבנים 3 בתים כל אחד ומצביע לתחילת המערך הזה ייקח עוד בית. לפיכך, 25 מתוך 64 בתים יוצאים. רק השתמשנו ב -39% של זיכרון RAM ועדיין לא התחלנו באמת. בנוסף, כדי לאחסן שבעה צבעי קשת בסיסיים, תזדקק ל 7 × 3 = 21 בתים, כך ש- 72% מהזיכרון RAM נגמר. ובכן, באשר לצבעים בסיסיים, אני מגזים: אנחנו לא צריכים את כולם בו זמנית ב- RAM והם אף פעם לא משתנים, כך שהם עשויים להיות מיושמים כמערך קבוע כדי להיות מאוחסן בפלאש במקום ב- RAM. בכל מקרה, זה נותן רושם כללי לגבי חומרה משומשת.

נזכרתי בהצהרתו של קנוט בנוגע לאופטימיזציה מוקדמת, והתחלתי לאבות טיפוס של שלושה מצבי מנורה בנפרד כדי לראות מה קורה. בדקתי אותם בנפרד כדי לוודא שהם עובדים כראוי וכל אחד מתאים למיקרו -בקר שלי. נדרשו כמה ערבים כדי להשיג את זה והכל הלך כשורה … עד שניסיתי להרכיב אותם בתוך הצהרת מתגים. כלי השירות avr-size דיווח על גודל קטע טקסט של 1.5 קילוגרם (עם דגל -s של avr-gcc). באותו רגע הכוונה המקורית שלי הייתה לתפוס קצת ATtiny25 עם פלאש 2Kb וזה יכול היה להיות הסוף הטוב של הסיפור הזה.

אבל איכשהו הרגשתי שאחרי אופטימיזציה ניכרת אוכל להצליח לכווץ את הקוד המחורבן הזה ל- 1Kb. עם זאת, לקח עוד שבוע אחד להבין שזה בלתי אפשרי ועוד שבוע אחד להשיג את זה. הייתי צריך לחתוך קשת לחמישה צבעים בסיסיים (ללא הבדל חזותי משמעותי). נפטרתי מהודעות מקרה והשתמשתי בשרשרת של אם-אז-אם כדי להקטין את גודל הקוד הבינארי. אנימציה לאש זקוקה למחולל מספר pseudorandom שהוא די מגושם, אז יישמתי גרסה פשוטה של 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)

8x נוריות WS2812 RGB (אני ממליץ על לוח או פיסת פס LED) ($ 0.42)

1x כפתור מגע TTP223 ($ 0.10)

1x מתאם מיקרו USB ל- DIP ($ 0.14)

נגד 10kΩ (<0.01 $)

קבל קרמיקה 100nF (<0.01 $)

קבל אלקטרוליטי 10–47 μF (<0.01 $)

סה"כ <0.97 $

שלב 1: התקנת תוכנה

התקנת תוכנה
התקנת תוכנה

תצטרך שרשרת כלים avr-gcc לעריכת קוד המקור וכלי השירות avrdude להעלאת ROM של בקר מיקרו. תהליך ההתקנה די פשוט ופשוט, אך תלוי במערכת ההפעלה שלך. אם אתה משתמש בסוג של GNU/Linux, כנראה שכבר יש לך חבילות מתאימות בעץ המאגר שלך. ניתן להוריד את קוד המקור של פרויקט זה כאן:

github.com/arduinocelentano/t13_ws2812_lamp

תזדקק גם לספריית light_ws2812:

github.com/cpldcpu/light_ws2812

לאחר שקיבלת את שרשרת הכלים avr-gcc ומקורות הפרויקט, הפעל את הטרמינל והקלד את הקוד הבא:

נתיב cd/אל/פרוייקט

עשה

שלב 2: תכנות המיקרו -בקר

תכנות המיקרו -בקר
תכנות המיקרו -בקר
תכנות המיקרו -בקר
תכנות המיקרו -בקר
תכנות המיקרו -בקר
תכנות המיקרו -בקר

אם יש לך איזה מתכנת USBASP, פשוט חבר אותו ל- Attiny בהתאם ל- pinout שלו. בדרך כלל זה היה נראה כך אבל אני ממליץ בחום לבדוק את הסיכה האמיתית שלך!

לחלופין, תוכל להשתמש בלוח Arduino כמתכנת. פתח את Arduino IDE ומצא את דוגמת ספק האינטרנט של Arduino בתפריט "קובץ → דוגמאות". לאחר העלאת הסקיצה, לוח ה- Arduino שלך מתפקד כמתכנת. ההערות בקוד הסקיצה היו נותנות לך מושג להצגה.

עכשיו רוץ

לעשות פלאש

כדי להבהב את ה- MCU ו-

לעשות נתיך

כדי להגדיר פיסות פיוז.

מוּמלָץ: