2- הארדואינו מצטרף למשוואה

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

 

הפינים בלוח הארדואינו יכולים לזהות רק 2 מצבים: כאשר ישנו מתח בפין קלט, וכאשר אין מתח. סוג הקלט הזה נקרא גם דיגיטלי (או בינארי, מכיוון שיש 2 מצבים בלבד) ובנוסף נתייחס אליהם כ HIGH ו LOW, כאשר HIGH זה כמו להגיד “יש מתח” ו LOW אומר שאין מתח בפין הזה. כאשר נכתוב לפין מסוים HIGH (באמצעות ()digitalWrite) אנו בעצם מדליקים את אותו פין (וכאשר נכתוב לו LOW נכבה אותו). הפינים הדיגיטלים של הארדואינו יכולים לשמש כפלט וכקלט, ובקוד נגדיר אותם לפי הצורך. כאשר נגדיר אותם כפלט נוכל לדוגמה להדליק איתם נורות LED, וכאשר נגדיר אותם כקלט נוכל לדוגמה לקרוא האם המתג לחוץ או לא.

יש לציין כי מומלץ להתחיל לחבר מפין 2 והלאה (מכיוון שפינים 1 ו-0 משמשים לתקשורת עם המחשב).

 

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

ראשית,נחבר את המתח (5v) מלוח הארדואינו ל+ (פלוס) שבלוח המטריצה (בעזרת חוט מגשר) ואת ה GND ל- (מינוס) שבלוח המטריצה, בדיוק כמו בפרויקט הקודם. כעת נמקם 2 נורות LED אדומות ונורת LED אחת ירוקה על גבי לוח המטריצה. נחבר כל קתודה של נורת LED (הרגל הקצרה של נורת ה LED) לאדמה (למינוס בלוח המטריצה) בעזרת נגד של 220Ω (אוהם). כל אנודה (הרגל הארוכה) תתחבר לארדואינו, לפין שונה: ה LED הירוק יתחבר לפין (הדיגיטלי) מס’ 3, ו-2 נורות הלד האדומות יתחברו לפינים 4 ו-5.

עכשיו נמקם את המתג על גבי לוח המטריצה (עדיף שיהיה רחוק קצת מנורות ה LED כדי שלא יהיה צפוף, ויהיה לכם מרחב תמרון) נמקם את המתג באותה צורה שמיקמנו אותו בפרויקט הקודם, כאשר 2 הרגליים האחוריות שלו יתחברו לאותו מעגל כדי להשלים את המעגל ברגע הלחיצה. רגל אחת של המתג נחבר לכוח (לשורת הפלוס בלוח המטריצה) ואת הרגל השניה לפין הדיגיטלי מס’ 2. בנוסף, נצטרך להוסיף נגד 10kΩ מהאדמה בלוח המטריצה (שורת המינוס) אל הרגל שמתחברת לפין מס’ 2 באדרואינו. הנגד הזה מחבר את פין לאדמה כאשר המתג פתוח (כאשר המתג פתוח - לא לחוץ הוא יקרא LOW, ז”א אין מתח המגיע / עובר דרך המתג).

להלן סכמה ואיור להמחשה:

Arduino Project number 2

כמה הערות לפני כתיבת הקוד

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

בתוכנית שלנו, ניצור משתנה, לפני שנגיע לחלק העיקרי של התוכנית. המשתנים הם שמות שאנו נותנים לאזורים בזיכרון של הארדואינו, ע”י הצמדת שם לאזור בזיכרון אנו יכולים להתייחס אליו (כדי לשמור או לקרוא ממנו דברים) (דמיינו חלל ריק בתוך קופסא, ברגע שתציירו ריבוע בתוך הקופסא ותקראו לריבוע הזה x תוכלו להתייחס אליו והמחשב ידע למה אתם מתכוונים, תוכלו להגיד לו לשמור דברים בתוך ה x או להגיד לכם מה יש ב x וכד’. אם לא הייתם נותנים שם לריבוע לא הייתם יכולים לקרוא לו בצורה שהמחשב יבין למה אתם מתכוונים). הערכים בתוך המשתנה יכולים להשתנות, ז”א אם הצבתם במשתנה (תא בזיכרון) ערך הוא כמובן לא סופי ואתם יכולים לשנות אותו בעתיד. כדי שיהיה לכם קל לעקוב אחרי התוכנית אותה אתם בונים מומלץ להשתמש בשמות הגיוניים למשתנים, ז”א לא לקרוא x למשתנה השומר את מספר הנורות, אלה לקרוא לו numberOfBulbs (בנוסף, שימו לב שאסור לשים רווחים באמצע שם המשתנה, לכן, כדי שיהיה קל לקרוא את שם המשתנה כתבתי אות גדולה בכל תחילת מילה של המשתנה, מה שנקרא גם CamelCase), זאת מכיוון ש x לא אומר לכם כלום, אתם תצרכו לזכור את זה, ואם תחזרו לתוכנית עוד שבוע או שתתנו אותה למישהו אחר יהיה לו קשה מאוד להבין למה התכוונתם, לכן, שוב, כדאי מאוד לקרוא למשתנים בשמות הגיוניים המתאימים למה שהם צריכים לשמור.

 

