מדריך ערכת רובוטיקה בסיסית

 

זוהי ערכה רובוטית של רכב עם 3 גלגלים שמיועדת להתנסות ראשונית עם רובוטיקה.

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

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

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

 

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

 

עכשיו מחזקים את הסרוו עם הכנפיים השחורות שמחזיקות את החיישן האולטראסוני:

 

 

חיבורים:

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

הארדואינו מגיע עם שתי שורות חיבורי זכר – בצד ימין חיבורי 3,5,6,9,10,11 שהם חיבורי PWM, ובצד שמאל חיבורים אנלוגיים – A0,A1,A2,A3,A4,A5 . לצד אלה יש גם חיבורי 5V ו-GND שאפשר להשתמש בהם.

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

את בקר L298 נחבר בצורה הבאה לארדואינו:

  • 5V בבקר > אל 5V בארדואינו(אחד החיבורים האדומים בשורות)
  • GND בבקר > אל GND בארדואינו (אחד החיבורים השחורים בשורות)
  • ENB בבקר > פין 10 בארדואינו
  • IN1 בבקר > A0 בארדואינו (הרחוק ביותר מקצה הלוח בשורה הכחולה)
  • IN2 בבקר > A1 בארדואינו (אחד אחריו)
  • IN3 בבקר > A2 בארדואינו (אחד אחריו)
  • IN4 בבקר > A3 בארדואינו (אחד אחריו)
  • ENA בבקר > פין 11 בארדואינו

אנחנו משתמשים בפינים אנלוגיים כפינים דיגיטליים כדי לשמר פינים לחיישן אולטרהסוני.

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

 

מה שקורה פה זה שמחברים את מקור המתח, הבטריה,  אל בקר המנוע L298 והוא מספק מתח לארדואינו דרך 5V.

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

נסיעת מבחן:

 

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

הלוח הזה הוא הכלאה של ארדואינו אונו וארדואינו נאנו. הבקר הוא ATMEGA328P והממיר FT232RL. הדרייבר שלו אמור להגיע עם סביבת הפיתוח של ארדואינו, אמנם כדי להעלות קוד נצטרך לבחור בארדואינו נאנו מעבד 328P ו-BOOTLOADER ישן.

עכשיו הקוד אמור לעלות.

// digital pins to control forward and backward
const int IN1 = A0;
const int IN2 = A1;
const int IN3 = A2;
const int IN4 = A3;
// pwm pins to control speed
const int ENA = 11;
const int ENB = 10;

void setup() {
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);

}

void loop() {
  // set speed
  analogWrite(ENA, 150);
  analogWrite(ENB, 150);
  // move one wheel forward
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  // move second wheel forward
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);

  delay(3000);
  // set speed to stop
  analogWrite(ENA, 0);
  analogWrite(ENB, 0);
  delay(3000);
  // set speed slow
  analogWrite(ENA, 100);
  analogWrite(ENB, 100);
  // move wheel backward
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  // move other wheel backward
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delay(3000);
}

ככה אנחנו שולטים בכיוון של הנסיעה ובמהירות.

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

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

 

חיבור סרוו וחיישן אולטראסוני:

את החיישן נחבר בצורה הבאה-

פין 6 בארדואינו – TRIG בחיישן

פין 5 בארדואינו – ECHO בחיישן

5V בארדואינו – 5V בחיישן

GND בארדואינו – GND בחיישן

 

את הסרוו נחבר אל פין 9 בארדואינו ולפלוס ומינוס.

 

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

בהינתן מספיק זמן האוטו ימצא את היציאה.

#include <Servo.h>
Servo myservo;
int pos = 0;
int duration;
int distance;

// digital pins to control forward and backward
const int IN1 = A0;
const int IN2 = A1;
const int IN3 = A2;
const int IN4 = A3;
// pwm pins to control speed
const int ENA = 11;
const int ENB = 3;

const int TRIG = 6;
const int ECHO = 5;

void setup() {
  myservo.attach(9); 
  // set pins as output and input
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(ECHO, INPUT);
  pinMode(TRIG, OUTPUT);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);

  // start moving forward
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENA, 150);
  analogWrite(ENB, 150);
}

