โปรเจค หุ่นยนต์หลบสิ่งกีดขวาง 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 ตามรูป
ประกอบ Motor Drive Module L298N

ใช้ สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม. ยึด Motor Drive Module L298N
เชื่อมต่อ สาย Jumper Male to Male (ผู้-ผู้) ยาว 20cm. สีแดง เข้าที่
เพาเวอร์สวิตซ์สำหรับเปิดปิด (ON / OFF ) อีกด้านที่เหลือ
เพาเวอร์สวิตซ์สำหรับเปิดปิด (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 L298N กับ Nano Shield for NANO 3.0
IN1 <-> 10
IN2 <-> 11
IN3 <-> 6
IN4 <-> 5
หลังจากนั้นให้ทดสอบเบื้องต้น ว่าการหมุนของล้อถูกต้องหรือไม่ โดย
เปิดโปรแกรม 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

*** ถ้ามีปัญหาในการอัพโหลด ***
การใช้ Arduino IDE เวอร์ชั่นที่ใหม่กว่า ถ้ามีปัญหาในการอัพโหลด ให้ไปที่ Processor แล้วเปลี่ยนไปเลือกเป็น ATmega328P (Old Bootloader)
ใส่ แบตเตอรี่ลิเธียม 18650 จำนวน 2 ก้อน ไปที่ รางถ่าน และ ตรวจสอบขั้วของแบตเตอรี่ ใส่ถุกต้องหรือไม่
//Motor A
เปิดโปรแกรม 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 IDE เวอร์ชั่นที่ใหม่กว่า ถ้ามีปัญหาในการอัพโหลด ให้ไปที่ Processor แล้วเปลี่ยนไปเลือกเป็น ATmega328P (Old Bootloader)
ใส่ แบตเตอรี่ลิเธียม 18650 จำนวน 2 ก้อน ไปที่ รางถ่าน และ ตรวจสอบขั้วของแบตเตอรี่ ใส่ถุกต้องหรือไม่
โค้ดนี้จะทำงานเพียง 1 ครั้ง ถ้าต้องการทดลองใหม่ให้ถอด แบตเตอรี่ออก (หรือ ปิดเปิด สวิทช์ไฟใหม่) แล้วใส่เข้าไปใหม่ เมื่อล้อหมุน ตรวจสอบการหมุน ขอล้อต่างๆถูกต้องหรือไม่ ถ้าต่อวงจรถูกต้อง ล้อ ทั้งสองข้างจะหมุนไปข้างหน้า 1ครั้ง กลับหลัง 1 ครั้ง และ หมุนล้อเดียวข้างละหนึ่งครั้งแล้วจึงหยุด ถ้าไม่ถูกต้องให้แก้ไข เช่นการต่อขั้วของมอเตอร์ผิด เป็นต้น
ถ้าทุกอย่างถูกต้อง ทดลอง ยกลงวางที่พื้นแล้วทดสอบ อีกครั้ง ถอด แบตเตอรี่ออก (หรือ ปิดเปิด สวิทช์ไฟใหม่) แล้วใส่เข้าไปใหม่ ถ้าทุกอย่างถูกต้อง รถจะเคลื่อนที่ไปข้างหน้า-ถอยหลัง แล้ว เลี้ยวซ้าย แล้ว จึง เลี้ยวขวา
วีดีโอผลลัพธ์ ทดสอบการต่อขั้วมอเตอร์และ การหมุนของล้อ
ยึด Mounting Bracket for Servo SG90
ยึด เซอร์โว MG90S
เชื่อมต่อ เซอร์โว MG90S ที่ ขา D 9 , V และ G
Servo myservo; //ประกาศตัวแปร myservo เรียกใช้งานคำสั่งจาก Library
void loop()
ยึดชิ้นส่วน ของ เซอร์โว 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) ของเรา ตามรูป


เปิดโปรแกรม Arduino (IDE) และ Upload โค้ด หุ่นยนต์หลบสิ่งกีดขวาง Arduino Nano ไปยัง บอร์ด Arduino Nano
ถ้าทุกอย่างถูกต้อง ทดลอง ยกลงวางที่พื้นแล้วทดสอบ อีกครั้ง ถอด แบตเตอรี่ออก (หรือ ปิดเปิด สวิทช์ไฟใหม่) แล้วใส่เข้าไปใหม่ ถ้าทุกอย่างถูกต้อง รถจะเคลื่อนที่ไปข้างหน้า-ถอยหลัง แล้ว เลี้ยวซ้าย แล้ว จึง เลี้ยวขวา
วีดีโอผลลัพธ์ ทดสอบการต่อขั้วมอเตอร์และ การหมุนของล้อ
ยึด Mounting Bracket for Servo SG90
ยึด เซอร์โว MG90S
เชื่อมต่อ เซอร์โว MG90S ที่ ขา D 9 , V และ G
ตั้งค่าองศาของเซอร์โวร์มอเตอร์ ให้เท่ากับ 90 องศา
โดยเปิดโปรแกรม Arduino (IDE) และ Upload โค้ดนี้ ไปยัง บอร์ด Arduino Nano
โดยเปิดโปรแกรม 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);
}

ยึด Mounting Bracket for 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

ภาพรวม หุ่นยนต์หลบสิ่งกีดขวาง 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