โปรเจค หุ่นยนต์หลบสิ่งกีดขวาง Arduino Nano





โปรเจค หุ่นยนต์หลบสิ่งกีดขวาง Arduino Nano  อุปกรณ์ที่ต้องใช้ก็คือ

      1. 2WD Smart Car Robot Chassis Kits

      2.  Arduino Nano 3.0

      3. Nano Shield for NANO 3.0

      4. Motor Drive Module L298N

     5. สาย Jumper Female to Male ยาว 20cm.

     6. สาย Jumper Female to  Female  ยาว 20cm.
 
     7. สาย Jumper Male to  Male  ยาว 20 cm.

     8. รางถ่านแบบ 18650 ใส่ถ่าน 2 ก้อน

     9. แบตเตอรี่ลิเธียม 18650 จำนวน 2 ก้อน

     10. สกรูหัวกลม+น็อตตัวเมีย ขนาด 3มม ยาว 12 มม.

     11. Ultrasonic Sensor HC-SR04

     12. Mounting Bracket for HC-SR04 แบบสั้น

     13. เซอร์โว MG90S เฟืองโลหะ

     14. Mounting Bracket for Servo SG90


 เรียนรู้ การใช้งาน Arduino Nano 3.0 และ การติดตั้งไดรเวอร์

https://robotsiam.blogspot.com/2016/11/arduino-nano-30.html



เริ่มต้นด้วยการ ประกอบ 2WD Smart Car Robot Chassis Kits



ภาพรวม การประกอบ รางถ่านแบบ 18650 และ เชื่อมต่อ Motor Drive Module L298N  เข้ากับ Nano Shield for NANO 3.0  ตามรูป



เริ่มด้วย ใช้ สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม. ยึด รางถ่านแบบ 18650 และ เชื่อมต่อ สายสีแดง ขั้วบวก เข้าที่ เพาเวอร์สวิตซ์สำหรับเปิดปิด (ON / OFF )


ประกอบ Motor Drive Module L298N



ใช้ สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม. ยึด Motor Drive Module L298N


 เชื่อมต่อ สาย Jumper Male to Male (ผู้-ผู้) ยาว 20cm. สีแดง เข้าที่
 เพาเวอร์สวิตซ์สำหรับเปิดปิด (ON / OFF ) อีกด้านที่เหลือ



 เชื่อมต่อ สาย Jumper Male to Male (ผู้-ผู้) ยาว 20cm. สีดำ เข้ากับสายไฟสีดำ ขั้วลบ จากรางถ่าน และ อีกด้าน เข้ากับ กราวด์ GND ของ Motor Drive Module L298N


 เชื่อมต่อ สาย Jumper Male to Male (ผู้-ผู้) ยาว 20cm. จากจุดต่อ มอเตอร์ ของ Motor Drive Module L298N เข้า กับ ขั้วของ มอเตอร์ ทั้ง 2 ตัว จากตัวอย่าง คือ คือสีเหลืองกับสีส้ม และ สีเขียวกับสีน้ำเงิน



ใช้ สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม. ยึด Nano Shield for NANO 3.0


ประกอบ บอร์ด Arduino Nano 3.0 เข้ากับ Nano Shield for NANO 3.0




ใช้ สาย Jumper Female to  Male (เมีย-ผู้)  ยาว 20cm. เชื่อมต่อ ระหว่าง Motor Drive Module L298N กับ Nano Shield for NANO 3.0



ตัวอย่าง ใช้สายสีเทาเข้ากับ กราวด์ GND ของ Motor Drive Module L298N และ สายสีขาว เข้ากับ 5V ของ Motor Drive Module L298N




และสายสีเทาเข้ากับ กราวด์ GND คือ G ของ Nano Shield for NANO 3.0 และ สายสีขาว เข้ากับ VCC คือ V ของ Nano Shield for NANO 3.0



ภาพ การใช้งาน ขาต่างๆ ของ บอร์ด Arduino Nano 3.0 


ใช้สาย Jumper Female to  Female  (เมีย-เมีย) ยาว 20cm. เชื่อมต่อระหว่าง Motor Drive Module L298N  กับ Nano Shield for NANO 3.0



จาก Motor Drive Module L298N ขา IN1 , IN2 , IN3 , IN4 ตามรูป

หมายเหตุ :  Jumper ที่ขา ENA และ ENB ของ บอร์ด L298N  ไม่ต้องถอดออก


ไปยัง ขาดิจิตอล  Nano Shield for NANO 3.0  ที่ 11 , 10 , 5 , 4 ตามรูป



หลังจากนั้นให้ทดสอบเบื้องต้น ว่าการหมุนของล้อถูกต้องหรือไม่ โดย

