Thông báo

Collapse
No announcement yet.

Sau 2 lần Fail rồi! E rất cần sự giúp đỡ của mọi người

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Sau 2 lần Fail rồi! E rất cần sự giúp đỡ của mọi người

    Bọn e đang làm một con robot dò đường. Mạch, code xong

    nhưng nó vẫn chưa hoàn thiện tốt

    Xe của em khi gặp bẫy chữ T có khả năng dò lùi nhưng do chưa phát triển tốt thời gian nó ra khỏi bẫy lớn.



    Còn đây là code

    #include <REGX52.h>
    #define motorthuan1 P0_0
    #define motornguoc1 P0_2
    #define motorthuan2 P0_3
    #define motornguoc2 P0_5
    #define pwm1 P0_1
    #define pwm2 P0_4
    #define phai2 P2_0
    #define phai1 P2_1
    #define phai0 P2_2
    #define trai0 P2_3
    #define trai1 P2_4
    #define trai2 P2_5
    unsigned char dem1=0,dem2=0;
    unsigned char xungphai=0,xungtrai=0;
    void delayms(int ms) //ham tao tre khoang 1ms
    {
    int i,j;
    for(i=0;i<ms;i++)
    for(j=0;j<85;j++)
    {}

    }
    void khoitao(void)
    {
    P1_5=0;
    EA=0;
    TMOD=0x02;
    TL0=0xF0;
    TH0=0xF0;
    ET0=1;
    EX1=1;
    EA=1;
    TR0=1;
    }
    void timer0(void)interrupt 1
    {
    TR0=0;
    TF0=0;
    dem1++;
    dem2++;
    if (dem1<=xungtrai)
    {
    P0_4=1;
    }
    else
    {
    P0_4=0;
    }
    if (dem1==10) dem1=0;
    if (dem2<=xungphai)
    {
    P0_1=1;
    }
    else
    {
    P0_1=0;
    }
    if (dem2==10) dem2=0;
    TR0=1;
    }
    /*void start(void) interrupt 2
    {
    xungtrai=0;
    xungphai=0;
    } */
    void dung(void)
    {
    xungphai=0;
    xungtrai=0;
    }
    void main (void)
    {
    khoitao();
    //while(P1_3==1);
    motorthuan1=1;
    motornguoc1=0;
    motorthuan2=1;
    motornguoc2=0;
    delayms(100);
    for(
    {
    while((trai1==0)&&(trai0==0)&&(phai0==0)&&(phai1== 1)) //lech trai nhieu nhat
    {
    P1=0xF2;
    xungtrai=8;
    xungphai=5;
    /* if (trai1==1&&trai0==1&&phai0==1&&phai1==1) //chay ra khoi duong
    {
    P1=0xF1;
    delayms(5);
    xungtrai=10;
    xungphai=3;
    delayms(15); //chay vao trong 15ms
    while (trai1==1&&trai0==1&&phai0==1&&phai1==1)
    {
    P1=0xF1;
    xungtrai=8; //tiep tuc quay vao
    xungphai=4;
    }
    while(phai0==1&&phai1==0) //phai bat line
    {
    P1=0xF3;
    xungtrai=5;
    xungphai=7;
    delayms(10);
    }
    } */
    }
    while(trai1==0&&trai0==0&&phai0==1&&phai1==1) //lech trai vua
    {
    P1=0xF3;
    xungtrai=8;
    xungphai=6;
    }
    while(trai1==0&&trai0==0&&phai0==1&&phai1==0) //lechtrai hiem
    {
    xungtrai=7;
    xungphai=6;
    }
    while(trai1==0&&trai0==1&&phai0==1&&phai1==1) //lech trai it nhat
    {
    P1=0xF4;
    xungtrai=8;
    xungphai=7;
    }
    while(trai1==0&&trai0==1&&phai0==1&&phai1==0) //ko lech
    {
    P1=0xF5;
    xungtrai=9;
    xungphai=9;
    }
    while(trai1==1&&trai0==0&&phai0==0&&phai1==0) //lech phai nhieu
    {
    P1=0xF8;
    xungphai=8;
    xungtrai=5;
    /*if (trai1==1&&trai0==1&&phai0==1&&phai1==1) //chay ra khoi duong
    {
    P1=0xF1;
    delayms(5);
    xungtrai=3;
    xungphai=10;
    delayms(15); //chay vao trong 15ms
    while (trai1==1&&trai0==1&&phai0==1&&phai1==1)
    {
    P1=0xF1;
    xungtrai=4; //tiep tuc quay vao
    xungphai=8;
    }
    while(trai1==0&&trai0==1) //trai bat line
    {
    P1=0xF8;
    xungtrai=7;
    xungphai=5;
    delayms(10);
    }
    } */
    }
    while(trai1==1&&trai0==1&&phai0==0&&phai1==0) //lech phai vua
    {
    P1=0xF7;
    xungphai=8;
    xungtrai=5;
    }
    while(trai1==0&&trai0==1&&phai0==0&&phai1==0) //lechphai hiem
    {
    xungphai=8;
    xungtrai=5;
    }
    while(trai1==1&&trai0==1&&phai0==1&&phai1==0) //lech phai it
    {
    P1=0xF6;
    xungphai=8;
    xungtrai=7;
    }
    while(trai1==1&&trai0==1&&phai0==1&&phai1==1) //tranh bay nga tu
    {
    P1=0xF0;
    xungtrai=9;
    xungphai=9;
    }
    if (trai2==0&&trai1==0&&trai0==0&&phai0==0&&phai1==0& &phai2==0)
    { delayms(5);
    while(trai2==0&&trai1==0&&trai0==0&&phai0==0&&phai 1==0&&phai2==0)
    { P1=0xF1;
    dung(); //dung xe
    delayms(30);
    motorthuan1=0; //dy lui
    motornguoc1=1;
    motorthuan2=0;
    motornguoc2=1;
    xungtrai=8;
    xungphai=8;
    delayms(10);
    for(
    {
    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    while(trai2==0&&trai1==0&&trai0==1&&phai0==1&&phai 1==0&&phai2==0) //ko lech
    {
    P1=0xF5;
    xungtrai=9;
    xungphai=9;
    }
    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    while(trai2==0&&(trai1==0)&&(trai0==0)&&(phai0==0) &&(phai1==1)&&phai2==0) //lech trai nhieu nhat
    {
    P1=0xF2;
    xungtrai=6;
    xungphai=9;
    /* if (trai1==1&&trai0==1&&phai0==1&&phai1==1) //chay ra khoi duong
    {
    P1=0xF1;
    delayms(5);
    xungtrai=10;
    xungphai=3;
    delayms(15); //chay vao trong 15ms
    while (trai1==1&&trai0==1&&phai0==1&&phai1==1)
    {
    P1=0xF1;
    xungtrai=8; //tiep tuc quay vao
    xungphai=4;
    }
    while(phai0==0&&phai1==1) //phai bat line
    {
    P1=0xF2;
    xungtrai=5;
    xungphai=7;
    }
    } */
    }
    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    while(trai2==0&&trai1==0&&trai0==0&&phai0==1&&phai 1==1&&phai2==0) //lech trai vua
    {
    P1=0xF3;
    xungtrai=5;
    xungphai=8;
    }
    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    while(trai2==0&&trai1==0&&trai0==1&&phai0==0&&phai 1==0&&phai2==0) //lechphai hiem
    {
    xungphai=5;
    xungtrai=8;
    }
    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    while(trai2==0&&trai1==0&&trai0==1&&phai0==1&&phai 1==1&&phai2==0) //lech trai it nhat
    {
    P1=0xF4;
    xungtrai=9;
    xungphai=9;
    }
    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    while(trai2==0&&trai1==0&&trai0==0&&phai0==1&&phai 1==0&&phai2==0) //lechtrai hiem
    {
    xungtrai=9;
    xungphai=9;
    }
    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    while(trai2==0&trai1==1&&trai0==0&&phai0==0&&phai1 ==0&&phai2==0) //lech phai nhieu
    {
    P1=0xF8;
    xungphai=5;
    xungtrai=8;
    /*if (trai1==1&&trai0==1&&phai0==1&&phai1==1) //chay ra khoi duong
    {
    P1=0xF1;
    delayms(5);
    xungtrai=3;
    xungphai=10;
    delayms(15);
    //chay vao trong 15ms
    while (trai1==0&&trai0==0&&phai0==0&&phai1==0)
    {
    P1=0xF1;
    xungtrai=4; //tiep tuc quay vao
    xungphai=8;
    }
    while(trai1==1&&trai0==0) //trai bat line
    {
    P1=0xF8;
    xungtrai=7;
    xungphai=5;
    }
    } */
    }
    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    while(trai2==0&&trai1==1&&trai0==1&&phai0==0&&phai 1==0&&phai2==0) //lech phai vua
    {
    P1=0xF7;
    xungphai=4;
    xungtrai=6;
    }
    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    while(trai2==0&&trai1==1&&trai0==1&&phai0==1&&phai 1==0&&phai2==0) //lech phai it
    {
    P1=0xF6;
    xungphai=6;
    xungtrai=8;
    }
    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    while(trai2==0&&trai1==1&&trai0==1&&phai0==1&&phai 1==1&&phai2==0)
    {P1=0xF0;
    xungtrai=8;
    xungphai=8;
    }

    if(trai2==1&&trai1==1&&phai2==0&&phai1==0) break;
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0) break;
    }


    if(trai2==1&&trai1==1&&phai2==0&&phai1==0)
    {
    P1=0xF9;
    dung();
    delayms(10);
    motorthuan1=1; //dao chieu dong co
    motornguoc1=0;
    motorthuan2=0;
    motornguoc2=1;
    xungphai=8;
    xungtrai=8;
    while(trai1==1||trai0==1) delayms(10) ;
    dung();
    //delayms(50);
    motorthuan2=1;
    motornguoc2=0;
    xungtrai=8;
    xungphai=8;
    delayms(10);
    }
    if(trai2==0&&phai1==1&&phai2==1&&trai1==0)
    {
    P1=0xF9;
    dung();
    //delayms(10);
    motorthuan1=0; //dao chieu dong co
    motornguoc1=1;
    motorthuan2=1;
    motornguoc2=0;
    xungphai=8;
    xungtrai=8;
    while (phai1==1||phai2==1)delayms(10) ;
    dung();
    //delayms(50);
    motorthuan1=1;
    motornguoc1=0;
    xungtrai=8;
    xungphai=8;
    //delayms(10);
    }
    }
    }
    }
    }

    Mọi người có thể giúp em tìm gia phương hướng để nó tốt hơn

    Cảm biến: 6 sensor đặt thẳng hàng.......
    tks

  • #2
    5 View sao ko ai cm vậy

    Comment


    • #3
      ặc ặc , sao nó cà zật vậy ??? nếu mình làm mình sẽ có 1 bộ Ram lưu hành trình ... và quá trình dò đường của nó ... khi gặp chữ T cùng lắm kiểm tra 2 lần rồi rút lui thôi ... chứ quanh quẩn mãi đầu chữ T thì time out mất rồi

      ( chỉ trình bày ý tưởng thôi )
      Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

      Comment


      • #4
        A @ queduong ơi! a nêu rõ hơn đi!

        Sửa code hay thêm phần cứng gì ko ak! bọn e chưa có nhiều kinh nghiệm lắm! mà lại nếu làm quay vòng(ko lùi) thì ko đúng ý thầy( đội duy nhất dò lùi gặp bẫy) vậy a có thê giúp em ko ak
        tks a.

        Comment


        • #5
          Nguyên văn bởi queduong Xem bài viết
          ặc ặc , sao nó cà zật vậy ??? nếu mình làm mình sẽ có 1 bộ Ram lưu hành trình ... và quá trình dò đường của nó ... khi gặp chữ T cùng lắm kiểm tra 2 lần rồi rút lui thôi ... chứ quanh quẩn mãi đầu chữ T thì time out mất rồi

          ( chỉ trình bày ý tưởng thôi )
          Cái này hơi quá sức a ạ!

          Comment


          • #6
            theo mình nên lập trình cho nó lùi lại một khoảng lớn hơn nữa

            Comment


            • #7
              Đúng! nhưng nếu cho delay thêm thì sẽ điều khiển chỗ khác rất khó!

              nó lùi ra ngoài vạch mất!( ở chỗ vòng cua ấy)

              Comment


              • #8
                vậy đến chỗ bẫy,bạn cho xe xoay 180 độ,(cho 1 bánh dừng,1 bánh quay)nó sẽ bắt đc vạch và đi tiếp

                Comment


                • #9
                  Bạn ơi lần sau nếu có code thi để vào file thôi cho anh em đỡ phải cuận chuột nhiều, bạn cứ thử vào trang nào mà có khoảng 3 bài pase code dài như bạn xem có mệt mỏi khi xem không. Đề nghị trao đổi bằng thuật toán, code để dạng file tải về xem cho chủ đề hiển thị trên trang gọn dễ đọc dễ góp ý.

                  Về cái góc chữ T mà robot của bạn thoát rất chậm và phải kiểm tra lâu như vậy mình có mấy ý kiến thế này.
                  - Do cách thức lập trình theo kiểu "Nếu có cái gì là làm ngay cái đó - không qua các biến trung gian" và kết hợp delay hơi nhìu nên bây giờ sửa chương trình ví dụ cho lùi lâu hơn là sẽ bị ảnh hưởng tới các chương trình khác
                  - Phương án bạn sử dụng while(điều kiện) để xử lí các tình huống trên đường đi khá tốt nhưng nếu có nhiễu ánh sáng từ ngoài vào sensor thì liệu chương trình còn chạy chuẩn không hay là cứ chết tại vong while đó mãi. Cũng vì mình không thấy đoạn code nào chống nhiễu sensor cả, và mình thấy phải tất điện đi để robot dò line.
                  - Một vấn đề nữa khi không phân hoạch được modul chương trình rõ ràng ( phân thành các chương trình con truyền biến cho nhau ) mình cần xử lí tại ngã tư chữ T thì phải sửa ở một số chỗ chứ khổng chỉ ở một dòng code nào cả

                  Mình có một số góp ý như sau

                  - Phân thành các chương trình con và gọi trong chương trình chính như sau

                  void main()
                  {
                  //------------------- xác lập biến vào ra -------------
                  init_inout();

                  while (1)
                  {
                  ScanSensor();
                  CheckT();
                  Out_DC_motor();
                  ........................ các chương trình con khác nếu cần (nút nhấn loa còi đèn lcd led7 truyền thông ...)
                  }
                  }

                  - Các chương trình con và nhiệm vụ của nó
                  ScanSensor() :
                  + Thực hiện quét các mắt theo một số lần nào đó ( ví dụ 50 lần ) rồi mới đưa ra kết luận và lưu vào các biến s0 - s5 tương ứng với các mắt
                  + Từ kết quả mắt tại thời điểm hiện tại suy ra xe đang bị lệch nhiều hay ít lệch trái hay phải luu vào biến x = 0,1,2,3,4,...
                  CheckT():
                  + Thực hiện kiểm tra ngã ba chữ T theo một số giải thuật ví dụ Tính tổng các mắt s0 - s5 nếu tổng >=4 chẳng hạn thì suy ra là ngã ba T ...v...v...
                  + nếu đúng ngã tư thì y =1 không thì y = 0
                  Out_DC_motor():
                  + Nếu đang là ngã ba chư T thì
                  - thực hiện các giải thuật tránh như Lùi lại hay Quay phải ...
                  - thực hiện xong thoát ra bình thường không dung Break như của bạn ( Trong lập trình mình hạn chế sử dụng break hay goto vì nó bẻ gẫy thuật toán và cấu trúc chương trình - ý kiến cá nhân nhé)
                  + Nếu không phải ngã ba chữ T thì
                  - thực hiện quét vùng lệch vị trí vạch để điều khiển động cơ (chú ý tuyệt đối không dùng while )
                  - nếu x = 0 thì ....
                  - nếu x= 1 thì ...

                  Với cách viết này và kết hợp thêm delay sử dụng time (không dùng delay kiểu trễ kia nhá) chương trình sẽ được chạy liên tục không bị dừng ở đâu cả. Vì vong while(1) trong main chay liên tục và cực nhanh nên sẽ quét qua tất cả các dòng lệnh quan trọng như quét đầu vào và xử lý đưa kết quả ra đầu ra.

                  Hi vọng bài viết này sẽ phần nào giúp bạn lập trình robot tốt hơn. Thân mến.

                  Comment

                  Về tác giả

                  Collapse

                  anhchangbk Tìm hiểu thêm về anhchangbk

                  Bài viết mới nhất

                  Collapse

                  Đang tải...
                  X