Tìm kiếm mã

Bài 27/31: Xe thông minh SunFounder Car-5 đi theo tay bạn sử dụng Arduino | Robojax

Bài 27/31: Xe thông minh SunFounder Car-5 đi theo tay bạn sử dụng Arduino | Robojax

Giới thiệu

Bạn đã bao giờ muốn chế tạo một robot phản ứng trực quan với sự hiện diện của mình chưa? Dự án này biến một chiếc xe thông minh SunFounder tiêu chuẩn thành một phương tiện điều khiển bằng cử chỉ, có thể đi theo bàn tay của bạn. Thay vì sử dụng điều khiển từ xa hoặc ứng dụng điện thoại thông minh, chiếc xe này sử dụng kết hợp cảm biến siêu âm và hồng ngoại để phát hiện vị trí và khoảng cách của bàn tay bạn, cho phép bạn điều hướng nó sang trái, phải hoặc tiến về phía trước bằng những chuyển động tự nhiên đơn giản.

27-SunFounder-Car-5-Follow-Hand

Dự án này là một phần của Khóa học Arduino Robojax (Bài 27/31) và được xây dựng bằng bộ kit Arduino 3-trong-1 SunFounder. Đây là một cách tuyệt vời để tìm hiểu về sự kết hợp cảm biến, nơi nhiều cảm biến hoạt động cùng nhau để tạo ra hành vi phức tạp và phản hồi tốt hơn. Giá trị thực tế ở đây là hiểu cách kết hợp các loại đầu vào khác nhau để đưa ra quyết định, một khái niệm cơ bản trong robot và tự động hóa.

Dưới đây là một vài ý tưởng thực tế bạn có thể xây dựng dựa trên logic này:

  • Triển lãm tương tác: Tạo một màn hình robot nhỏ đi theo khách tham quan để thu hút sự chú ý của họ.
  • Nền tảng tự động tránh chướng ngại vật: Sửa đổi mã để xe di chuyển trong phòng bằng cách tránh chướng ngại vật thay vì đi theo bàn tay.
  • Bộ kit robot giáo dục: Sử dụng dự án này làm dự án nền tảng để dạy học sinh về tích hợp cảm biến, logic và điều khiển động cơ.
  • Xe đẩy giao hàng thông minh: Trong môi trường được kiểm soát, logic này có thể được điều chỉnh cho một xe đẩy nhỏ đi theo người trong nhà kho hoặc nhà máy.

Phần cứng & Linh kiện

Dự án này sử dụng các linh kiện có trong bộ kit Arduino 3-trong-1 SunFounder. Các linh kiện chính bạn sẽ sử dụng là:

  • Khung xe thông minh SunFounder: Nền tảng vật lý với bánh xe và động cơ.
  • Bo mạch Arduino: "Bộ não" của xe chạy mã.
  • Cảm biến siêu âm (HC-SR04): Được sử dụng để đo khoảng cách đến một vật thể (bàn tay của bạn) ở phía trước xe.
  • Hai cảm biến tránh chướng ngại vật hồng ngoại (IR): Được gắn ở bên trái và bên phải để phát hiện sự hiện diện của bàn tay bạn ở các bên đó.
  • Bộ điều khiển động cơ: Một mô-đun (thường là L298N hoặc tương tự) được sử dụng để điều khiển tốc độ và hướng của động cơ xe dựa trên tín hiệu từ Arduino.
  • Nguồn điện: Pin để cấp nguồn cho Arduino và động cơ.

Hướng dẫn đấu dây

car_7_8_follow_hand

Như đã đề cập trong video, việc đấu dây cho dự án này giống hệt như những gì đã giải thích trong các bài học trước cho xe tránh chướng ngại vật. Các cảm biến và động cơ đều được kết nối với các chân analog và digital của Arduino. Để tham khảo trực quan, vui lòng xem sơ đồ đấu dây cho Xe thông minh SunFounder.

Mã xác định các chân cụ thể được sử dụng cho từng linh kiện, được trình bày chi tiết trong phần tiếp theo.

Giải thích mã

Phần này tập trung vào các phần có thể cấu hình của mã mà bạn có thể muốn điều chỉnh cho chiếc xe của riêng mình. Chương trình đầy đủ có sẵn để tải xuống trên trang tài nguyên Robojax.

Ở đầu bản phác thảo, bạn sẽ tìm thấy các định nghĩa chân. Đây là những dòng quan trọng nhất cần hiểu nếu bạn đã đấu dây xe khác với người hướng dẫn.

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int rightIR=7;
const int leftIR=8;

const int trigPin = 3;
const int echoPin = 4;

Dưới đây là chức năng của từng nhóm chân:

  • Chân động cơ (A_1A, A_1B, B_1A, B_1B): Đây là các chân kết nối với bộ điều khiển động cơ để điều khiển hai động cơ. Nhãn "A" và "B" thường đề cập đến động cơ trái và phải, tương ứng. Bạn phải thay đổi các chân này nếu bộ điều khiển động cơ của bạn được kết nối với các chân Arduino khác.
  • Chân cảm biến IR (rightIR, leftIR): Các chân đầu vào digital này đọc tín hiệu từ cảm biến tránh chướng ngại vật hồng ngoại trái và phải. Giá trị 0 có nghĩa là có chướng ngại vật (bàn tay của bạn) được phát hiện, trong khi 1 có nghĩa là đường đi thông thoáng.
  • Chân cảm biến siêu âm (trigPin, echoPin): trigPin là đầu ra gửi một xung siêu âm ngắn, và echoPin là đầu vào đọc thời lượng của xung phản xạ để tính khoảng cách.