เปิดโปรแกรม Arduino (IDE) และ Upload โค้ดนี้ ไปยัง บอร์ด Arduino Nano




//Motor A
const int motorPin1  = 11;
const int motorPin2  = 10;
//Motor B
const int motorPin3  = 6;
const int motorPin4  = 5;

//This lets you run the loop a single time for testing
boolean run = true;

void setup() {


}

void loop() {

  if (run) {
 
    delay(2000);
    moveForward();
    delay(500);
    moveBackward();
    delay(500);
    turnLeft();
    delay(500);
    turnRight();
    delay(500);
    moveStop();


    //This stops the loop
    run = false;
  }
}


void moveStop() {
  analogWrite(motorPin1, 0);
  analogWrite(motorPin2, 0);
  analogWrite(motorPin3, 0);
  analogWrite(motorPin4, 0);
}

void moveForward() {


  analogWrite(motorPin1, 180);
  analogWrite(motorPin2, 0);
  analogWrite(motorPin3, 180);
  analogWrite(motorPin4, 0);

}

void moveBackward() {

  analogWrite(motorPin1, 0);
  analogWrite(motorPin2, 180);
  analogWrite(motorPin3, 0);
  analogWrite(motorPin4, 180);

}

void turnRight() {
  analogWrite(motorPin1, 180);
  analogWrite(motorPin2, 0);
  analogWrite(motorPin3, 0);
  analogWrite(motorPin4, 180);
  delay(300);
  moveForward();

}
void turnLeft() {
  analogWrite(motorPin1, 0);
  analogWrite(motorPin2, 180);
  analogWrite(motorPin3, 180);
  analogWrite(motorPin4, 0);
  delay(300);
  moveForward();
}


เชื่อต่อ สาย USB ระหวาง PC กับ บอร์ด Arduino Nano


เลือก บอร์ด Arduino Nano




ใส่ แบตเตอรี่ลิเธียม 18650 จำนวน 2 ก้อน ไปที่ รางถ่าน และ ตรวจสอบขั้วของแบตเตอรี่ ใส่ถุกต้องหรือไม่


โค้ดนี้จะทำงานเพียง 1 ครั้ง ถ้าต้องการทดลองใหม่ให้ถอด แบตเตอรี่ออก (หรือ ปิดเปิด สวิทช์ไฟใหม่) แล้วใส่เข้าไปใหม่ เมื่อล้อหมุน ตรวจสอบการหมุน ขอล้อต่างๆถูกต้องหรือไม่ ถ้าต่อวงจรถูกต้อง ล้อ ทั้งสองข้างจะหมุนไปข้างหน้า 1ครั้ง กลับหลัง 1 ครั้ง และ หมุนล้อเดียวข้างละหนึ่งครั้งแล้วจึงหยุด ถ้าไม่ถูกต้องให้แก้ไข เช่นการต่อขั้วของมอเตอร์ผิด เป็นต้น

ถ้าทุกอย่างถูกต้อง ทดลอง ยกลงวางที่พื้นแล้วทดสอบ อีกครั้ง ถอด แบตเตอรี่ออก (หรือ ปิดเปิด สวิทช์ไฟใหม่) แล้วใส่เข้าไปใหม่ ถ้าทุกอย่างถูกต้อง รถจะเคลื่อนที่ไปข้างหน้า-ถอยหลัง แล้ว เลี้ยวซ้าย แล้ว จึง เลี้ยวขวา


วีดีโอผลลัพธ์  ทดสอบการต่อขั้วมอเตอร์และ การหมุนของล้อ



ยึด  Mounting Bracket for Servo SG90



ยึด เซอร์โว MG90S


เชื่อมต่อ เซอร์โว MG90S ที่ ขา D 9 , V และ G




ตั้งค่าองศาของเซอร์โวร์มอเตอร์ ให้เท่ากับ 90 องศา

โดยเปิดโปรแกรม Arduino (IDE) และ Upload โค้ดนี้ ไปยัง บอร์ด Arduino Nano


#include <Servo.h>

Servo myservo;  //ประกาศตัวแปร 
myservo เรียกใช้งานคำสั่งจาก Library
 
void setup()
 
{
 
  myservo.attach(9); //ให้ Digital Pin 9 เป็นขาของ Servo
 
}

void loop()
{


  myservo.write(90);  //หมุน 90 องศา
  delay(1000);


}




ยึดชิ้นส่วน ของ  เซอร์โว MG90S



ยึด Mounting Bracket for HC-SR04 แบบสั้น



เชื่อมต่อ Ultrasonic Sensor HC-SR04



