תוכן עניינים:
- שלב 1: הגדרת החומרה
- שלב 2: מציאת כל אותם חיישנים
- שלב 3: בדיקה לקביעת פרמטרים
- שלב 4: הפעלת הקוד
- שלב 5: החלק העליון של לולאת ה- While: חיישני בליטה פיזית
- שלב 6: עקוב אחר הנתיב
- שלב 7: עיבוד תמונה
- שלב 8: המוצר המוגמר
וִידֵאוֹ: רובו-טכנאי: 8 שלבים
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:16
דמיין לרגע שאתה אחד האסטרונאוטים הנוחתים על מאדים. יש לך מיליון דברים לעשות, דגימות שצריך לקחת, ניסויים להריץ, נתונים לאסוף, אבל פעם או פעמיים ביום אתה צריך להתרוצץ במודולי המגורים ו/או המחקר שאתה גר ועובד בהם כדי לבדוק אותם. זה הכרחי, מישהו צריך לוודא שהדבר נמצא במצב טוב, שכל אלפי החלקים והחלקים עובדים ומקומם. אבל מה אם היה עוזר אוטומטי שיפטר אותך מחובות אלה. מה אם היה רובוט קטן שיכול להסתובב בתוך המודולים כדי לוודא שהכל במקום, עובד ובטוח.
רובו-טכנאי להצלה.
בעיקרו של דבר, קוד זה שולט ברובו-טכנאי כשהוא עוקב אחר שביל בהיר על הקרקע. הוא יעקוב אחר הנתיב הזה עד שימצא צומת בנתיב או פנייה, מה שיוביל לצילום לעיבוד תמונה כדי לאפשר לרובו-טכנאי לקבל החלטה לאן ללכת הלאה. חיישני הבליטות והחבטות הקלות פועלים להגנה על הרובו-טכנאי מפני נזקים, וחיישני הבליטות קובעים מתי תצלם אבחון. בסך הכל נועד הרובו-טכנאי להתקרב במודולים של ה- Mar, לשחרר את זמנם של האסטרונאוטים תוך כדי ביצוע הבדיקה הבסיסית, רק להזמין קלט אנושי כאשר הוא מוצא משהו לא בסדר.
שוב כאזהרה, זוהי עבודה בתהליך. הקוד, כפי שהוא קיים, עובד אך יש לו שיהוקים, במיוחד מכיוון שישנן מספר תוכניות חופפות. כמו כן, כדי שפרויקט זה יעבוד במשימת מאדים בפועל, יהיה צורך לבנות רובוט למטרה ספציפית זו, כך ששוב אני מניח שמדובר בבניית "הוכחת קונספט".
יש כמה דברים שתצטרך כדי להפעיל את זה. תזדקק לתוכנית יקרה, חבילות תמיכה עבור אותה תוכנית ומעט רקע בקידוד. מכיוון שאני סטודנט, וחלק מהקוד בקומת הקרקע סופק (לפאי הפטל), לא אדבר באופן ספציפי על ההגדרה. תוכל למצוא את כל הקישורים של קוד בסיס זה למטה. בואו נגיע לרשימת החומרים.
חוּמרָה
- Raspberry Pi (השתמשנו בגרסה 3)
- iRobot ®
- איזשהו מכשיר אחיזה לשמירה על חיבור ה- Raspberry Pi לטכנאי הרובו
- מצלמת Raspberry Pi (לא משנה איזה סוג, כל עוד יש לה פוקוס אוטומטי טוב ורזולוציית תמונה)
- סוג של מעמד או נרתיק שישאיר את המצלמה פונה קדימה על הרובו-טכנאי
- חומר לשימוש כרצועה, לבנה (או בהירה מאוד), המוחזקת לרצפה בצורה מאובטחת. הוא צריך להיות מעט רחב יותר מהמרווח בין שני חיישני המצוק הקדמיים.
- 4 שלטים עם טקסט גדול מאוד (עם המילים IMAGE, RIGHT, BACK ו- LEFT מודפסים עליהם)
- גיליונות נייר צבעוני (לפחות שלושה ורצוי אדום, ירוק וכחול)
תוֹכנָה
- Matlab (2018a ו- 2017b שימשו שניהם ונראה שהם לא משנים מעט)
- חבילת תמיכה ב- Raspberry Pi עבור Matlab
- קוד Raspberry Pi לחיבור ל- Matlab (קישור לקוד המקור המצורף להלן)
- ארגז כלים לעיבוד תמונה עבור Matlab (אתה די לא יכול לבצע את הפרויקט הזה ללא ארגז הכלים)
- אופציונאלי: Matlab Mobile מותקן בטלפון שלך, אותו אסביר בהמשך
שלב 1: הגדרת החומרה
ef.engr.utk.edu/ef230-2018-08/projects/roo…
זהו הקישור לקוד הבסיס כדי להבטיח ש- iRobot® יכול לתקשר עם Matlab, יחד עם הדרכה בסיסית. כפי שאמרתי קודם, לא אכסה את החלק הספציפי הזה מכיוון שהמדריך כבר מתוכנן היטב. אזכיר כי לאחר שתעקוב אחר השלבים בקישור, תוכל להשתמש בפקודת "doc" של Matlab כדי לבדוק את המידע הכלול. במיוחד:
דוקטור רומבה
ועוד נקודה מאוד חשובה.
כאשר אתה מוריד את הקבצים מהקישור שלמעלה, הכנס אותם לתיקייה שהבאתי למעלה, מכיוון ש- Matlab מחייב קבצים שנוצרו על ידי משתמשים להיות בתיקיית העבודה הנוכחית.
כשזה לא מהדרך, בואו נעבור לקוד.
שלב 2: מציאת כל אותם חיישנים
קח שנייה ותן בדיקה ל- iRobot®. טוב לדעת היכן הם נמצאים כך שיש לך מושג לגבי התשומות שהטכנאי רובו מקבל, ותוכל להבין מדוע הדבר מסתובב במעגלים במקום לעקוב אחר הנתיב שתגדיר (זה עשוי או שאולי לא קרה). ברור שתראה את חיישן הבליטה הפיזית הגדולה בחזית. קצת יותר קשה לראות את חיישני המצוק, יהיה עליך להפוך אותו ולחפש את ארבעת החלונות הפלסטיים והצלולים ליד הקצה הקדמי. חיישני בליטות האור מוסתרים עוד יותר, אך לעת עתה יהיה מספיק לומר את ההופעה הלהקה השחורה והמבריקה את הריצות סביב החלק הקדמי של iRobot®, שנמצא בחזית סרגל החיישנים הפיזי.
ישנם חיישני ירידת גלגלים, אך אלה אינם בשימוש בפרויקט זה, אז נעבור לבדיקת החיישנים.
שלב 3: בדיקה לקביעת פרמטרים
לפני שנוכל לשלוח את הרובו-טכנאי לבצע את עבודתו, עלינו להבין את המוזרויות והטווחים הספציפיים שלו. מכיוון שכל iRobot® שונה מעט ומשתנה לאורך חיי הרובוט, עלינו להבין כיצד החיישנים קוראים את האזורים שבהם הוא יפעל. הדרך הקלה ביותר לעשות זאת היא להגדיר לך שביל בהיר (השתמשתי ברצועות של נייר מדפסת לבן אבל כל דבר בהיר יעשה) על המשטח שהרובו-טכנאי יפעיל.
הפעל את Matlab ופתח תסריט חדש. שמור את הסקריפט באותו תיקייה שתיארתי מוקדם יותר ושם אותו מה שאתה רוצה (נסה לשמור על זה קצר, כיוון ששם הקובץ הזה יהיה שם הפונקציה). הפעל את הרובוט והשתמש בהגדרת משתנה roomba מתוך המדריך, הקלד את הפקודות בחלון הפקודה.
ודא ש- Raspberry Pi מחובר ל- iRobot® והמחשב שלך מחובר לאותו חיבור אינטרנט. אתה תבלה פחות זמן בשליפת השיער בניסיון להבין מדוע מטלאב לא מתחברת
r = roomba (מספר שהגדרת)
המשתנה "r" בנסיבות אלה אינו הכרחי, אתה יכול לקרוא לזה איך שאתה רוצה, אבל זה עושה את החיים קלים יותר להשתמש במשתנה של אות אחת.
לאחר הגדרת הנתיב, והרומבה התחבר בהצלחה, מקם את הרובו-טכנאי העתידי במקום שבו אחד או שניים מחיישני המצוק נמצאים מעל השביל. ברור שזה אומר ששניים או שלושה אחרים נמצאים מעל המשטח שבחרת.
כעת הפעל את חיישני הבדיקה באמצעות הפקודה:
r.testSensors
זכור כי ה- "r" הוא המשתנה שהגדרת קודם לכן, כך שאם זה לא "r" שנה את ה- r. לכל מה שהחלטת עליו. זה יביא את מסך חיישן הבדיקה עם המון מידע.
לפרויקט זה התמקדו בקטעי הפגשים, הפגושים והצוקים. העבר את הטכנאי לרובו ודאג לצפות כיצד החיישנים משתנים על פני משטחים שונים, או עד כמה אובייקט צריך להיות קרוב כדי שערכי ligthBumper ישתנו וכו '. זכור את המספרים האלה (או רשום אותם) כיוון שתעשה זאת צריך אותם כדי להגדיר את הפרמטרים שלך תוך שנייה.
שלב 4: הפעלת הקוד
ראשית אתה בונה פונקציה. קראתי לזה "נתיב" אבל שוב, השם אינו הכרחי, אך מכאן ואילך אכוון אותו כ"נתיב ".
החלק העליון של הקוד מגדיר כמה אפשרויות קלט של משתמשים. הוא בונה כמה רשימות שישמשו ב- in listdlg ולאחר מכן מביא תיבת דו -שיח של רשימה. זה מאפשר למשתמש לבחור באיזה צבע נתיב הוא רוצה לעקוב, שיכנס מאוחר יותר.
list = {'אדום', 'כחול', 'ירוק'}
problist = {'נפגע, שמור תמונה', 'רכיב לא במקום, שמור תמונה', 'צפוי, המשך'} pathcolor = listdlg ('PromptString', 'בחר צבע נתיב', … 'SelectionMode', 'single', 'ListString', list) prob = 0; driv = ;
יש להכריז כאן על משתני ה" prob "ו-" driv "מכיוון שהם ישמשו בתוך הלולאה הראשית של הפונקציה, אך שוב, אם אתה רוצה לשנות את שם המשתנים האלה או לשנות את בחירות הרשימה, זה בסדר כל עוד אתה עקבי בשאר הקוד.
שלב 5: החלק העליון של לולאת ה- While: חיישני בליטה פיזית
החלק העליון של לולאת ה- while מכיל את ההיגיון של חיישן הבליטות הפיזיות. ביסודו של דבר, כאשר הרובו-טכנאי נתקל במשהו שהוא עוצר (או עבור חיישן הבליטות הקדמי הוא מגבה 0.1 מטר), ואז מתמקם כדי לצלם. בואו לכסות את החלק המהיר ובקרת המיקום תחילה.
אם בדקת את כל החיישנים ברובו-טכנאי בשלבים הקודמים, תדע שלחיישני הבליטות יש ערך לוגי (0 או 1) עם אפס המייצג את המיקום הרגיל, ללא לחיצה של החיישן. זכור זאת לגבי הקוד.
בעוד % %main ואילו לולאה %מקבלים מידע על פגוש S = r.getBumpers אם S. left ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S. front ~ = 0 r.stop stop
זהו החלק הבסיסי של "אם הוא פוגע במשהו, עצור". אם החיישנים אכן מזהים התנגשות, הוא עובר לחלק הבא של הקוד, מה שמתאים את מיקומו של הטכנאי רובו כדי לקבל תמונה.
אם S. left ~ = 0 %אם הלולאה לוקחת מידע על באמפר ומיישרת את המצלמה לצילום r.turnAngle (5) השהה (0.5) img = r.getImage %מצלם ומציג תמונה (img) %תיבת דו -שיח prob = listdlg (' PromptString ',' מצא מכשול בלתי צפוי, אנא זיהוי '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) השהה (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'מצא מכשול בלתי צפוי, אנא זיהוי' …, 'SelectionMode', 'single', 'ListString', problist) אחר של S.front ~ = 0 r.moveDistance (- 0.1) השהה (0.5) img = r.getImage image (img) prob = listdlg ('PromptString', 'מצא מכשול בלתי צפוי, אנא זיהוי' …, 'SelectionMode', 'single', 'ListString', problist) סוף
בעצם, לאחר הצילום התמונה תופיע תיבת דו -שיח נוספת עם שלוש אפשרויות. שתי האפשרויות הראשונות שומרות את התמונה בתיקיה מסוימת, עליה אעסוק מאוחר יותר, בעוד שהאפשרות השלישית פשוט סוגרת את תיבת הדו -שיח וממשיכה דרך הלולאה. אם אינך זוכר את האפשרויות, עיין בשלב הקודם.
עכשיו הכנסתי קטע קוד בין החלק של חיישן הבליטות לבין החלק ששומר תמונות. זה לוקח את ערכי lightBumper ומגדיר את מהירות הנסיעה ל -0.025 מטר/שנייה (איטי מאוד), מה שבעצם לא הכרחי, אבל זה מקטין את רובו-טכנאי שדופק לדברים ובסופו של דבר שחוק את חיישני הבליטות הפיזיות.
L = r.getLightBumpers אם L. left> 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 driv = 0.025 r.setDriveVelocity (0.025) else driv = 0.1 end
זה יהיה החלק שבו הערכים שראיתם (ובתקווה רשמתם) מוקדמים יותר
"L. (צד וכיוון החיישן)> 100" התבסס על הערכים שראיתי, כך שאם התצפיות שלך שונות, שנה את המספרים האלה. הרעיון הוא שאם הרובו-טכנאי יחוש משהו כמה סנטימטרים לפניו, הוא יאט, יותר מזה מיותר.
החלק הבא הוא המקום בו תמונות נשמרות להמשך.
%אם האפשרות הראשונה או השנייה נבחרה בתיבת הדו -שיח prob, שומרת תמונה אם prob == 1 %אם הלולאה בונה פרטי קובץ לתמונה, כותבת עם חותמת זמן t = שעון; בסיס שם = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (תיקיה, שם בסיס); imwrite (img, fullFileName) סגור הפסקה איור 1 (2) elseif prob == 2 t = שעון; בסיס שם = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (תיקיה, שם בסיס); imwrite (img, fullFileName) סגור הפסקה איור 1 (2)
כל שמות הקבצים והמיקומים שבהם התמונות נשמרות הינן אופציונאליות. בחרתי בתיקייה המקוננת בתוך תיקיית roomba שיצרתי בשלב ההקדמה, אך היא יכולה להיות בכל מקום שתבחר. כמו כן, התמונות נשמרות עם חותמת הזמן, אך זה לא הכרחי במיוחד (אם כי זה יהיה שימושי מבחינה היפותטית למשימת מאדים).
כאשר חיישני הבליטות הפיזיות מכוסות, אנו יכולים לנוע אל חיישני המצוק ולשביל בעקבותיהם.
שלב 6: עקוב אחר הנתיב
הקוד לחיישני המצוק מוגדר להשוואת ערכים של שני ערכי החיישנים הקדמיים ושני הצדדים. יהיה עליך לשנות ערכים אלה (כנראה) על סמך הערכים הנצפים שלך. סביר להניח שתצטרך גם לערוך ערכים אלה לאחר מספר ריצות בדיקה ולשנות אותם על סמך אור הסביבה, השעה ביום (תלוי עד כמה אזור הבדיקה מואר היטב) או כאשר חלונות החיישנים מלוכלכים.
עם זאת, לפני שנגיע לקוד חיישן המצוק, יש קטע קוד קצר שהכנסתי כדי לשטוף חלק מהנתונים המיותרים מ- Matlab. אין צורך בחלק זה, אך השתמשתי בו כדי לצמצם את שטח האחסון הנדרש להפעלת התוכנית.
clear img clear t clear basen clear תיקון ברור fullFileName
קטע הקוד הבא הוא בשר הפרויקט. הוא מאפשר לטכנאי הרובו לעקוב אחר השביל הבהיר שהונח על הרצפה. בקצרה, הוא מנסה לנווט את עצמו כך ששני חיישני המצוק הקדמיים נמצאים מעל הסף, בהתבסס על הערכים הנצפים שלך, ומאפשרים לתוכנית להתחיל את שלבי עיבוד התמונה מעט מאוחר יותר.
C = r.getCliffSensors %אם הלולאה עוקבת אחר רצועת צבעים (לבן) אם C.leftFront> 2000 & C.rightFront> 2000 %הנחיית נתיב ישר r.setDriveVelocity (driv) אחרת אם C.leftFront 2000 %פונה ימינה אם הרובוט הולך רחוק מדי שמאל r.turnAngle (-2.5) elseif C.leftFront> 2000 & C.rightFront <2000%פונה שמאלה אם הרובוט הולך רחוק מדי ימינה r.turnAngle (2.5) elseif C.leftFront <2000 &&rightFront 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 img = r.getIdage סוף %בודק אם יש עיקול בנתיב אם C. left> 2800 && C. right <2800 r.turnAngle (2.5) elseif C. left 2800 r.turnAngle (- 2.5) מחזיק מקום סוף סוף לקצה זיהוי תמונת נתיב ('מקבל תמונה') קצה קצה
זכור כי שמות המשתנים שבחרתי הם אופציונאליים, אך שוב אני חושב שזה מקל על החיים להשתמש במשתנים של אותיות בודדות במידת האפשר
כדי להסביר את החלק האמצעי של הקוד, כאשר שני החיישנים הקדמיים בורחים מקצה השביל (כשזה מגיע לצומת או כשהוא מגיע לסוף הנתיב) נראה אם יש משהו לפניו. יהיה עליך להניח אובייקט על הקרקע בסוף הנתיב או בכל צומת כדי שזה יעבוד.
לאחר הצילום היא משתמשת בזיהוי תמונות כדי להבין מה לעשות. גם בחלק זה של הקוד יש מחזיק מקום:
בעל מקום לזיהוי תמונת נתיב ('GETTING IMAGE')
השתמשתי בזה כרגע מכיוון שרציתי לדבר ספציפית על הטקסט ועיבוד הצבעים המתרחש, הנמצא בשלב הבא.
שלב 7: עיבוד תמונה
לעיבוד התמונה יש שני חלקים. ראשית היא זיהוי הצבעים, אשר מחשב את עוצמת הצבע בתמונה כדי להחליט אם להמשיך בזיהוי הטקסט או לא. חישובי הצבעים מבוססים על איזו בחירה נעשתה באותה תיבת דו -שיח ראשונה בהתחלה (השתמשתי באדום, כחול, ירוק אבל אתה יכול לבחור איזה צבע שאתה רוצה, כל עוד ניתן לזהות את הערכים הממוצעים של עוצמת הצבע על ידי מצלמת פטל פי).
img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) אדום = ממוצע (ממוצע (imgb (:,:, 1))); g = ממוצע (ממוצע (imgb (:,:, 2))); b = ממוצע (ממוצע (imgb (:,:, 3)));
זוהי בדיקת העוצמה. זה ישמש בקטע הבא כדי להחליט מה הוא רוצה לעשות.
אם אדום> g && אדום> b אם pathcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) אם R. Words {1} == IMAGE || R. Words {2} == IMAGE || R. Words {3} == IMAGE t = שעון; בסיס שם = sprintf ('\ img_%d_%d_%d_%d_%d.png', t (1), t (2), t (3), t (4), t (5)); folder = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (תיקיה, שם בסיס); imwrite (img, fullFileName) pause (2) elseif R. Words {1} == RIGHT || R. Words {2} == ימינה || R. Words {3} == RIGHT r.turnAngle (-75) elseif R. Words {1} == LEFT || R. Words {2} == שמאל || R. Words {3} == LEFT r.turnAngle (75) elseif R. Words {1} == BACK || R. Words {2} == חזרה || R. Words {3} == BACK r.turnAngle (110) end else r.turnAngle (110) end end
קטע זה מחליט אם הצבע שנבחר בתיבת הדו -שיח הראשונה תואם את הצבע שהמצלמה רואה. אם הוא עושה את זה הוא מפעיל זיהוי טקסט. זה נראה כדי לראות איזו מילה (IMAGE, BACK, RIGHT או LEFT) מופיעה ואז או מסתובבת (לימין ושמאל), מסתובבת (לאחור) או מצלמת תמונה ושומרת אותה כמו קודם.
סיפקתי רק קטע אחד של הקוד לצבעים השונים
כדי לאפשר לקוד לזהות כחול וירוק, פשוט העתק את הקוד ושנה את בדיקת ההיגיון בחלק העליון של הקטע והגדר את "pathcolor == (מספר)" כך שיתאים לבחירות הצבעים מתיבת הדו -שיח העליונה (עבור קוד כפי שהוא מוצג, כחול יהיה 2 וירוק יהיה 3).
שלב 8: המוצר המוגמר
כעת על הרובו-טכנאי להתקרב למודולי המשימה של מאדים ולדווח לאסטרונאוטים כאשר משהו לא במקום.
זכור, יש לשנות את כל ערכי חיישן המצוק ו lightBumper לערכים הנצפים שלך. כמו כן, מניסיון מצאתי שעדיף לבדוק את הפרויקט הזה על רצפה בצבע כהה ואף טוב יותר אם הרצפה אינה מחזירי אור. זה גורם לניגוד להגדיל בין השביל לרצפה מה שהופך את הסיכוי גבוה יותר שהרובו-טכנאי יעקוב אחריו כראוי.
מקווה שנהניתם להקים עוזר קטן למשימת מאדים, וליהנות בבנייה.
מוּמלָץ:
רובו-דוג פשוט (עשוי מפתחות פסנתר, אקדח צעצוע ועכבר): 20 שלבים (עם תמונות)
רובו-דוג פשוט (עשוי מפתחות פסנתר, אקדח צעצוע ועכבר): הו, אזרבייג'ן! ארץ האש, אירוח נהדר, אנשים ידידותיים ונשים יפות (… סליחה, אישה! כמובן שיש לי רק עיניים אליך, אשתי gözəl balaca ana ördəkburun!). אבל בכנות, זה מקום מאוד קשה ליצרנית, במיוחד כאשר אתה
זרוע רובו רובו מיקרו סרוו: 10 שלבים
זרוע רובוט כפולה של מיקרו סרוו: בהדרכה זו תכין זרוע רובו סרוו כפולה הנשלטת על ידי אגודל
רובוט ג'וי (רובו דה אלגריה) - קוד פתוח בתלת -ממד מודפס, רובוט מופעל בארדואינו !: 18 שלבים (עם תמונות)
רובוט ג'וי (Robô Da Alegria) - קוד פתוח בהדפסה תלת מימדית, רובוט מופעל על ידי Arduino !: פרס ראשון בתחרות גלגלי ההוראה, פרס שני בתחרות Arduino Instructables, ורב שני בתחרות עיצוב לילדים. תודה לכל מי שהצביע עלינו !!! רובוטים מגיעים לכל מקום. מיישומים תעשייתיים ועד לך
ערכות רובו-חנון תואמות Arduino Nano: 5 שלבים
ערכות Robo-Geek תואמות Arduino Nano: ברכות על רכישת ערכת Robo-Geek התואמת Arduino Nano. במדריך זה נדריך אותך כיצד להתחיל עם לוח Arduino Nano תואם. ערכת רובו-חנון תואמת Arduino Nano תוכננה עבור אלה החדשים ב- Arduino w
רובו מיני סומו: 5 שלבים
רובו מיני סומו: בתחילה עליך להיות בעל כל החומרים הדרושים בכדי להתחיל בהרכבת רובוט הסומו. לשם כך עליך לקבל את המכשירים הבאים: 1 PIC 16F877A 2 קריסטל קוורץ 4 מגה-הרץ 4 קבלים 22pF 2 חיישן קו QTR-1RC דיגיטלי 1 מצב Bluetooth -05 1 אולטרה