ส่งงานไมโครคอรโทรเลอร์ 14

หุ่นยนต์เดินตามเส้น งานที่4

Code โปรเจค หุ่นยนต์เดินตามเส้น 3 เซ็นเซอร์ Arduino + L298P
          โปรเจค นี้จะเป็นการนำ Arduino UNO R3 + L298P Motor Shield และ เซ็นเซอร์ 3 Road Tracing Sensor Robot มาทำเป็น หุ่นยนต์เดินตามเส้น 3 เซ็นเซอร์  โดยให้หุ่นยนต์ตัดสินใจ เดินตามเส้น โดยอัตโนมัติ ด้วยการตรวจจับ เส้นสีดํา พื้นสีขาว
อุปกรณ์ที่ใช้
1. 2WD Smart Car Robot Chassis Kits
2. Arduino UNO R3 - Made in italy
3. L298P Motor Shield Board
4. Jumper (M2M) cable 20cm Male to Male
5. Jumper (F2M) cable 30cm Female to Female
6. สกรูหัวกลม+น็อตตัวเมีย ยาว 12 มม.
7. รางถ่าน 18650 แบบ 2 ก้อน
8. ถ่านชาร์จ 18650 Panasonic NCR18650B 3.7v  จำนวน 2 ก้อน
9. 3 Road Tracing Sensor Robot
10. เสารองแผ่นพีซีบีแบบโลหะ ยาว 25 มม.
ขั้นตอนการทำ
1. ประกอบหุ่นยนต์
         เริ่มต้นด้วยการ ประกอบ หุ่นยนต์ Arduino UNO + L298P และ ทดสอบการเคลื่อนที่ของหุ่นยนต์ ตามบทความด้านล่าง
Code โปรเจค หุ่นยนต์เดินตามเส้น 3 เซ็นเซอร์ Arduino + L298P
2. ประกอบ เซ็นเซอร์ 3 Road Tracing Sensor Robot
         ใช้ จั้มเปอร์ เมีย-เมีย 30cm เชื่อมต่อ เซ็นเซอร์  เข้ากับ L298P
เซ็นเซอร์ <-> L298P
VCC  <-> +5     L <-> A1     C <-> A2
R <-> A3
GND <-> GND
เชื่อมต่อสายที่ A1 ถึง A3
        จากนั้นใช้สาย USB เชื่อมต่อระหว่าง คอมพิวเตอร์ กับ Arduino UNO R3
         เปิดโปรแกรม Arduino (IDE) และ Upload โค้ดนี้ ไปยัง บอร์ด Arduino UNO R3
/*
read analog data from A1-A3 and send to PC via Serial port
*/
int sensor_L , sensor_C , sensor_R ; //optical sensor values
String tmp ;
int ADC_stabilize = 5 ;
void setup ( ) {
  // initialize the serial communication:
  Serial . begin ( 9600 ) ;
}
void loop ( ) {
  //take a snapshot
  sensor_L = digitalRead ( A1 ) ;
  delay ( ADC_stabilize ) ; //stabilize
  sensor_L = digitalRead ( A1 ) ;
  delay ( ADC_stabilize ) ;
  sensor_C = digitalRead ( A2 ) ;
  delay ( ADC_stabilize ) ;
  sensor_C = digitalRead ( A2 ) ;
  delay ( ADC_stabilize ) ;
  sensor_R = digitalRead ( A3 ) ;
  delay ( ADC_stabilize ) ;
  sensor_R = digitalRead ( A3 ) ;
  delay ( ADC_stabilize ) ;
  tmp = "L=" + String ( sensor_L ) + " C=" + String ( sensor_C ) + " R=" + String ( sensor_R ) ;
  // send the value of analog inputs:
  Serial . println ( tmp ) ;
  // wait a bit for next reading
  delay ( 1000 ) ; //1000=1 sec
}
        นำเทปพันสายไฟสีดำ แปะที่พื้นสีขาว ให้ เซ็นเซอร์ ทั้ง 3 ตัว ของหุ่นยนต์อยู่บริเวณ พื้นสีขาว
ให้ ไฟ LED สีแดงทั้ง 3 ตัว ติด
แล้วไปที่ Tools -> Serial Monitor
เลือก Both NL & CR และ เลือก 9600 baud
Serial Monitor จะแสดง L=0 C=0 R=0
         และเมื่อ เซ็นเซอร์ซ้ายของหุ่นยนต์  อยู่บริเวณเทปสีดำ และ เซ็นเซอร์ขวา และ  เซ็นเซอร์กลาง อยู่บริเวณพื้นสีขาว ไฟ LED สีแดง ของ เซ็นเซอร์ซ้าย จะดับ และ Serial Monitor จะแสดง L=1 C=0 R=0