כתיבת הקוד

 לפני ההסבר המפורט של כל שורה, כך יראה הקוד הסופי:

void setup(){
    pinMode(2, INPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
}

void loop(){
    switchState = digitalRead(2);

    if (switchState == LOW) {
    // The button is not pressed
        digitalWrite(3, HIGH); // greed LED
        digitalWrite(4, LOW); // redLED
        digitalWrite(5, LOW); // redLED
    } else {
    // The button is pressed
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        delay(250); // Waite for a quarter second

        digitalWrite(4, LOW);
        digitalWrite(5, LOW);
        delay(250); // Waite for a quarter second
    }
} // Go back to the beginning of the loop

 

כדי ליישר קו, אסביר כי כדי ליצור משתנה, יש להכריז איזה סוג הוא יהיה, int (קיצור של Integer - בתרגום: מספר שלם) זהו סוג של משתנה המכיל אך ורק מספרים שלמים (לדוגמה 5, אך לא 4.5, לא מלל, וכ’ו). בנוסף, כל פקודה שלכם למחשב צריכה להסתיים ב ; (נקודה פסיק).

בנוסף, המבנה בו הארדואינו פועל הוא הרצת הפונקצייה setup פעם אחת, כשהבקר עולה. לכן שם אנו נגדיר את הפינים של הארדואינו להיות קלט או פלט בעזרת פונקציה הנקראת ()pinMode. נגדיר את הפינים שאליהם מחוברים נורות ה LED להיות OUTPUT (פלט), ואת הפין של המתג להיות INPUT (קלט) (יש לכתוב את מס’ הפין פסיק קלט / פלט, ניתן לראות זאת ב Reference באתר Arduino.cc כאן). לאחר שהארדואינו הריץ פעם אחת את ה setup הוא יריץ את פונקציית ה loop בלולאה שלא נגמרת (אינסופית) (כל עוד הוא דולק) לכן שם נכתוב את פקודות התוכנית. פה נבדוק את המתח בפין שמוגדר כ INPUT (פין מס’ 2), ולפי המתח שנקלוט בפין הזה נדליק או נכבה את נורות ה LED בפיני ה OUTPUT.

כדי לבדוק את רמת המתח בפין דיגיטלי נשתמש בפונקציה ()digitalRead שבודקת בפין הנבחר את המתח, כדי להגיד לה איזה פין לבדוק הפונקציה מקבלת פרמטר. פרמטרים הם מידע שמועבר לפונקציה לה אנו קוראים. את התוצאה שהפונקציה תחזיר (רמת המתח) נשמור במשתנה שנקרא לו switchState (שווה הינו סימן השמה, ז”א לשים את הצד הימני בתוך הצד השמאלי). שימו לב שכדי להקל עלינו, סביבת הפיתוח של הארדואינו מסמנת בצבעים שונים מילים מוכרות, כמו הדגש על שם הפונקציה, פונקציות המוכרות להם, פרמטרים ידועים (OUTPUT / INPUT), וכ’ו.

 

כשיהיה מתח בפין מס’ 2 נקבל מהפונ’ ()digitalRead (ל Reference) תוצאה של HIGH (או 1), וכשלא יהיה מתח נקבל LOW (או 0). אז לאחר שקראנו את המתח שיש בפין מס’ 2 נרצה לדעת האם הוא נמוך או גבוה, לכן נשתמש במשפט if או במילים אחרות: “משפט תנאי”, וזהו בדיוק כמו שזה נשמע, משפט של אם -> אז. ז”א אם ___ יקרה אז תבצע _\__. המשפט בנוי ע”י כתיבת if ולאחריו סוגריים רגילים בתוכם תנאי הבדיקה, לאחר מכן סוגריים מסולסלים ובתוכם מה המחשב צריך לבצע במידה והתנאי מתקיים / נכון. בנוסף, ניתן להוסיף למשפט if, בסופו, את המילה else, ובעצם ע”י כך אנחנו אומרים אם התנאי (if) לא מתקיים, אז ____ (תבצע משהו אחר).

ה else יהיה מורכב ע”י המילה else ואחריה סוגריים מסולסלים שבהם נכתוב מה לבצע במידה ומתקיים ה else (או במילים אחרות לא מתקיים תנאי ה if), (שימו לב של else אין סוגרים רגילים כי לא נכתוב בו תנאי, הוא מתקיים כל פעם שתנאי ה if לא מתקיים). ומכיוון שהסימן = מסמן השמה במחשבים, נתאר שווה ע”י הסימן פעמיים שווה: ==, ע”י כתיבת סימן השווה (==) נשווה 2 דברים (כמו האם התוצאה שקיבלנו מ digitalRead אותה שמרנו במשתנה בשם switchState שווה ל LOW (ואם לא, אז היא שווה ל HIGH מכיוון שאלו 2 הערכים היחידים אותם היא יכולה לקבל). בנוסף, שימו לב שכדי לכתוב הערות בקוד (מלל ממנו המחשב יתעלם) נכתוב // (2 סלשים) ואז את ההערה.

 

ניתן לראות בקוד שבתנאי של ה if השוונו אותו ל LOW, מצב שבו אנחנו לא מקבלים מתח, ז”א שהכפתור לא לחוץ - המעגל לא נסגר (מתחת ל if הוספתי הערה שמתארת את המצב) לכן בתוך ה if נכתוב את הפקודות שאנחנו רוצים שהארדואינו יבצע כשהכפתור לא לחוץ (נורת ה LED הירוקה תקבל מתח באופן קבוע ו-2 הנורות האדומות לא). לכן פין מס’ 3 (אליו הלד הירוק מחובר) יקבל HIGH ע”י הפונקציה digitalWriteReference) (שעוזרת לנו לכתוב אל הפין), נציין את מס’ הפין ואת המתח שיקבל, ול-2 הלדים האדומים נכתוב LOW.

ב else (המצב בו הכפתור לחוץ) נכתוב לנורת הלד הירוקה (פין מס’ 3) שיקבל LOW (לא יקבל מתח) ולאחת מהנורות האדומות HIGH ולשניה LOW על מנת שרק אחת תדלק (אני בחרתי בנורה המחוברת לפין מס’ 5, אך הסדר כמובן לא חשוב). לאחר מכן נרצה שהנורה תדלק לכמה רגעים ולא תכבה מיד, לכן בעזרת הפונקציה ()delay (ל Reference) נשהה את הרצת התוכנית ל-250 מילי שניות (יש 1000 מילי שניות בשניה אחת), לכן נשהה אותו לרבע שניה ואז נחליף את המצב בפינים מס’ 4 ו-5, בגלל שאני בחרתי להדליק קודם את פין מס’ 5 עכשיו הוא יקבל LOW ופין מס’ 4 יקבל HIGH (בפין מס’ 3 אין צורך לגעת, אם לא תגידו לו לעבור למצב אחר הוא ישאר באותו מצב שהשארתם אותו בהוראה האחרונה).

 

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

 

לסיכום

בפרויקט הזה יצרנו את תוכנת הארדואינו הראשונה שלנו, התוכנה שולטת בהתנהגות של 3 נורות לד (LED) על בסיס מתג. למדנו על איך תוכנת הארדואינו בנויה (פונקציות setup ו loop), משתנים, משפט תנאי (if בתוספת else), שימוש בפונקציות אחרות המגיעות עם הארדואינו באופן מובנה: לקריאה מפין digitalRead, לכתיבה לפין digitalWrite, ולהשהיית התוכנית לזמן קצוב delay).

אני ממליץ לשחק עם התוכנית שכתבנו, נסו לשחק עם הזמן של כל delay ולראות איך התוכנית מגיבה, להחליף את סדר הפעלת הלדים האדומים, להחליף את הלדים עצמם על גבי לוח המטריצה ולראות האם התוכנית מגיבה אחרת, הסירו לד אדום אחד ותגרמו ללד אדום שנשאר להבהב לבד כל חצי שניה (או משהו כזה), ותשאלו את עצמכם למה כשאתם מפסיקים ללחוץ על המתג בדיוק כשהנורה המחוברת לפין מס’ 5 דולקת, הלד הירוק לא נדלק מיד? ולמה הלד האדום שמחובר לפין מס’ 4 דולק אחריו (הרי כבר עזבתם את המתג לפני שהוא נדלק, מה פתאום?!).