Làm thế nào để xây dựng một robot - Người theo dòng
Phần 4 của loạt bài viết về cách chế tạo robot có thể đi theo đường thẳng hoặc tường và tránh chướng ngại vật!
Phần bốn của loạt bài viết về chế tạo một robot có thể đi theo đường thẳng hoặc tường và tránh chướng ngại vật!
Những bài viết liên quan
Cách chế tạo Robot:
Phần 1: Thiết kế và Sơ đồ
Phần 2: Thiết kế PCB
Phần 3: Kiểm tra phần cứng
Phần 5: Tránh chướng ngại vật
Phần 6: Robot theo dõi tường
Tổng quat
Đây là phần 4 của loạt bài viết về kinh nghiệm chế tạo một robot có thể làm được nhiều việc của tôi. Tôi nghĩ sẽ thật gọn gàng nếu tạo ra một con robot dễ dàng lắp ráp lại với nhau bằng một chiếc mỏ hàn duy nhất và giá cả cũng phải chăng. Tôi đã đưa ra các yêu cầu sau cho rô bốt của mình:
- Nhiều bộ dụng cụ đắt tiền, vì vậy nó phải tương đối rẻ.
- Nó phải dễ dàng ghép lại với nhau mà không cần thiết bị đặc biệt.
- Nó phải được lập trình dễ dàng mà không cần IDE hoặc lập trình viên phức tạp.
- Nó phải đủ mạnh để có thể mở rộng.
- Nó sẽ chạy khỏi một nguồn điện đơn giản.
- Nó phải có thể đi theo một đường hoặc một bức tường và tránh chướng ngại vật.
Trong bài viết này, tôi sẽ nói về cách lập trình robot để trở thành người theo dõi dòng.
Theo một dòng?
Kẻ theo đường là cách dễ nhất để khiến robot đi theo con đường đã định trước. Bạn chỉ cần một cách để di chuyển và một cảm biến để xác định xem robot có đang ở trên dây hay không. Có thể đã có những thuật toán được phát triển để giữ cho robot hoạt động. Lĩnh vực kỹ thuật bao gồm các thuật toán này được gọi là lý thuyết điều khiển . Đối với bài viết này, tôi sẽ tạo ra một thuật toán thực sự đơn giản. Trong mã giả:
is robot to the left of the line?
turn right
is the robot to the right of the line?
turn left
is the robot on the line?
move forward
Tìm một bề mặt thích hợp
Nhiều người dùng băng dính điện đen trên sàn nhà để làm rô bốt. Đây là một nỗi đau lớn và tạo ra một mớ hỗn độn. Bảng xóa khô màu trắng là một bề mặt tuyệt vời để thử các dòng khác nhau sau các khóa học. Tôi tìm thấy bảng 2x4 'này tại Home Depot với giá 10 đô la. Bạn có thể dễ dàng thêm các bản nhạc bằng cách vẽ bằng bút dạ đen. Nền trắng và điểm đánh dấu màu đen có đủ độ tương phản để các cảm biến có thể dễ dàng phân biệt đường kẻ. Thay vì hiệu chỉnh các cảm biến cho mọi bề mặt, tôi sẽ giả định rằng tất cả chúng đều đọc gần giống nhau cho một màu nhất định. Sau đó, tôi có thể so sánh chúng với nhau để xác định cảm biến nào hiện đang đọc giá trị tối nhất. Miễn là đường tôi vẽ chỉ che một cảm biến tại một thời điểm, thuật toán này sẽ cung cấp một cách đáng tin cậy để xác định vị trí của robot.
Viết chương trình
Đoạn mã dưới đây bắt đầu bằng cách khởi tạo trình điều khiển rô bốt và sau đó chờ 5 giây. Điều này cho phép tôi có đủ thời gian để đặt robot trên đường đua trước khi nó bắt đầu di chuyển. Sau đó, robot liên tục kiểm tra các cảm biến và xác định cách di chuyển bằng thuật toán trên. Tốc độ chuyển tiếp có thể được đặt bằng cách sử dụng định nghĩa ROBOT_SPEED. Đây là con số trong số 255. Nếu rô bốt di chuyển quá nhanh, thuật toán có thể không có đủ thời gian để sửa chuyển động. Tôi cũng đã thêm một kiểm tra xem rô bốt có được nhấc lên hay sắp rơi khỏi khóa học hay không. Nếu tất cả các cảm biến đang đọc 1000, điều đó có nghĩa là rô bốt rất có thể đang ở trên mặt đất vì không có ánh sáng nào phản xạ trở lại. Điều này rất hữu ích nếu bạn muốn rô bốt dừng lại khi bạn đang di chuyển.
Cải tiến tiềm năng
Thuật toán này không sử dụng tính trung bình hoặc theo dõi lỗi. Bạn sẽ nhận thấy trong video bên dưới rằng đôi khi robot trông giống như nó đang lắc qua lại. Điều này là do dao động trong thuật toán vì robot vượt quá đường. Một phương pháp để khắc phục điều này là sử dụng thuật toán PID (tỷ lệ-tích phân-đạo hàm). Trong một nut shell, loại thuật toán này theo dõi vị trí của robot (tích phân), nơi nó có thể đi (đạo hàm) và vị trí hiện tại của nó (tỷ lệ). Thuật toán tôi triển khai chỉ quan tâm đến những gì hiện đang xảy ra với robot. Nếu bạn muốn có một rô bốt nhanh hơn, bạn có thể cần phải loại bỏ các dao động (hiệu chỉnh quá mức) đang làm chậm rô bốt.
#include "robot.h"
#define ROBOT_SPEED 100
void setup()
{
Serial.begin(38400);
Serial.println("Boot");
rbt_init();
delay(5000);
}
uint16_t lleft,lmid,lright;
boolean wleft,wmid,wright;
void loop()
{
rbt_sns(&lleft,&lmid,&lright,&wleft,&wmid,&wright);
Serial.print("Left: ");
Serial.print(lleft);
Serial.print("Mid: ");
Serial.print(lmid);
Serial.print("Right: ");
Serial.println(lright);
//off the line
if(lleft == 1000 && lmid == 1000 && lright == 1000){
rbt_move(BRAKE,0);
}
//follow track
else{
if(lleft > lmid && lleft > lright){
rbt_move(LEFT,ROBOT_SPEED);
}
if(lmid > lleft && lmid > lright){
rbt_move(FWD,ROBOT_SPEED);
}
if(lright > lmid && lright > lleft){
rbt_move(RIGHT,ROBOT_SPEED);
}
}
}
line_follower.zip
Làm theo một dòng!
Phần kết luận
Trong bài viết này, tôi đã trình bày quy trình viết một thuật toán điều khiển theo một dòng. Người theo dõi dòng là một cách đơn giản để tìm hiểu về lý thuyết điều khiển và xem một robot điều hướng một khóa học hoàn toàn tự động! Trong phần tiếp theo, tôi sẽ điều khiển robot di chuyển quanh một tầng và tránh va vào chướng ngại vật và tường.
Không có nhận xét nào