และเมื่อ เซ็นเซอร์กลางของหุ่นยนต์  อยู่บริเวณเทปสีดำ
และ เซ็นเซอร์ซ้าย และ  เซ็นเซอร์ขวา อยู่บริเวณพื้นสีขาว ไฟ LED สีแดง ของ เซ็นเซอร์ตัวกลาง จะดับ และ Serial Monitor จะแสดง L=0 C=1 R=0
และเมื่อ เซ็นเซอร์ขวาของหุ่นยนต์  อยู่บริเวณเทปสีดำ
และ เซ็นเซอร์ซ้าย และ  เซ็นเซอร์กลาง อยู่บริเวณพื้นสีขาว ไฟ LED สีแดง ของ เซ็นเซอร์ขวา จะดับ และ Serial Monitor จะแสดง L=0 C=0 R=1
แสดงว่า การเชื่อมต่อ เซ็นเซอร์ ทั้ง 3 ตัว นั้นถูกต้อง และ พร้อมใช้งานแล้ว
*** ถ้าไม่ถูกต้อง ให้ตรวจสอบการเชื่อมต่อสาย และ ทดลอง ปรับค่าการรับแสง โดย ใช้ไขควงหมุน ตัว R ปรับค่าได้ แบบ trimpot สี่เหลี่ยมสีฟ้า ***
3. ทดสอบการทำงาน
Upload โค้ดนี้ ไปยัง บอร์ด Arduino UNO R3
/*
    Line Following Robot 3 Sensors with Arduino UNO + L298P
    For more details visit:
    https://robotsiam.blogspot.com/2018/01/3-arduino-l298p.html
*/
/*-------definning Outputs------*/
int MA1 = 12;     // Motor A1
int MA2 =  3;     // Motor A2
int PWM_A =  10;   // Speed Motor A
int MB1 =  13;     // Motor B1
int MB2 =  8;     // Motor B2
int PWM_B =  11;  // Speed Motor B
int SPEED = 110;  // Speed PWM สามารถปรับความเร็วได้ถึง 0 - 255
/*-------definning Sensor------*/
int sensor[3] = {0, 0, 0};
void setup() {
  //Setup Channel A
  pinMode(12, OUTPUT); //Motor A1
  pinMode(3, OUTPUT); //Motor A2
  pinMode(10, OUTPUT); //Speed PWM Motor A
  //Setup Channel B
  pinMode(13, OUTPUT);  //Motor B1
  pinMode(8, OUTPUT);  //Motor B2
  pinMode(11, OUTPUT); //Speed PWM Motor B
}
void loop() {
  sensor[0] = digitalRead(A1);
  sensor[1] = digitalRead(A2);
  sensor[2] = digitalRead(A3);
  if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 0) )
    Forward(1);
  else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) )
    turnRight(10);
  else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 1) )
    turnRight(200);
  else if ((sensor[0] == 1) && (sensor[1] == 0) && (sensor[2] == 0)  )
    turnLeft(10);
  else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 0) )
    turnLeft(200);
  else
    Forward(1);
}
void Backward(int time)
{
  digitalWrite(MA1, LOW);
  digitalWrite(MA2, HIGH);
  analogWrite(PWM_A, SPEED);
  digitalWrite(MB1, HIGH);
  digitalWrite(MB2, LOW);
  analogWrite(PWM_B, SPEED);
  delay(time);
}
void Forward (int time)
{
  digitalWrite(MA1, HIGH);
  digitalWrite(MA2, LOW);
  analogWrite(PWM_A, SPEED);
  digitalWrite(MB1, LOW);
  digitalWrite(MB2, HIGH);
  analogWrite(PWM_B, SPEED);
  delay(time);
}
void turnLeft(int time)
{
  digitalWrite(MA1, HIGH);
  digitalWrite(MA2, LOW);
  analogWrite(PWM_A, SPEED);
  digitalWrite(MB1, LOW);
  digitalWrite(MB2, LOW);
  analogWrite(PWM_B, 0);
  delay(time);
}
void turnRight(int time)
{
  digitalWrite(MA1, LOW);
  digitalWrite(MA2, LOW);
  analogWrite(PWM_A, 0);
  digitalWrite(MB1, LOW);
  digitalWrite(MB2, HIGH);
  analogWrite(PWM_B, SPEED);
  delay(time);
}
void Stop(int time)
{
  digitalWrite(MA1, LOW);
  digitalWrite(MA2, LOW);
  analogWrite(PWM_A, 0);
digitalWrite(MB1, LOW);
  digitalWrite(MB2, LOW);
  analogWrite(PWM_B, 0);
  delay(time);
}
ใส่ถ่าน แบบ 18650 จำนวน 2 ก้อน เข้าที่รางถ่าน เปิดเพาเวอร์สวิตซ์สำหรับเปิดปิด (ON / OFF ) ทดสอบการทำงาน กับ สนาม เส้นสีดํา พื้นสีขาว  ตาม วีดีโอผลลัพธ์การทำงานของ หุ่นยนต์เดินตามเส้น 3 เซ็นเซอร์  Arduino + L298P

ความคิดเห็น