Cách xây dựng một robot tránh tường
Đây là phần cuối cùng trong 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!
Làm cho robot của bạn theo dõi một bức tường!
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 4: Người theo dòng
Phần 5: Tránh chướng ngại vật
Tổng quat
Đây là phần 6 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 chạy theo tường.
Theo dõi tường
Để theo dõi các bức tường, bạn cần ít nhất hai cảm biến (2 bit thông tin) để xử lý bốn tình huống tiềm ẩn mà rô bốt có thể gặp phải. Một cảm biến phải ở phía trước và cảm biến thứ hai có thể ở bên trái hoặc bên phải của người máy. Bạn càng sử dụng nhiều cảm biến, bạn càng có nhiều thông tin, vì vậy bạn có thể đưa ra phán đoán tốt hơn về những gì đang diễn ra. Đối với ví dụ này, tôi chỉ sử dụng hai. Robot không thể tìm thấy tường, vì vậy bạn phải đặt robot cạnh tường. Nếu bạn đặt nó ở giữa phòng, nó sẽ chỉ chạy theo vòng tròn.
Bảng sự thật
Cảm biến phía trước | Cảm biến bên phải | Tình hình | Hoạt động |
---|---|---|---|
Tắt | Tắt | Robot đang lái xe từ tường. | Quay lại bức tường, rẽ phải. |
Trên | Tắt | Robot ở cách xa tường nhưng hướng về tường hoặc chướng ngại vật. | Quay mạnh sang trái để trở lại song song với tường. |
Tắt | Trên | Robot đang đi theo bức tường. | Lái xe về phía trước. |
Trên | Trên | Robot ở một góc. | Quay mạnh sang trái. |
Để làm việc, tôi đã phải thêm mã để rẽ trái khó khăn. Khó bên trái có nghĩa là tôi chỉ quay bánh xe bên phải để robot về cơ bản quay tại chỗ thay vì tiếp tục di chuyển về phía trước trong khi quay. Tôi không thể quay chậm như người theo dõi dòngbởi vì bạn không biết robot ở gần tường như thế nào. Đây là một hạn chế của cảm biến tôi đã chọn, vì cảm biến phản xạ khác nhau dựa trên bề mặt. Ngoài ra, logic được thiết lập để chỉ là nhị phân vì không có cách nào để nói khoảng cách dựa trên cảm biến. Nếu bạn biết khoảng cách, bạn có thể thêm logic bổ sung để thay đổi tốc độ dựa trên khoảng cách để giúp rô bốt di chuyển xung quanh phòng nhanh hơn. Tôi thực sự không thể làm cho cảm biến phản xạ hoàn toàn bề mặt màu đen, vì vậy trong video bạn sẽ thấy tôi phải đặt một bề mặt màu trắng trước máy rửa bát. Một cảm biến dựa trên âm thanh sẽ không gặp vấn đề này.
Lập trình
Bản phác thảo sau thực hiện logic:
- Khởi động trình điều khiển rô bốt và đợi 5 giây. Điều này giúp bạn có thời gian để đặt robot cạnh bức tường trước khi nó bắt đầu di chuyển.
- Đọc cảm biến
- Triển khai bảng sự thật ở trên bằng cách sử dụng câu lệnh if.
- Mỗi câu lệnh thực hiện hành động được liên kết với cấu hình cảm biến.
- Tôi đã cho rô bốt rẽ phải nhanh hơn bình thường để rô bốt có thể quay quanh các góc một cách sắc nét hơn. Hầu hết các góc tường đều là 90 độ nên việc quay nhanh hơn có ý nghĩa.
robot_wall_follower
#include "robot.h"
void setup()
{
Serial.begin(38400);
Serial.println("Boot");
rbt_init();
delay(5000);
rbt_move(FWD,100);
}
uint16_t lleft,lmid,lright;
boolean wleft,wmid,wright;
uint16_t avoid_count=0;
void loop()
{
rbt_sns(&lleft,&lmid,&lright,&wleft,&wmid,&wright);
/*if the wall is sensed, go forward
* the wall is sensed if the right sensor is on but the mid
* sensor is off.
*/
if(wright && !wmid)
{
rbt_move(FWD,100);
}
/*likely going towards the wall
* not sure how close so turn as fast
* as we can
*/
if(wright && wmid)
{
rbt_move(HARD_LEFT,100);
}
/*going away from the wall
* slowly turn back towards the wall
*/
if(!wright && !wmid)
{
rbt_move(RIGHT,130);
}
/*likely at a corner or coming in at an angle to the wall*/
if(!wright && wmid)
{
rbt_move(HARD_LEFT,100);
}
}
Cần có các thay đổi đối với trái cứng đối với rô bốt.h và rô bốt.
robot.h
Thêm HARD_LEFT vào enum để biết hướng.
/*robot interface*/
typedef enum{
LEFT,
RIGHT,
FWD,
REV,
BRAKE,
HARD_LEFT,
}direction_t;
robot.ino
Thêm một trường hợp cho HARD_LEFT trong rbt_move ().
case HARD_LEFT:
digitalWrite(BPHASE,MOTOR_FWD);
digitalWrite(APHASE,MOTOR_FWD);
analogWrite(AEN,speed);
analogWrite(BEN,0);
break;
Theo dõi những bức tường trong nhà bếp của tôi:
Phần kết luận
Trong bài viết này, tôi đã chỉ ra cách bạn có thể sử dụng cảm biến độ gần để theo dõi các bức tường để điều hướng xung quanh phòng. Đây là phần kết của loạt bài viết về chế tạo robot! Robot có thể tự động đi theo một đường thẳng, một bức tường và tránh chướng ngại vật. Bạn có thể kết hợp chúng thành một con robot duy nhất không? Bạn cũng có thể kiểm soát bằng cách thêm mô-đun BLE và điều khiển rô bốt từ điện thoại của mình!
Không có nhận xét nào