Hướng dẫn chế tạo Robot dò Line Arduino, tránh vật cản HC-SR04

Hướng dẫn chế tạo Robot dò Line Arduino, tránh vật cản HC-SR04

Robot dò Line Arduino là một trong những dự án thú vị và hấp dẫn cho sinh viên và những người yêu thích lĩnh vực robot. Bằng việc sử dụng nền tảng Arduino và các linh kiện điện tử phổ biến, các bạn có thể tự thiết kế và chế tạo một robot dò line có khả năng di chuyển và tránh vật cản. Trong dự án này, mình sẽ hướng dẫn sử dụng cảm biến dò line và cảm biến siêu âm HC-SR04 để giúp robot phát hiện và tránh vật cản trên đường đi.

Chỉ cần những kỹ năng cơ bản về lập trình và điện tử, sinh viên và những người yêu thích robot có thể dễ dàng tiếp cận và thực hiện dự án này. Hơn nữa, việc chế tạo robot dò line cũng giúp các bạn rèn luyện kỹ năng xử lý dữ liệu, xây dựng mô hình điều khiển và thiết kế phần cứng.

Xem ngay: Chế tạo gậy thông minh cho người mù sử dụng Arduino

Các linh kiện cần thiết cho dự án

LINH KIỆN SỐ LƯỢNG MUA HÀNG
Arduino Uno R3 1 Shopee | Cytron
Động cơ vàng + Bánh xe 4 Shopee | Cytron
Module điều khiển động cơ L293D 1 Shopee | Cytron
Servo SG90 1 Shopee | Cytron
Cảm biến vật cản hồng ngoại 2 Shopee | Cytron
Cảm biến khoảng cách HC-SR04 1 Shopee | Cytron
Khung đỡ cảm biến siêu âm HC-SR04 1 Shopee | Cytron
Pin 9V 1 Shopee | Cytron
Dây đế Pin 9V 1 Shopee | Cytron
Dây nối 40P (Đực – Cái) 1 Shopee | Cytron

Motor Shield L293D

Motor Shield L293D là một board điều khiển động cơ cho Arduino, cho phép bạn kiểm soát động cơ và các thiết bị khác dễ dàng hơn thông qua Arduino. Bộ điều khiển này có thể điều khiển được động cơ bước và động cơ DC, đồng thời cũng hỗ trợ các thiết bị đầu vào như cảm biến, nút bấm và cả các loại module khác.

Motor Shield L293D được thiết kế với mạch tích hợp L293D, một bộ cầu H kép cho phép bạn kiểm soát động cơ DC hai chiều hoặc một động cơ bước. Ngoài ra, bộ điều khiển này còn được trang bị một đầu vào có dòng điện tối đa là 2A.

Xem thêm: Điều khiển động cơ DC, Stepper Motor và Servo bằng Motor Shield L293D & Arduino

Cảm biến vật cản hồng ngoại

Cảm biến vật cản hồng ngoại LM393 là một trong những loại cảm biến phổ biến trong các dự án điện tử. Nó hoạt động bằng cách phát ra tia hồng ngoại và thu lại khi gặp các vật cản.

Cảm Biến Vật Cản Hồng Ngoại

Cảm biến vật cản hồng ngoại có cấu tạo gồm một đầu phát hồng ngoại và một đầu thu tín hiệu, được gắn chung với một IC so sánh LM393, nên được sử dụng rộng rãi trong các ứng dụng như xe tự hành, xe dò line arduino, cổng tự động, hệ thống đo khoảng cách, và nhiều ứng dụng khác.

Cảm biến siêu âm HC SR04

Cảm biến siêu âm HC-SR04 là một loại cảm biến siêu âm, được sử dụng để đo khoảng cách từ cảm biến đến một vật thể. Nó sử dụng sóng siêu âm để phát ra tín hiệu, sau đó đo thời gian mà tín hiệu đó phản xạ từ vật thể và quay trở lại cảm biến. Dựa vào thời gian này, ta có thể tính được khoảng cách từ cảm biến đến vật thể.

Cảm biến này có 4 chân: chân VCC để cấp nguồn, chân GND nối đất, chân Trig để phát sóng siêu âm và chân Echo để nhận tín hiệu phản xạ.

Sơ đồ nguyên lý hoạt động của dự án

Để giúp cho các bạn dễ dàng trong việc đấu nối mình đã cung một bộ sơ đồ khối robot dò line được vẽ bằng Fritzing.

Đầu tiên các bạn cần đấu nối các động cơ tương ứng với M1, M2, M3, M4 có trên mạch L293D.

