Header Ads

  • Breaking News

    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ướcCảm biến bên phảiTình hìnhHoạt động
    TắtTắtRobot đang lái xe từ tường.Quay lại bức tường, rẽ phải.
    TrênTắtRobot ở 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ắtTrênRobot đang đi theo bức tường.Lái xe về phía trước.
    TrênTrênRobot ở 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

    Post Top Ad

    ad728

    Post Bottom Ad

    ad728