הקדמה

לא מזמן מצאתי את עצמי כאשר ברשותי רצועת לדים צבעוניים באורך עשרה מטרים, כזו שמאפשרת לשלוט על הצבע של כל אחד מהלדים שבה בנפרד (תקן WS2812B). התכנית המקורית שלי הייתה להשתמש בה עם פרויקט הקוד הפתוח Hyperion וליצור תאורת אמביינט היקיפית לטלוויזיה, אך לבסוף ויתרתי על הרעיון הזה.

תאורת אמביינט עם Hyperion

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

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

דרישות החשמל

רצועות לדים הן מכשיר שצורך חשמל, ולכן אולי בתור התחלה כדאי להכיר את דרישות החשמל שלהן ולהבין פחות או יותר איך נראים החיווטים שלהן. לפני שמתעמקים במפרט של הלדים, כדאי לזכור שהתקן של הלד (WS2812B) מתייחס אל לד בודד בפני עצמו. לרצועת הלדים בשלמותה אין תקן סטנדרטי, ונצטרך להתייחס אליה כאל אוסף של לדים שמשורשרים אחד לשני באופן אידאלי.

נתחיל בחיווטים:

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

WS2812B layout

בהתאם לדרישות, אל כל לד מחוברים ארבעה פינים – שתי כניסות ושתי יציאות: אל פין מספר 1 יש לחבר הדק חשמלי חיובי שיספק כוח לפעולת הלד, ואל פין מספר 3 יש לחבר הדק חשמלי שלילי דרכו ייסגר המעגל חשמלי. פין מספר 4 מקבל את ערוץ המידע ופין מספר 2 מוציא את ערוץ המידע בחזרה. לבינתיים לא נתעמק באופן הפעולה של ערוץ המידע, כל שעלינו לדעת בהקשר הנוכחי הוא שעל הלדים להיות משורשרים אחד לשני כך שה-DIN (פין מספר 4, Data in) של כל אחד מהלדים צריך להיות מחובר ל DOUT (פין מספר 2, Data out) של הלד הקודם לו. עקב כך, הרצועה יכולה לפעול בכיוון יחיד בלבד, כלומר לרצועה יש התחלה מובהקת וסוף מובהק כאשר לא ניתן להחליף ביניהם.

כיוון הרצועה מסומן בחץ
WS2812B strip layout

ברצועת הלדים שברשותי, כל לד מחובר לקודמו כפי שמתואר בתרשים לעיל. כיוון התקדמות הרצועה מסומן בחץ האדום. קל לראות שבתוך הרצועה הדקי המתח של הלדים מחוברים במקביל זה לזה ולא משורשים זה אחר זה בטור, ולכך שני יתרונות עיקריים (כפי שכבר פורט בפוסט על חיבור בטור ובמקביל):

  1. כאשר הרכיבים מחוברים בטור, במידה ואחד מהם מתקלקל נוצר נתק במעגל החשמלי, מצב שיגרום לכך שהרכיבים התקינים לא יעבדו גם הם. לעומת זאת בחיבור מקבילי הבעיה הזו לא קיימת.
  2. כאשר רכיבים זהים מחוברים בטור, המתח במעגל יתחלק שווה בשווה בין כולם. לעומת זאת, בחיבור מקבילי, כל אחד ואחד מהרכיבים מקבל את מלוא המתח של המעגל, שזה כמובן עדיף לנו.

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

עכשיו אפשר לדבר על כמויות: גודל המתח, עוצמת הזרם וההספק המקסימלי.

בדף המידע של הלדים ניתן לראות כי על הלדים לקבל מתח בגודל 3.5V עד 5.3V על מנת לעבוד. הבעיה היא שבשקע בקיר שלנו המתח החשמלי הוא בערך 240V-220V, בתצורת זרם חילופין. לכן כמו רוב מכשירי החשמל בחיינו, המסך שלנו שעובד על זרם ישר במתח נמוך יצטרך ספק כוח שידאג להמיר את החשמל מהקיר לזרם ישר במתח 5V.