Tiếp theo, cảm biến khoảng cách HC-SR04 sẽ đấu như sau: TRIG — A2, ECHO — A3, VCC — 5V, GND — GND.

Kết nối cảm biến vật cản hồng ngoại với Shield Motor L293D: OUT — A0,, VCC — 5V, GND — GND và cảm biến còn lại đấu nối tương tự vào chân A1.

Kết nối Servo vào vị trí trí Servo1 trên Shield Motor L293D.

Xem ngay: Hướng dẫn làm máy chơi Game xếp gạch sử dụng OLED 0.96 với Arduino

Các bước lắp ráp xe dò line Arduino

Bước 1: Cố định và đấu nối động cơ

Ở bước này, các bạn có thể sử dụng keo 2 mặt hoặc keo nến để cố định động cơ vàng trên tấm xốp. Sau đó hàn các dây vào động cơ.

Bước 2: Chế tạo giá đỡ cảm biến vật cản hồng ngoại và khoét lỗ Servo SG90

Để có thể cố định cảm biến vật cản hồng ngoại khi di chuyển các bạn có thể dùng xốp hoặc một vật liệu bất kỳ để làm một giá đỡ giống như hình và khoét thêm một lỗ để cố định Servo SG90.

Ngoài ra, cần khoan thêm 4 lỗ để luồn dây động cơ và 1 lỗ cho Servo, để thuận tiện trong việc đi dây và đấu với với Shield Motor L293D.

Bước 3: Cố định board mạch Arduino Uno R3

Mặt sau của tấm xốp, dùng keo cố định board Arduino Uno R3.

Bước 4: Lắp đặt Shield Motor L293D và đấu nối động cơ

Cắm Shield Motor L293D vào Arduino Uno R3, chú ý chiều của board mạch.

Lắp đặt theo số thứ tự mình đánh dấu trên mỗi động cơ, cần đấu tương ứng với các vị trí M1, M2, M3, M4 có trên mạch.

Bước 5: Tiến hành lắp đặt cảm biến vật cản hồng ngoại

Tiếp hành lắp cảm biến vào đúng vị trí trên khung và kết nối với chân A0, A1 trên Shield Motor L293D.

Bước 6: Lắp đặt bánh xe cho Robot dò line

Lắp tất cả 4 bánh xe vào động cơ.

Bước 7: Kết nối Servo SG90 với Shield Motor L293D

Cố định Servo vào vị trí mình đã khoét trước đó, và kết nối các chân của Servo SG90 tương ứng với vị trí Servo1 có trên board mạch.

Bước 8: Kết nối cảm biến khoảng cách HC-SR04 với Shield Motor L293D

Lắp đặt cảm biến khoảng cách HC-SR04 vào Servo, tiến hành đấu nối các chân vào L293D (TRIG — A2, ECHO — A3, VCC — 5V, GND — GND)

Bước 9: Cấp nguồn

Ở đây mình dùng nguồn 9V DC để cấp cho Shield Motor L293D, các bạn chú ý giúp mình chân +M các bạn dùng thêm một Jumper kết nối với chân 9V nhé.

Bước 10: Hiệu chỉnh cảm biến vật cản hồng ngoại

Các bạn vẽ một đường vạch để 2 cảm biến vật cản hồng ngoại vào bên trong đường line, dùng tua vít vặn biến trở có trên bo mạch cho đến khi cảm biến chỉ còn xuất hiện 1 đèn giống như trên hình.

Code Robot dò line Arduino

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

//hc-sr04 sensor
#define TRIGGER_PIN A2
#define ECHO_PIN A3
#define max_distance 50

//ir sensor
#define irLeft A0
#define irRight A1

//motor
#define MAX_SPEED 200
#define MAX_SPEED_OFFSET 20

Servo servo;

NewPing sonar(TRIGGER_PIN, ECHO_PIN, max_distance);

AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);


int distance = 0;
int leftDistance;
int rightDistance;
boolean object;

void setup() {
  Serial.begin(9600);
  pinMode(irLeft, INPUT);
  pinMode(irRight, INPUT);
  servo.attach(10);
  servo.write(90);

  motor1.setSpeed(120);
  motor2.setSpeed(120);
  motor3.setSpeed(120);
  motor4.setSpeed(120);
}