void loop() {
  for (pos = 60; pos <= 120; pos += 5) { // move servo in one side
    myservo.write(pos); 
    delay(20);
    // measure distance
    digitalWrite(TRIG, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG, LOW);
    duration = pulseIn(ECHO, HIGH);
    distance = duration * 0.01715; 

    if(distance < 30){ // if detect object
      // stop
      analogWrite(ENA, 0);
      analogWrite(ENB, 0);
      delay(500);
      //drive reverse
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);

      analogWrite(ENA, 0);
      analogWrite(ENB, 120);
      delay(500);
      // move forward
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);

      analogWrite(ENA, 150);
      analogWrite(ENB, 150);

     }
  }

  for (pos = 120; pos >= 60; pos -= 5) { // move servo in other side
    myservo.write(pos); 
    delay(20);

    digitalWrite(TRIG, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG, LOW);
    duration = pulseIn(ECHO, HIGH);
    distance = duration * 0.01715;

    if(distance < 30){
      analogWrite(ENA, 0);
      analogWrite(ENB, 0);
      delay(500);

      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);

      analogWrite(ENA, 120);
      analogWrite(ENB, 0);
      delay(500);
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);

      analogWrite(ENA, 150);
      analogWrite(ENB, 150); 
     }
  } 
}

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

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

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

#include <Servo.h>
Servo myservo;
int pos = 0;
int duration;
int distance;

// digital pins to control forward and backward
const int IN1 = A0;
const int IN2 = A1;
const int IN3 = A2;
const int IN4 = A3;
// pwm pins to control speed
const int ENA = 11;
const int ENB = 3;

const int TRIG = 6;
const int ECHO = 5;

void setup() {
  Serial.begin(9600);
  myservo.attach(9);
  // set pins as output and input
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(ECHO, INPUT);
  pinMode(TRIG, OUTPUT);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);

  // start moving forward
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  // turn servo to the wall
  myservo.write(180);
}

void loop() {
  analogWrite(ENA, 110);
  analogWrite(ENB, 110);

  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  duration = pulseIn(ECHO, HIGH);
  distance = duration * 0.01715;

  if(distance < 10){
    analogWrite(ENA, 50);
    analogWrite(ENB, 110);
    delay(300);
  }
  else{

  analogWrite(ENA, 110);
  analogWrite(ENB, 50);
  delay(300);

}

}

מפנים את החיישן לכיוון הקיר, נותנים לו רף של 10 ס"מ ואז מתקנים לפי הצורך.

הערות, דגשים ובעיות:

  • יש אפשרות להשתמש במחזיק 6 סוללות AA , במחזיק סוללת 9 וולט או בשניהם. הסוללות צריכות להיות אלקליין כדי להפעיל מנועים, עדיף דורסל/אנרג'ייזר חדשות. יש פה 3 מנועים, ארדואינו וחיישן וגם דוחף המנוע מפיל מתח.
  • אם משתמשים במחזיק 9 וולט אז יש לחתוך ולגלף את החוטים, להכניס את פלוס אל VMS ו-GND ל-GND בבקר המנוע
  •   יש חלק שחור אחד ספייר שמיועד להרכבת עוד סרוו בציר נוסף, יש גם הרבה ברגים ספייר לא לחפש לאן הם אמורים ללכת.
  • בהנחה שיש לכם חוטי זכר/זכר וזכר/נקבה אפשר לעבוד על המטריצה
  • יש אפשרות לרכוש שלט רחוק או בלוטוס להפעלת האוטו מרחוק כי לבנות רכב אוטונומי בתור פרויקט ראשון זה מאתגר מאוד
  • הערכה מיועדת לאנשים שיש להם כבר נסיון עם ארדואינו
  • אם האוטו לא נוסע ישר אפשר לתקן על ידי שינוי מהירות באחד המנועים. בכל אופן אל תצפו לאוטו שנוסע ישר כמו פלס אין דבר כזה בלי בקרת חוג סגור.
  • שמתי לב שכשהסרוו עובד הוא יכול להפריע לפין 10 אז אפשר להעביר את ENB לפין 3.
  • אם אתם מסתבכים עם הרובוט והפרויקט נראה גדול תפעילו כל חלק בהתחלה בנפרד.
  • כל קטעי הקוד פה הם להדגמה ובטוח תצטרכו לשנות חלק מהמספרים כי התנאים אצלכם שונים (בטריה שונה, רצפה עקומה או חיבורים אחרים)