כשבוחרים ספק כוח לא מספיק להתחשב רק במתח הרצוי, אלא גם לוודא שיוכל לעמוד בהספק החשמלי של המכשיר שלנו. הספק הוא כמות האנרגיה שנעשה בה שימוש בפרק זמן מסוים, ומסומן באות P – כלומר {P = \frac{Energy}{Time}. אם ספק הכוח שלנו לא יוכל לעמוד בקצב צריכת האנרגיה של המסך, במקרה הטוב הוא יכבה את עצמו ובמקרה הרע הוא עלול להישרף (לפעמים אפילו להתלקח) ולהסב נזק למערכת שלנו.

בדרך כלל מודדים הספק ביחידת המידה ואט [W] אשר מוגדרת כג'אול לשנייה [Watt] = \frac{[J]}{[Sec]}. יוצא דופן הוא ההקשר של מנועים בו נהוג למדוד הספק בכוח סוס.

אז איך יודעים מה ההספק של המסך שלנו? בחשמל קיים קשר לינארי בין ההספק החשמלי של מערכת לבין המתח החשמלי (V) המופעל עליה והזרם החשמלי (I) אשר זורם בה: P = V\cdot I. זרם חשמלי נמדד ביחידות אמפר [A].

במקרה שלנו, המתח החשמלי על הלדים נשאר קבוע על 5V, אך הזרם החשמלי תלוי בעוצמת ההארה שנדרוש מהלד. על מנת לתמוך בכל המצבים האפשריים, נעבוד לפי הזרם המקסימלי שכל לד יכול לצרוך (מצב שיקרה כאשר הלד יציג אור לבן בעוצמתו המירבית). דף המידע של הלדים לא מציין מה הזרם החשמלי המקסימלי, שזה די מוזר כי כמו שראינו מדובר במידע קריטי. חיפוש בגוגל מראה שרוב האנשים ממליצים לקחת מרווח ביטחון ולעבוד לפי I_{max} = 60[mA] = 0.06[A], מה שאומר שההספק של כל לד יהיה P = 0.06[A]\cdot 5[V] = 0.3[W]. ברצועת הלדים שיש לי כל מטר מכיל 60 לדים, כלומר עבור עשרה מטרים יש לי 600 לדים סך הכל, ולכן כשכל הלדים יוארו במלוא עוצמתם ההספק המקסימלי של המסך יהיה \sum P = 0.3[W]\cdot 600 = 180[W].

180 ואט זה לא מעט, וככל שנחפש ספק כוח שתומך בהספק גבוה יותר הוא יהיה יותר יקר (וכמובן חשבון החשמל שלנו יהיה גבוה יותר). למזלנו, גיליתי שעל האריזה של רצועת הלדים כתוב ערך יותר ספציפי: I_{max} = 0.04 [A]. אז המצב שלנו קצת יותר טוב, אבל פחות 0.02 אמפר לא נשמע הבדל מאוד גדול, נכון? ובכן, חישוב מחדש מראה שההספק המקסימלי החדש לכל לד יהיה 0.2 ואט, שגם זה לא נשמע הבדל מאוד משמעותי, אבל כשנכפיל ב600 נראה שההספק המקסימלי החדש של כל המסך הוא 120 ואט, הבדל משמעותי לעומת ה-180 שחישבנו קודם לכן.

מצאתי בעלי אקספרס ספק כוח שנראה מתאים. בחנות יש מגוון ספקים שונים במתחים שונים, אך במקום לציין את ההספק המקסימלי של ספק הכוח הם מציינים את הזרם המקסימלי שיכול לזרום בו. גם עם זה אנחנו יודעים להתמודד, כל לד צורך עד 0.04 אמפר אז 600 לדים יצרכו עד 24 אמפר. 24 אמפר, אגב, זה זרם חשמלי די גבוה ביחס לשימוש ביתי. בחנות, הזרם המקסימלי הכי נמוך שגדול מ-24 אמפר הוא 30 אמפר. נמיר בחזרה להספק ונקבל P_{max} = 5 [V] \cdot 30[A] = 150[W], מה שמשאיר לנו מרווח ביטחון של 30 ואט נוספים, שלמעשה אנחנו נצטרך כדי להפעיל רכיבים נוספים בפרויקט שאפילו לא התחלנו לחשוב עליהם (מחשב שיריץ את התכנה שנכתוב, שדרוגים והנפצות שיצוצו בדרך). נראה לי שאני מרוצה מהסידור הזה בינתיים.

ספק הכוח שהזמנתי באינטרנט. 5V, 30A, 150W.

אז עכשיו כשאנחנו יודעים יותר על דרישות החשמל שלנו ויש לנו איך לעמוד בהן, אפשר לנסות לתכנן את

מבנה המסך

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

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

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

נראה די מבטיח. אבל האמת, יש פה מקום לשיפור. במעגלים חשמליים מתקיים חוק אוהם, שאומר שהמתח שנופל על מוליך חשמלי הוא V=I\cdot R. עד עכשיו לא יצא לנו כל כך לדבר על ההתנגדות R. התנגדות היא הקלות שבה זרם חשמלי יכול לעבור דרך מוליך, וכשאנחנו עובדים עם כבלי חשמל פשוטים אנחנו בדרך כלל מזניחים את התנגדותם. במציאות יש לכבלים האלו התנגדות, אפילו אם קטנה יחסית, ובמעגלים עם כבלים ארוכים היא נוטה להצטבר לגדלים משמעותיים.

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

פתרון מוצלח לבעיה הזו יהיה חיבור כל אחת משורות הלדים במקבלים אל הזנות מתח. את ערוץ הנתונים נשאיר כמו שהוא. בעצם יצרנו מצב שבו חיברנו למתח בחיבור מקביל רצועות שמכילות לדים שמחוברים אליהן במקביל גם הם (בעקבות החיבור המקבילי הפנימי של הלדים בתוך כל אחת מהרצועות, לא רלוונטי שאנחנו מחברים את 5V ואת GND מכיוונים נגדיים). בשיטה הזו המרחק המקסימלי שהחשמל עובר בכל רצועה הוא פחות משליש מטר במקום 10 מטרים בשיטה הקודמת.

אז סיימנו לתכנן איך המסך יראה! עכשיו אפשר להתקדם סוף סוף סוף אל

בניית המסך

תחילה חתכתי את רצועת הלדים ל-30 רצועות של 20 לדים, והדבקתי את הרצועות אל לוח עץ. מדדתי את המרחקים בין כל רצועה כך שהמרחקים בין הלדים יהיו זהים גם במאוזן וגם במאונך.

לאחר שסיימתי להדביק את כל רצועות הלדים למקומן, קדחתי בלוח העץ חורים קטנים משני הצדדים של כל אחת מהרצועות. דרך החורים האלו יעברו כבלי החשמל של הרצועות. סך הכל קדחתי 60 חורים 😵

דרך כל חור השחלתי שני חוטי חשמל – אחד יהיה עבור ערוץ הנתונים והשני עבור הזנת החשמל. החוטים של הנתונים מחברים כל שני זוגות של רצועות סמוכות.

חוט הנתונים מחבר בין רצועות סמוכות

לבסוף את כל החוטים הלחמתי אל מקומם המתאים ברצועות הלדים. מאחורי הלוח העברתי שני כבלי חשמל שישמשו כהזנות הפלוס והמינוס עבור כל הרצועות. הזרם החשמלי של כל הלדים יחדיו הולך לעבור דרך הכבלים האלה (20 אמפר בשיא, כמו שראינו) ולכן כדאי מאוד להקטין כמה שניתן את התנגדות הכבלים. נשיג את זה על ידי בחירה בכבלים עבים מאוד – ככל שהכבל יותר עבה, כך ההתנגדות שלו קטנה יותר.

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

לבסוף את שני כבלי ההזנה חיברתי אל החיבורים המתאימים אל ספק הכוח הנבחר, ואת כניסת זרם החילופין שלו אל כבל חשמל ביתי רגיל שאפשר לחבר לקיר.

כך זה נראה מאחורה
כך זה נראה מקדימה

ועכשיו רגע האמת:

תוצאה סופית

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

ו… כלום לא קורה.

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

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

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