ใช้สาย Jumper Female to  Female  ยาว 20cm. เชื่อมต่อระหว่าง Ultrasonic Sensor HC-SR04 กับ Nano Shield for NANO 3.0

HC-SR04 <-> Nano Shield

TRIG   <-> A4
ECHO <-> A5
Vcc <-> V
Gnd <-> G



ใส่ถ่าน 18650 จำนวน 2 ก้อน



ภาพรวม หุ่นยนต์หลบสิ่งกีดขวาง Arduino Nano





การเพิ่มไลบรารี่ NewPing


ไลบรารี่ NewPing คือ ไลบรารี่ ฟังก์ชัน ที่มีผู้พัฒนาเตรียมพร้อมไว้ให้เราแล้ว โดยให้ไปดาวน์โหลด ไลบรารี่ NewPing ได้ที่

  https://bitbucket.org/teckel12/arduino-new-ping/downloads

จากนั้นให้ทำการเพิ่ม ไลบรารี่ NewPing ให้กับ Arduino (IDE) ของเรา ตามรูป



เลือกไฟล์ ไลบรารี่ NewPing  .ZIP ที่เรา ดาวน์โหลดมาอยู่ในคอมพิวเตอร์ของเรา จากนั้นคลิก Open โปรแกรม จะเพิ่ม ไลบรารี่ NewPing เข้าสู่ Arduino (IDE) ของเรา



เมื่อเข้าดูที่ Include Library จะพบ ไลบรารี่ NewPing เพิ่มเข้ามาด้านล่างสุด
(สามารถใช้วิธีการเดียวกันนี้ ในการ การเพิ่ม ไลบรารี่ ฟังก์ชัน อื่นๆ ได้เช่นกัน )



เปิดโปรแกรม Arduino (IDE) และ Upload โค้ด หุ่นยนต์หลบสิ่งกีดขวาง Arduino Nano ไปยัง บอร์ด Arduino Nano





  // Arduino Obstacle Avoiding Robot              
 // Code adapted from http://www.educ8s.tv                                         
 // First Include the NewPing and Servo Libraries 


#include <NewPing.h>
#include <Servo.h> 

#define TRIG_PIN A4 
#define ECHO_PIN A5 
#define MAX_DISTANCE 200 
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); 
Servo myservo;   

boolean goesForward=false;
int distance = 100;
int speedSet = 0;

//Motor A
const int motorPin1  = 11;  
const int motorPin2  = 10;  
//Motor B
const int motorPin3  = 6; 
const int motorPin4  = 5;  

void setup() {

  myservo.attach(9);  
  myservo.write(115); 
  delay(2000);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
}

void loop() {
 int distanceR = 0;
 int distanceL =  0;
 delay(40);
 if(distance<=20)
 {
  moveStop();
  delay(100);
  moveBackward();
  delay(300);
  moveStop();
  delay(200);
  distanceR = lookRight();
  delay(200);
  distanceL = lookLeft();
  delay(200);

  if(distanceR>=distanceL)
  {
    turnRight();
    moveStop();
  }else
  {
    turnLeft();
    moveStop();
  }
 }else
 {
  moveForward();
 }
 distance = readPing();
}

int lookRight()
{
    myservo.write(50); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(115); 
    return distance;
}

int lookLeft()
{
    myservo.write(170); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(115); 
    return distance;
    delay(100);
}

int readPing() { 
  delay(70);
  int cm = sonar.ping_cm();
  if(cm==0)
  {
    cm = 250;
  }
  return cm;
}

void moveStop() {
  analogWrite(motorPin1, 0);
    analogWrite(motorPin2, 0);
    analogWrite(motorPin3, 0);
    analogWrite(motorPin4, 0);
  } 
  
void moveForward() {


    analogWrite(motorPin1, 180);
    analogWrite(motorPin2, 0);
    analogWrite(motorPin3, 180);
    analogWrite(motorPin4, 0);  
  
}

void moveBackward() {
    
    analogWrite(motorPin1, 0);
    analogWrite(motorPin2, 180);
    analogWrite(motorPin3, 0);
    analogWrite(motorPin4, 180);   
  
}  

void turnRight() {
 analogWrite(motorPin1, 180);
    analogWrite(motorPin2, 0);
  analogWrite(motorPin3, 0);
    analogWrite(motorPin4, 180);    
  delay(300);
 moveForward();      
  
void turnLeft() {
  analogWrite(motorPin1, 0);
    analogWrite(motorPin2, 180);   
 analogWrite(motorPin3, 180);
    analogWrite(motorPin4, 0);     
  delay(300);
   moveForward();
}



วีดีโอผลลัพธ์ โปรเจค หุ่นยนต์หลบสิ่งกีดขวาง Arduino Nano