4 - Different Wavelengths (colors) and RGB Light

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

אתם בטח תצפו שכדי לגרום לנורות לדהות (fade out) כל שצריך הוא להוריד את המתח, אך זה לא כזה פשוט. הארדואינו אינו יכול לשנות את המתח בפיני היציאה שלו, הוא פולט אך ורק 5V. לכן נצטרך להשתמש בטכניקה הנקראת PWN ׁ (ראשי תיבות: Pulse Width Modulation) על מנת לגרום לאור של נורות הLED לדעוך. PWN הופך (בזמן קבוע) במהירות את הפלט בפין מ’גבוה’ (HIGH) ל’נמוך’ (LOW), החלפה זו מתרחשת בזמן מהיר יותר מאשר זה שהעין האנושית מסוגלת לקלוט (בדומה לאופן בו סרטים עובדים, ע”י החלפת מספר תמונות סטטיות במהירות כדי ליצור אשליה של תנועה).

כשאנו הופכים במהירות את הפלט בפין מHIGH לLOW (בעצם 1 ו 0) אנו משנים את המתח. אחוז הזמן בו הסיכה מקבלת מתח HIGH נקרא “מחזור עבודה” (Duty Cycle). לדוגמה: כאשר הפין נמצא חצי מהזמן על HIGH וחצי על LOW במשך הזמן הקבוע, מחזור העבודה הוא 50%. ומחזור עבודה נמוך יתן לנו אור עמום מאשר אחוז גבוה במחזור העבודה.

שימו לב כי לארדואינו אונו יש 6 פינים המסוגלים לבצע את שיטת הPWN והם מסומנים בתילדה (סימן ה: ~). פינים אלה הינם הפינים הדיגיטליים 3,5,6,9,10 ו 11. בנוסף, עבור הקלט בפרויקט הזה נשתמש בנגד תלוי אור (באנגלית: Photoresistor), החיישן משנה את ההתנגדות שלו בהתאם לכמות האור הפוגעת בו (ואם תחברו רגל אחת של הנגד לארדואינו, תוכלו למדוד את השינוי בהתנגדות ע”י מדידת המתח מהפין).

 

חיבור הרכיבים

חברו ללוח המטריצה חוטים מעמודות ה+ וה-, אל ה5V וה GND (בהתאמה, בדיוק כפי שעשינו עד כה). כעת בחלק התחתון של לוח המטריצה נמקם 3 נגדים תלויי אור (Photoresistors) ככה שהם יחצו את התעלה המחלקת את לוח המטריצה לשניים. בצד הרחוק של לוח המטריצה נחבר 3 חוטים מגשרים לעמודת ה+, כדי שהנגדים יקבלו מתח, ואת עמודת ה+ הזו נחבר לעמודת ה+ הראשונה (הקרובה יותר לארדואינו, זאת שחיברנו אליה בהתחלה את ה5V). בצד השני של הנגדים תלויי אור נחבר נגדים רגילים של 10K Ω (קיצור של 10 קילו אוהם) לכל אחד מצד ה- של הנגדים תלויי האור (3 נגדים תלויי אור סה”כ, לכן 3 נגדים של 10K Ω). בנוסף, בצד של הנגדים נחבר חוט מגשר אל פיני הקלט האנלוגיים: A0, A1, A2.

כדי לסנן את האור, ניקח 3 מלבנים של ג’ל בצבע (Wikipedia - Color Gel) ונחבר אותם לנגדים תלויי אור, הראשון, המחובר לA0 יהיה בצבע אדום. השני, המחובר לA1, יהיה בצבע ירוק. והשלישי, המחובר לA2 יהיה בצבע כחול.

כעת נחבר נורת לד RGB שתקלוט את האור מ3 הנגדים תלויי האור ותראה לנו את הצבע המשולב שמופק מהם. לנורה הזו (בניגוד מנורת LED רגילה) יש 4 רגליים, אחד לכל צבע (אדום, ירוק, וכחול) ועוד רגל לאדמה. הרגל הארוכה ביותר (נמצאת באמצע) היא הרגל לאדמה, והיחידה שלידה היא הרגל לנורה האדומה, שתי הרגליים בצד השני שלה הם ירוק וכחול (כשהכחול הוא הפנימי והירוק הוא החיצוני). לרגליים של הצבעים נחבר נגד רגיל 220Ω, ולאחריו חוט מגשר לפינים הדיגיטליים 9,10, 11. מהם נוציא את הפלט של הצבעים (שאנחנו קולטים מהנגדים תלויי האור). להלן סכמה ואיור להמחשה:

Arduino Project number 4

 

הקוד

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

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

