שיעור 10

הכרזה על המנצח

למדנו להשתמש במסכי 7 סביות ובחיישנים האינפרה אדומים, אבל הם עדיין לא חלק מהמרוץ שלנו.

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

זיהוי חציית קו הסיום

אנחנו צריכים להחליט איזה ערך של החיישן יחשב לחצייה של קו סיום, נקרא לערך הזה בשם ״ערך החצייה״.

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

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

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

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

שלב 1: חישוב ערך החצייה חיישן ימין

מהנסיון שלנו בנינו נוסחה לחישוב ערך החצייה. הנוסחה היא: ערך מקסימלי ללא מכונית + 50

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

 

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

שלב 2: חישוב ערך החצייה חיישן שמאל

עכשיו נחשב את ערך החצייה של חיישן שמאל.
החיישן הימני מחובר לשן 6 של הארדואינו, והחיישן השמאלי מחובר לשן 7.
שנו את הקוד על פי הסרטון הבא:
 

וזו התוצאה:

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

שלב 3: המתנה לחציה

עכשיו כשאנחנו יודעים מה הם ערכי החצייה נוסיף בקוד המתנה לחצייה, מה זה בדיוק אומר?

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

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

שנו את הקוד על פי הסרטון:

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

שלב 4: הוספת תנאי ״או״

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

כלומר התנאי שלנו להפסקת ההמתנה של הלולאה צריך להיות: ״אם חיישן 1 הגיע לערך חצייה או חיישן 2 הגיע לערך חצייה״.

נתרגם את התנאי שכתבנו לקוד, בצעו את השינויים על פי הסרטון:

במקום 120, 127 השתמשו בערכי החציה שחישבתם מוקדם יותר בשיעור זה.
תזכורת: A7 זה החיישן השמאלי, A6 זה החיישן הימני

מעולה! מרגע שהזינוק יוצא לדרך, יש לנו לולאה שממתינה לחצייה באחד המסלולים, אבל מה עושים אחרי שההמתנה מסתיימת?

אחרי שההמתנה מסתיימת אנחנו יודעים שאחד הרכבים חצה את קו הסיום ואנחנו צריכים להכריז על המנצח!

שלב 5: מי ניצח?

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

עד עכשיו השתמשנו בבלוק תנאי מסוג ״אם״-״אז״ , עכשיו נשתמש בבלוק תנאי מתקדם קצת יותר ״אם״-״אז״-״אחרת״

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

 

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

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

שלב 6: שיפורים למרוץ

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

כמו כן כדאי לאפס את מסכי ה7 סיביות בתחילת כל מקצה.

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

בצעו את השינויים המתוארים בסרטון הבא והעלו את הקוד:

 

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

שלב 7: כיול חיישנים אוטומטי

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

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

החלק שעושה את הכיול האוטומטי בקוד משתמש ב״משתנים״ שזה נושא שעדיין לא למדנו ולכן אנחנו לא נסביר אותו כאן (אבל תלמדו אותו בשיעורים הבאים כמובן).

 

אתם מוזמנים להוריד את הקוד שכולל את הכיול האוטומטי ולהעלות אותו לארדואינו שלכם:

 

סיימנו! (לא בדיוק)

כל הכבוד! סיימתם את החלק הבסיסי של סדנת מסלול המרוצים החכם של פליי רובוטיקס!

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

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

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

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