void loop() {
  if (digitalRead(irLeft) == 0 && digitalRead(irRight) == 0 ) {
    objectAvoid();
    //forword
  }
  else if (digitalRead(irLeft) == 0 && digitalRead(irRight) == 1 ) {
    objectAvoid();
    Serial.println("TL");
    //leftturn
    moveLeft();
  }
  else if (digitalRead(irLeft) == 1 && digitalRead(irRight) == 0 ) {
    objectAvoid();
    Serial.println("TR");
    //rightturn
    moveRight();
  }
  else if (digitalRead(irLeft) == 1 && digitalRead(irRight) == 1 ) {
    //Stop
    Stop();
  }
}

void objectAvoid() {
  distance = getDistance();
  if (distance <= 15) {
    //stop
    Stop();
    Serial.println("Stop");

    lookLeft();
    lookRight();
    delay(100);
    if (rightDistance <= leftDistance) {
      //left
      object = true;
      turn();
      Serial.println("moveLeft");
    } else {
      //right
      object = false;
      turn();
      Serial.println("moveRight");
    }
    delay(100);
  }
  else {
    //forword
    Serial.println("moveforword");
    moveForward();
  }
}

int getDistance() {
  delay(50);
  int cm = sonar.ping_cm();
  if (cm == 0) {
    cm = 100;
  }
  return cm;
}

int lookLeft () {
  //lock left
  servo.write(150);
  delay(500);
  leftDistance = getDistance();
  delay(100);
  servo.write(90);
  Serial.print("Left:");
  Serial.print(leftDistance);
  return leftDistance;
  delay(100);
}

int lookRight() {
  //lock right
  servo.write(30);
  delay(500);
  rightDistance = getDistance();
  delay(100);
  servo.write(90);
  Serial.print("   ");
  Serial.print("Right:");
  Serial.println(rightDistance);
  return rightDistance;
  delay(100);
}
void Stop() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}
void moveForward() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}
void moveBackward() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);

}
void turn() {
  if (object == false) {
    Serial.println("turn Right");
    moveLeft();
    delay(700);
    moveForward();
    delay(800);
    moveRight();
    delay(900);
    if (digitalRead(irRight) == 1) {
      loop();
    } else {
      moveForward();
    }
  }
  else {
    Serial.println("turn left");
    moveRight();
    delay(700);
    moveForward();
    delay(800);
    moveLeft();
    delay(900);
    if (digitalRead(irLeft) == 1) {
      loop();
    } else {
      moveForward();
    }
  }
}
void moveRight() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
}
void moveLeft() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}

Thư viện

Câu hỏi thường gặp

Kết luận

Trên đây là hướng dẫn về cách chế tạo Robot dò Line Arduino và tránh vật cản sử dụng cảm biến siêu âm HC-SR04 Arduino. Đây là một dự án thú vị và bổ ích giúp các sinh viên học tập và thực hành kỹ năng lập trình. Các bước thực hiện và code được cung cấp chi tiết, giúp cho người mới bắt đầu cũng có thể thực hiện được dự án này một cách dễ dàng. Cuối cùng để mình có động lực ra thêm nhiều bài viết mới, hãy nhấn vào nút Donate phía trên để ủng hộ cho mình nhé.

Bài viết liên quan

Subscribe
Notify of
guest

13 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Huy Tran

-if (digitalRead(irLeft) == 0 && digitalRead(irRight) == 0 )
-moveLeft();
-moveRight();
-Stop();
– pinMode(irLeft, INPUT);
 – pinMode(irRight, INPUT);
–  servo.attach(10);
–  servo.write(90);
 – motor1.setSpeed(120);
 – motor2.setSpeed(120);
 – motor3.setSpeed(120);
 – motor4.setSpeed(120);
 – int cm = sonar.ping_cm();
servo.write(150);
servo.write(30);
-if (digitalRead(irRight) == 1)
 Chỗ này e phải điền cái j mà nó lỗi hoài  

Bảo Nhân

dạ cho em hỏi dòng đầu tiên em bị lỗi gì ạ. Em cảm ơn anh.

Screenshot-68
Lộccc

sao của em để đâu nó cũng chạy hết ạ,khong dò line gì hết ,mong được giải đáp ạ huhu

Quan

cho em hoi tai thu vien sao a

adzuy

cho em hỏi em đang bị sai ở đâu ạ

2024-02-19
AAA

A ơi tải thư viện kiểu gì ạ? em chạy cũng bị lỗi thư viện

huy

cho e hỏi xe e chạy tới dừng 1s r nó chạy tiếp thì sửa chỗ nào ạ

huy

cho e hỏi xe e tới line nhưng nó dừng tầm 1s r chạy tiếp qua line thì mình sửa chỗ nào ạ