משהגדרנו את 12 המשתנים, נמשיך לאזור הsetup (למי שלא זוכר, זהו האזור שרץ לפני ביצוע התכנית - פונקציית loop, והוא רץ/מתבצע פעם אחת בלבד). לכן, כאן, נפתח חיבור תקשורת בין הארדואינו למחשב, ע”י הפקודה ()Serial.begin ונגדיר את מהירות התקשורת להיות 9600bps. בנוסף, נגדיר את הפינים המחוברים לנורת RGB כפיני פלט, זכרו שלא צריך לכתוב את מס’ הפין עצמו, שמרנו את מס’ הפין במשתנה קבוע (שלא ניתנו לשנותו) בשם greenLedPin (ובאופן דומה לצבעים הנוספים), וכמובן לא לשכוח לסגור את הפונקציה עם סוגריים מסולסלים.

  • מה שכתבנו עד כאן ניתן לראות בתמונה משמאל.

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

בתוך פונקציית הלולאה נתחיל לקרוא את המשתנים מהנגדים תלויי האור, במרווח של 5 מילי שניות בין קריאה בין כל נגד. ז”א נשתמש בפוקנציה ()analogRead ובתוכה נכניס את הפין (זכרו, כל מס’ פין שמרנו במשתנה קבוע בשם greenSensorPin (ובאופן דומה לשאר הצבעים), לכן במקום להכניס את מס’ הפין לתוך פונקציית ה analogRead נכניס את המשתנה הקבוע), ואת הערך שאנו קוראים מכל פין אנלוגי נכניס למשתנה שהכנו במיוחד בשבילו (greenSensorValue, ובאופן דומה לשאר הצבעים), בעזרת סימן ההשמה (סימן השווה, = ). בנוסף, נכניס מרווח קטן בין הקריאות מכיוון שלadb (הממיר המובנה של הארדואינו מאנלוגי לדיגיטלי) לוקח כמה מילי שניות לבצע את הפעולה. מרווח של 5 מילי שניות יספיק.

כעת, לשם הבדיקה, נדפיס את הערכים, כדי להדפיס נעזר בפקודה ()Serial.print. הt\ שווה ללחיצה על tab (מכניס רווח השווה ל6 של מקש הspace). בנוסף, כדי להדפיס את הערכים אותם קלטנו נדפיס את הערכים במשתנים greenLedPin אליהם קלטנו את הערכים מהפין האנלוגי בפסקה הקודמת.

  • ניתן לראות את מה שכתבנו עד כה בתמונה משמאל.

בשביל הטריק בעזרתו ניתן לשנות את בהירות נורת הLED (טכניקת PWN) נשתמש בפקודה ()analogWrite הכותבת …. הפונקציה מקבלת 2 ערכים (נקראים פרמטרים), הראשון הפין אליו יש לכתוב את הערך, והשני הערך אותו יש לכתוב (נע בין 0-255). הערך של הפרמטר השני מייצג את מחזור העבודה שבו הארדואינו יוצא פלט אל הפין. ערך של 255 יכוון את הפין לHIGH כל הזמן, מה שיהפוך את הLED לבהיר ביותר שהוא יכול להיות. ערך של 127 (חצי) יכוון את הפין להיות HIGH חצי מהזמן, מה שיגרום לLED להיות עמום יותר. 0 יכוון את הפין להיות LOW כל הזמן, מה שיכבה את הLED. כדי להפוך את הקריאות מהחיישן (שכזכור קורא ערכים בין 0-1023) לערך בין 0-255 (שכזכור זה מה שהפונקציה analogWrire מקבלת) יש לחלק ב4, לכן נוסיף 3 שורות לכל 3 הצבעים, נחלק את המשתנה שבו שמור הערך שקלטנו (נמצא ב greenSensorValue למי שלא זוכר, ובאופן דומה דומה בשאר הצבעים), ואת הערך החדש (אחרי החילוק ל4) נשמור במשתנה שהגדרנו מראש, בשם greenValue (באופן דומה לשאר הצבעים).

כעת, כדי לוודא שאכן הדברים בוצעו, שוב, נבצע הדפסה של כל הערכים, הפעם של המשתנים אחרי החילוק ל4 (ז”א של greenValue, ובאופן דומה לשאר הצבעים). ולבסוף נכתוב בעזרת הפקודה ()analogWrite את הערכים לנורת הRGB.

  • מה שכתבנו עד כה (בעצם כל התכנית) ניתן לראות בתמונה משמאל. ** את הערכים שהחיישן דוגם, מדפיס, מחלק ב4, ומדפיס שוב ניתן לראות בעזרת ה Serial monitor (ציור של זכוכית מגדלת בצד הימני בשורה של שאר הפעולות).

 

לסיכום

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

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