ברוכים הבאים לסדרת פוסטים חדשה: 4Probot, רובוט מבוסס ארדואינו שהוא ניסוי מתגלגל – תרתי משמע! המטרה כאן אינה להציג בניה של רובוט לפי תוכנית קבועה מראש, אלא לחקור ולהתנסות בטכניקות ובטכנולוגיות שונות שקשורות לעולם הרובוטים (ובמיוחד אלה הקטנים שנוסעים עצמאית על רצפת הבית…)
נסיעת המבחן הראשונה של 4Probot: בדיקת בקר המנועים
גילוי נאות: סדרת הפוסטים 4Probot הינה שיתוף פעולה עם אתר 4project.co.il – חנות אינטרנטית ישראלית לרכיבים, חלקים ומוצרים לתחומי המייקינג השונים. חלק מרכיבי הרובוט ניתנים לי על ידי אתר 4Project תמורת סקירה הוגנת וקישורים בבלוג, ובזה מסתכמת ההתקשרות המסחרית ביני לבין האתר.
פלטפורמה
התשתית הפיזית של 4Probot היא פלטפורמה פשוטה ובסיסית להפליא שקניתי באיביי. נכון לזמן כתיבת שורות אלה זוהי אולי פלטפורמת הרובוט הזולה ביותר שאפשר להשיג – בסביבות 14 דולרים – וכמובן שיש למחיר הזול הזה מחיר משל עצמו, באיכות מפוקפקת של החלקים ובצורך להשיג רכיבים נוספים בנפרד.
את הרכבת הפלטפורמה צריך לבצע לבד (יש איורים, אך מוטב לא לסמוך רק עליהם אלא להשתמש גם בשכל הישר). זה כולל בעיקר הברגות של ברגים ואומים מצורפים, וכן הלחמות של חוטים – לא מצורפים – למנועים ולמפסק. בשלב זה, הרובוט עדיין לא עושה שום דבר. הוא זקוק, קודם כל, לאספקת חשמל למנועים.
בקר מנוע
לוח ארדואינו אינו מסוגל לספק את החשמל הדרוש להנעת המנועים האלה, ואם ננסה בכל זאת, סביר להניח שנהרוס אותו. מצד שני, אי אפשר לחבר את המנועים ישירות לסוללות או למצבר – הם אמנם יפעלו, אך לא תהיה לנו שום שליטה עליהם. מה שאנחנו צריכים הוא גורם שישלב את אותות הבקרה החלשים מהארדואינו עם המתחים והזרמים החזקים מהסוללות. גורם כזה נקרא בשם "בקר מנוע" (Motor controller או Motor driver). יש אינספור סוגים של בקרי מנוע בשוק, והפרמטר הראשון שיעזור לנו בבחירה הוא צריכת הזרם של המנועים.
בתמונה הבאה מודגמת מדידה של צריכת הזרם של לוח ארדואינו: המולטימטר מחובר בטור במעגל, כך שכל החשמל ממש עובר דרכו. הצריכה של הארדואינו היא, אם כן, 32.5 מיליאמפר.
שימו לב שכדי למדוד זרמים של מנועים, חובה – בהתאם לדגם המולטימטר – לכוון את המחוג לטווח הנכון ולהעביר את הפרוב (ה"עט") האדום לשקע שמותאם לזרמים הצפויים. את המדידה יש לבצע גם כשהמנוע מסתובב כרגיל – שם קיבלתי 200 מיליאמפר לכל מנוע – וגם כשהוא מוחזק בכוח כדי שלא יוכל להסתובב, מה שנקרא "זרם תקיעה". זרם התקיעה שנמדד אצלי היה 400 מיליאמפר למנוע, וזה נחשב גבול עליון של המנוע, שבקר המנוע חייב להיות מסוגל להתמודד איתו. למרבה המזל מדובר בערכים נמוכים למדי, כך שכל האופציות היו פתוחות בפניי.
מה שבחרתי בסופו של דבר הוא בקר מנוע לשני מנועי DC בזרם של עד 1A של חברת Pololu. הוא מבוסס על הרכיב TB6612FNG של טושיבה, זול, קומפקטי להפליא (אפשר להסתיר אותו כמעט לגמרי עם מטבע של עשר אגורות) ועם חורים לפינים בריווח סטנדרטי של 2.54 מ"מ.
החיסרון של כל בקרי המנוע כמעט הוא עניין החום: כשהעומס החשמלי גדול, הם מגיעים בקלות לטמפרטורות די פרועות, עד כדי סכנה לאצבעות של המשתמש או למערכת. במקרה שלי לא צפוי עומס רב, אך ליתר ביטחון הזמנתי עוד שני חלקים: גוף קירור קטן ושחור מאלומיניום, בגודל 9x8x5 מ"מ (מכסה שטח קצת יותר גדול מהשבב בתמונה למעלה), וסרט דו-צדדי להדבקת גופי קירור.
הסרט הזה הוא פטנט שלא הייתי מודע לקיומו קודם לכן, והוא חוסך הרבה התעסקות עם משחות טרמיות וחיזוקים למיניהם. היריעה המלאה היא מדבקה דו-צדדית בגודל 5×5 ס"מ, והיא מכוסה בשקפים משני הצדדים. קל מאד לגזור חלקים בגודל הרצוי, אם כי הקילוף של השקפים מצריך אצבעות קצת יותר עדינות משלי. החיבור שהמדבקה יוצרת בין השבב לגוף הקירור לא חזק מאד מבחינה מכאנית והוא עלול להתנתק במשיכה או במכה חזקה, אבל בשביל ניסויים ו-prototyping זה נוח ופשוט הרבה יותר מהחלופות. הנה התוצאה הסופית (הכחול למטה הוא אחד השקפים שקולפו מסרט ההדבקה):
החיווט
חיסרון נוסף של בקרי מנוע רבים, במיוחד אלה הקומפקטיים, הוא שהכיתוב של הפינים השונים נמצא בצד התחתון, כך שאם מרכיבים אותם על מטריצה, קשה מאד לדעת איזה חוט צריך להתחבר לאן. הפתרון הוא כמובן להדפיס שרטוט שיהיה כל הזמן מול העיניים ולעבוד לפיו. זה חשוב במיוחד בבקרי מנוע, כי גם הטעות הכי קטנה בחיווט שלהם עלולה לעלות ביוקר.
השמות האלה די מבלבלים, אז בואו נעבור עליהם בקצרה:
כל ה-GND הם כמובן ה"אדמה" שמשותפת גם למנועים וגם לארדואינו. כלומר, כולם מתחברים בסופו של דבר לאותו מקום. Vcc הוא מתח שמגיע מהארדואינו, ואילו VMOT הוא מקור המתח עבור המנועים. אם תתבלבלו ביניהם זה ייגמר בבכי. STDBY, כלומר Standby, הוא פין לכיבוי זמני של כל פעולות הבקר, והקו מעליו אומר שהוא פועל "הפוך" – דווקא כשהוא מקבל 0, אז בקר המנוע נכנס למצב כבוי. זאת אומרת שכשהרובוט צריך לנסוע, נרצה שהפין הזה יקבל מתח מהארדואינו.
שאר הפינים שייכים לשני המנועים, שמסומנים באותיות A ו-B. עבור כל מנוע יש בבקר שני פינים של פלט (O1 ו-O2) שמתחברים לשני החוטים של המנוע, שני פינים של קלט (IN1 ו-IN2) שמתחברים לארדואינו ובעזרתם מגדירים את כיוון הסיבוב, ופין PWM שהוא הסיגנל לסיבוב עצמו. את פין PWM אפשר ורצוי לחבר לפין פלט אנלוגי של הארדואינו, וכך לשלוט במהירות הסיבוב של כל גלגל.
כדי לקבוע את כיוון הסיבוב של גלגל (עם או נגד כיוון השעון) מגדירים את IN1 או את IN2 כ-HIGH, ואת השני כ-LOW. אם הסיבוב יוצא הפוך ממה שהתכוונו, אפשר פשוט להחליף בין שני החוטים שיוצאים מהארדואינו.
לסיום, הנה קוד לבדיקה ראשונית של בקר המנוע. זהו קוד שעבר מספר שינויים, אז החיווט וסדר הפעולות אינם זהים לאלה שבסרטון למעלה:
// 4Probot Project by Ido Gendel, 2013 // Part 1: Basic motor controller demo // Share and Enjoy! #define MOTOR_STANDBY_PIN 13 // Motor pin definitions struct tMotorPins { char PWM_PIN, I1_PIN, I2_PIN; } motor [2] = {{5, 2, 3}, {6, 4, 7}}; //--------------------------------------------------- // Set direction/speed for a single motor void setMotorState(const char m, const int spd) { analogWrite(motor[m].PWM_PIN, abs(spd)); digitalWrite(motor[m].I1_PIN, spd > 0); digitalWrite(motor[m].I2_PIN, spd < 0); } // setMotorState //--------------------------------------------------- // Set direction/speed for both motors void setMotorsState(const int spd1, const int spd2) { setMotorState(0, spd1); setMotorState(1, spd2); } // set MotorsState //--------------------------------------------------- void setup() { pinMode(MOTOR_STANDBY_PIN, OUTPUT); digitalWrite(MOTOR_STANDBY_PIN, LOW); // Motors in standby setMotorsState(0, 0); } // setup //--------------------------------------------------- void loop() { digitalWrite(MOTOR_STANDBY_PIN, LOW); // Motors in Standby delay(1000); digitalWrite(MOTOR_STANDBY_PIN, HIGH); // Motors active setMotorsState(150, 150); delay(1000); setMotorsState(-150, -150); delay(1000); setMotorsState(-150, 150); delay(1000); setMotorsState(150, -150); delay(1000); setMotorsState(0, -150); delay(1000); setMotorsState(0, 150); delay(1000); setMotorsState( 150, 0); delay(1000); setMotorsState(-150, 0); delay(1000); } // loop
תודה לאתר 4Project על הרכיבים והייעוץ, ולהתראות בפעם הבאה, בה נדבר על מהירויות סיבוב, נסיעה ישר ופניה.
לאן חיברת את הפינים של הקלט בארדואינו?
כמעט כל הפינים של הארדואינו יכולים לשמש לקלט… למי בדיוק התכוונת?
תודה על הפוסט. נשמע מעניין ויחסית פשוט עבור מתחילים (כמוני).
אפשר בבקשה לינק לפלטפורמה והסבר קצר מה הפלטפורמה כוללת (מנועים?)
תודה רבה
הנה המקום הכי זול שאני מכיר, יש שם גם תמונות של מה בדיוק מקבלים (בסט שלי מאיביי לא היו למנועים חוטים בכלל):
http://www.buyincoins.com/item/34695.html
ואם תכניס את המייל info שטרודל idogendel.com בתור recommender בזמן הקניה, אתה ואני נקבל 5% בונוס 🙂
אבל שוב, אם אתה לא מנוסה בהרכבה של דברים, קריאת שרטוטים וכו', סט כזה יכול להיות די מתסכל, ומוטב להשקיע עוד כסף ולקבל משהו רציני – למשל הפלטפורמות של Sparkfun.com.