Bên trong hàm loop(), bạn sẽ tìm thấy logic hành vi chính. Có một biến duy nhất bạn có thể muốn điều chỉnh:

int speed = 150;

Biến speed này điều khiển công suất gửi đến động cơ trong quá trình di chuyển. Nó có thể nằm trong khoảng từ 0 (dừng) đến 255 (tốc độ tối đa). Bạn có thể tăng giá trị này (ví dụ: lên 200) để xe nhanh hơn hoặc giảm giá trị (ví dụ: xuống 100) để chuyển động chậm hơn, được kiểm soát tốt hơn.

Mã cũng chứa các hàm như moveForward(), turnLeft()turnRight(). Các hàm này được sử dụng để điều khiển chuyển động của xe và được gọi dựa trên các kết quả đọc từ cảm biến. Bạn không cần sửa đổi chúng, nhưng bạn có thể sử dụng chúng làm các khối xây dựng để tạo ra các hành vi tùy chỉnh của riêng mình.

Cách hoạt động của logic "Đi theo bàn tay của bạn"

Điểm kỳ diệu của dự án này nằm ở cách Arduino diễn giải dữ liệu từ ba cảm biến. Logic rất đơn giản và được thực thi liên tục trong hàm loop().

Đầu tiên, chiếc xe đo khoảng cách đến vật thể ngay phía trước bằng cảm biến siêu âm. Sau đó, nó kiểm tra hai cảm biến hồng ngoại để xem có vật thể ở bên trái hay bên phải không. Quá trình ra quyết định như sau:

  1. Tiến về phía trước: Nếu khoảng cách đo được bởi cảm biến siêu âm lớn hơn 5 cm nhưng nhỏ hơn 10 cm, xe sẽ tiến về phía trước. Điều này tạo ra vùng "điểm ngọt" nơi xe sẽ đi theo bàn tay của bạn.
  2. Rẽ trái: Nếu khoảng cách không nằm trong vùng đó, xe sẽ kiểm tra cảm biến hồng ngoại. Nếu cảm biến bên trái bị chặn (tay bạn ở bên trái) và cảm biến bên phải thông thoáng, xe sẽ rẽ trái.
  3. Rẽ phải: Ngược lại, nếu cảm biến bên phải bị chặn và bên trái thông thoáng, xe sẽ rẽ phải.
  4. Dừng lại: Nếu không có điều kiện nào được đáp ứng—ví dụ, nếu tay bạn quá xa hoặc quá gần—xe sẽ dừng lại.

Tập hợp quy tắc đơn giản này cho phép xe phản ứng linh hoạt với vị trí bàn tay của bạn, tạo ra hành vi đi theo mượt mà và trực quan.

Trình diễn dự án trực tiếp

Trong video trình diễn, giảng viên cho thấy hành vi của xe trong thời gian thực. Màn hình nối tiếp được sử dụng để hiển thị khoảng cách đọc được bởi cảm biến siêu âm. Khi xe đứng yên và tay bạn ở xa (ví dụ: 36 cm), xe vẫn dừng. Ngay khi bạn đặt tay trong vùng 5-10 cm phía trước xe, xe bắt đầu tiến về phía trước.

Phần trình diễn cũng làm nổi bật logic rẽ. Khi bạn đặt tay ở bên trái xe, cảm biến hồng ngoại bên trái được kích hoạt và xe rẽ trái. Tương tự, đặt tay ở bên phải khiến xe rẽ phải. Xe sẽ tiếp tục đi theo tay bạn khi bạn di chuyển nó xung quanh, chỉ dừng lại khi tay bạn được rời khỏi phạm vi cảm biến hoặc quá gần. Điều này xác nhận rằng sự kết hợp cảm biến và logic hoạt động đúng như thiết kế, tạo ra một dự án phản hồi nhanh và thú vị.

Các chương

  • [00:00] Giới thiệu về xe thông minh đi theo tay
  • [00:35] Giới thiệu về khóa học và bộ kit Robojax Arduino
  • [01:41] Tổng quan dự án và thiết lập mã
  • [02:19] Giải thích định nghĩa chân và thiết lập
  • [03:19] Logic mã để đi theo tay bạn
  • [05:48] Trình diễn trực tiếp xe hoạt động
  • [07:28] Trình diễn cuối cùng và đánh giá hiệu suất

Hình ảnh

Car 7 8 follow hand
Car 7 8 follow hand
27 SunFounder Car 5 follow hand
27 SunFounder Car 5 follow hand
898-Lesson 27/31: Car-5 SunFounder Smart Car Follows Your Hand
Ngôn ngữ: C++
/*
Lesson 27/31: Car-5 SunFounder Smart Car Follows Your Hand
Get this code and watch video Download and resource page https://robojax.com/RJT610
YouTube video https://www.youtube.com/watch?v=mcbJlE7-8ro

*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int rightIR=7;
const int leftIR=8;

const int trigPin = 3;
const int echoPin = 4;

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //IR obstacle
  pinMode(leftIR,INPUT);
  pinMode(rightIR,INPUT);
  
  //ultrasonic
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
}

void loop() {

  float distance = readSensorData();

  int left = digitalRead(leftIR);  // 0: Obstructed   1: Empty
  int right = digitalRead(rightIR);
  int speed = 150;

  if (distance>5 && distance<10){
    moveForward(speed);
  }else if(!left&&right){
    turnLeft(speed);
  }else if(left&&!right){
    turnRight(speed);
  }else{
    stopMove();
  }
}

float readSensorData() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
  return distance;
}

void moveForward(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void turnRight(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void turnLeft(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

Tài nguyên & tài liệu tham khảo

Tập tin📁

Thư viện Arduino (tệp nén)