מדור פרסומי: 4Probot – פרק ראשון

ברוכים הבאים לסדרת פוסטים חדשה: 4Probot, רובוט מבוסס ארדואינו שהוא ניסוי מתגלגל – תרתי משמע! המטרה כאן אינה להציג בניה של רובוט לפי תוכנית קבועה מראש, אלא לחקור ולהתנסות בטכניקות ובטכנולוגיות שונות שקשורות לעולם הרובוטים (ובמיוחד אלה הקטנים שנוסעים עצמאית על רצפת הבית…)

נסיעת המבחן הראשונה של 4Probot: בדיקת בקר המנועים

גילוי נאות: סדרת הפוסטים 4Probot הינה שיתוף פעולה עם אתר 4project.co.il – חנות אינטרנטית ישראלית לרכיבים, חלקים ומוצרים לתחומי המייקינג השונים. חלק מרכיבי הרובוט ניתנים לי על ידי אתר 4Project תמורת סקירה הוגנת וקישורים בבלוג, ובזה מסתכמת ההתקשרות המסחרית ביני לבין האתר.

פלטפורמה

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

הפלטפורמה המורכבת, עם ארדואינו, מגן prototyping ובקר מנוע
הפלטפורמה המורכבת, עם ארדואינו, מגן prototyping ובקר מנוע

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

בקר מנוע

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

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

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

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

מה שבחרתי בסופו של דבר הוא בקר מנוע לשני מנועי DC בזרם של עד 1A של חברת Pololu. הוא מבוסס על הרכיב TB6612FNG של טושיבה, זול, קומפקטי להפליא (אפשר להסתיר אותו כמעט לגמרי עם מטבע של עשר אגורות) ועם חורים לפינים בריווח סטנדרטי של 2.54 מ"מ.

בקר המנוע כפי שהגיע בחבילה מ-4Project
בקר המנוע כפי שהגיע בחבילה מ-4Project ("מחבר שורה" כלול)

החיסרון של כל בקרי המנוע כמעט הוא עניין החום: כשהעומס החשמלי גדול, הם מגיעים בקלות לטמפרטורות די פרועות, עד כדי סכנה לאצבעות של המשתמש או למערכת. במקרה שלי לא צפוי עומס רב, אך ליתר ביטחון הזמנתי עוד שני חלקים: גוף קירור קטן ושחור מאלומיניום, בגודל 9x8x5 מ"מ (מכסה שטח קצת יותר גדול מהשבב בתמונה למעלה), וסרט דו-צדדי להדבקת גופי קירור.

הסרט הזה הוא פטנט שלא הייתי מודע לקיומו קודם לכן, והוא חוסך הרבה התעסקות עם משחות טרמיות וחיזוקים למיניהם. היריעה המלאה היא מדבקה דו-צדדית בגודל 5×5 ס"מ, והיא מכוסה בשקפים משני הצדדים. קל מאד לגזור חלקים בגודל הרצוי, אם כי הקילוף של השקפים מצריך אצבעות קצת יותר עדינות משלי. החיבור שהמדבקה יוצרת בין השבב לגוף הקירור לא חזק מאד מבחינה מכאנית והוא עלול להתנתק במשיכה או במכה חזקה, אבל בשביל ניסויים ו-prototyping זה נוח ופשוט הרבה יותר מהחלופות. הנה התוצאה הסופית (הכחול למטה הוא אחד השקפים שקולפו מסרט ההדבקה):

Controller_Done
בקר המנוע עם גוף קירור מודבק ופינים מולחמים

החיווט

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

מיפוי הפינים של בקר המנוע
מיפוי הפינים של בקר המנוע (באדיבות אתר 4Project)

השמות האלה די מבלבלים, אז בואו נעבור עליהם בקצרה:

כל ה-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 על הרכיבים והייעוץ, ולהתראות בפעם הבאה, בה נדבר על מהירויות סיבוב, נסיעה ישר ופניה.

להרשמה
הודע לי על
4 Comments
מהכי חדשה
מהכי ישנה לפי הצבעות
Inline Feedbacks
הראה את כל התגובות

לאן חיברת את הפינים של הקלט בארדואינו?

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

תודה רבה