Thông báo

Collapse
No announcement yet.

Chương trình dò đường cho Robocon

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

  • Chương trình dò đường cho Robocon

    Chào các anh ! Em đang viết chương trình dò đường cho Píc6f877a Dùng ngôn ngữ C . Nhưng gặp khó khăn quá . Em chưa biết đưa giá trị điều xung ra động cơ như thế nào . Chương trình em tham khảo trên mạng là viết cho động cơ có Encoder . Động cơ của em không dùng encoder.
    Một vấn đề nữa là em không thể mô phỏng PWM trên Protesus được bang máy hiển thị sóng
    Cảm ơn các anh và các ban!!!!!!!!!!!!!
    Đây là chuơng trình em tham khảo trên mạng có sủa đổi nhưng không chạy mong mọi người giúp đỡ !
    #include <16f877A.h>
    #include <def_877A.h>
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=20000000)

    //#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
    #use fast_io (a)
    #use fast_io (B)
    #use fast_io (c)
    #use fast_io (d)
    #use fast_io (e)
    /****************************************
    * CONSTANTS - HANG SO*/

    #define SENSOR PORTD
    #define MOTOR_LEFT_DIR RC0
    #define MOTOR_LEFT_PWM RC1
    #define MOTOR_RIGHT_PWM RC2
    #define MOTOR_RIGHT_DIR RC3
    //- CAC HAM SU DUNG TRONG CHUONG TRINH
    void left_motor_forward();
    void right_motor_forward();
    void left_motor_reverse();
    void right_motor_reverse();
    void left_motor_stop();
    void right_motor_stop();
    void motor_stop();
    void speed (signed int left_motor_speed, signed int right_motor_speed);


    ///////////////////////////////////////////////////////////
    //CAC HAM DIEU KHIEN TOC DO DONG CO
    void left_motor_forward(int value)
    {
    MOTOR_LEFT_DIR=1;
    setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
    setup_ccp2(CCP_PWM);
    set_pwm2_duty(value);
    }

    void right_motor_forward(int value)
    {
    MOTOR_RIGHT_DIR=1;
    setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
    setup_ccp1(CCP_PWM);
    set_pwm1_duty(value);
    }

    void left_motor_reverse(int value)
    {
    MOTOR_LEFT_DIR=0;
    setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
    setup_ccp2(CCP_PWM);
    set_pwm2_duty(value);
    }

    void right_motor_reverse(int value)
    {
    MOTOR_RIGHT_DIR=0;
    setup_timer_2(T2_DIV_BY_4,124,1); // Dieu xung 10kHz
    setup_ccp1(CCP_PWM);
    set_pwm1_duty(value);
    }

    void left_motor_stop()
    {
    setup_ccp1(CCP_OFF);
    }

    void right_motor_stop()
    {
    setup_ccp1(CCP_OFF);
    }


    void motor_stop()
    {
    left_motor_stop();
    right_motor_stop();
    }


    //HAM XUAT TOC DO 2 DONG CO: Left motor: -100 - 100 , Right motor: -100 - 100
    // 0:Stop,100:FORWARD 100%,-100:Reverse 100%
    //CAC HAM HO TRO SPEED
    void speed (signed int left_motor_speed, signed int right_motor_speed)
    {
    int left_pwm_value=0,right_pwm_value=0;
    /* Left motor */
    if( left_motor_speed >= 0 )
    {
    left_pwm_value = 1.25*left_motor_speed; // (125*left_motor_speed/100)
    left_motor_forward(left_pwm_value);
    }
    else
    {
    left_motor_speed = -left_motor_speed;
    left_pwm_value = 1.25*left_motor_speed; // (125*left_motor_speed/100)
    left_motor_reverse(left_pwm_value);
    }

    /* Right motor */
    if( right_motor_speed >= 0 )
    {
    right_pwm_value = 1.25*right_motor_speed; // (125*left_motor_speed/100)
    right_motor_forward(right_pwm_value);
    }
    else
    {
    right_motor_speed = -right_motor_speed;
    right_pwm_value = 1.25*right_motor_speed; // (125*left_motor_speed/100)
    right_motor_reverse(right_pwm_value);
    }
    }
    ///////////////////////////////////////
    //MAIN FUNCTION - CHUONG TRINH CHINH
    /* CHUONG TRÌNH CHÍNH */
    void main ()
    {
    TRISC=0x00; // PORTC là ngõ ra ( d?ng co)
    TRISD=0x00; // PORTD là ngõ vào (c?m bi?n quang)


    while(1)
    {
    switch (SENSOR)
    {

    case 0b00011000:
    speed(100,100);
    break;
    case 0b00001100:
    speed(90,80);

    break;
    case 0b00000110:
    speed(70,80);

    break;
    case 0b00000011:
    speed(60,70);

    break;
    case 0b00000001:
    speed(50,60);

    break;
    case 0b00110000:
    speed(80,90);

    break;
    case 0b01100000:
    speed(70,80);

    break;
    case 0b11000000:
    speed(60,70);

    break;
    case 0b10000000:
    speed(50,60);

    break;
    }
    }
    }


  • #2
    Nếu bạn sử dụng chương trình trên thì bạn chỉ được duy nhất một công việc đó là điều xung, trong khi đó còn nhiều những việc khác mà bạn cần phải làm đối với một robo dò đường tự động như: đếm line, ngắt..., vậy nên cần thiết bạn phải sửa đổi chương trình này. Theo tôi, bạn có thể đưa đoạn code phát hiện mức lệch của mắt dò line và đoạn code đếm vạch ngang vào timer0, cứ sau 1ms thì kiểm tra một lần bằng cách sử dụng ngắt timer0. Chúc thành công!

    Comment


    • #3
      Để dò đường cho robot cần phải gắn 8 sensor hồng ngoại.Giả sử trạng thái 43 ( như hình minh họa) là cho đi thẳng thì các trường hợp khác ( lệch trái_phải) bạn xem trên hình.Để đếm vạch ( tức là đi qua vạch ngang) thì cả 8 sensor này đều báo.Nhiệu vụ chính là thu thập thông tin từ sensor này để điều khiển motor chạy nhanh hay chậm bằng cách băm xung ra 2 chân CCP1 và CCP2 ( tương đương chân 17 và 16 của Pic)dĩ nhiên 2 chân này bạn phải nối ra với cầu H.
      Click image for larger version

Name:	Untitled.png
Views:	1
Size:	21.3 KB
ID:	1346317
      Quang Nhat
      ---------------------------------------
      Yahoo :quangnhat85ls
      Mail :
      Nhận thiết kế và ép nhựa cho đồ điện tử

      Comment


      • #4
        như vậy hàm speed của bạn là đưa giá trị độ rộng xung ra rồi thì phải.Còn không mô phỏng được thì bạn nên up toàn bộ thư mục bạn làm lên thì mới chỉnh sửa nhanh được...
        Quang Nhat
        ---------------------------------------
        Yahoo :quangnhat85ls
        Mail :
        Nhận thiết kế và ép nhựa cho đồ điện tử

        Comment


        • #5
          Mình dùng 4 đèn dò vạch_4 đèn đếm vạch và dừng.


          Add: 97 Quán Nam - Lê Chân - Hải Phòng.
          Tel: 031 518648 Phone: 0904 283 505

          Comment


          • #6
            Nguyên văn bởi hoangdai Xem bài viết
            Mình dùng 4 đèn dò vạch_4 đèn đếm vạch và dừng.
            Cũng 8 con led , tại sao k dùng cả 8 để dò , mượt hơn . Còn 4 con ngoài cùng (mỗi bên 2 con) để đếm vạch .

            Mỗi lần qua vạch , k phải cứ 4 con nhận , roy tắt là ta đếm lên 1 . Mấy u cần kiểm tra liên tục trong 1ms việc sensor nhận vạch ngang . Nếu đúng trong 1ms , sensor vẫn liên tục báo về có vạch ngang , thì ta tăng biến đếm . Còn nếu (giả sử )0.7ms thì đột nhiên tắt , rồi nhận lại ... thì xem như đó là nhiễu .

            Comment


            • #7
              Mình muốn dừng chính xác bằng 2 báng sau và quay nó dễ hơn_Mượt hay ko ko phải là do 8 cái thẳng hàng đâu_Mà là do bố trí đèn sao cho lệch ít nhất cũng phải phát hiện ra thì sẽ mượt đc ngay.


              Add: 97 Quán Nam - Lê Chân - Hải Phòng.
              Tel: 031 518648 Phone: 0904 283 505

              Comment


              • #8
                bạn có thể cho mình xin code dò đường bằng encoder được ko ? gmail của mình là :duc.thao.humg@gmail.com .thank bạn !

                Comment


                • #9
                  Mình ko dùng encoder để dò đường.


                  Add: 97 Quán Nam - Lê Chân - Hải Phòng.
                  Tel: 031 518648 Phone: 0904 283 505

                  Comment


                  • #10
                    [QUOTE=hoangdai;321432]Mình ko dùng encoder để dò đường


                    vậy bạn có thể cho t xin bài code dò đường dùng sensor được ko .cả mạch nguyên lí thì tốt .thank bạn .gmail của mình là duc.thao.humg@gmail.com

                    Comment


                    • #11
                      mình cũng đang làm đề tài này. ai có cho mình xin với nhutv92@gmail.com

                      Comment


                      • #12
                        Nguyên văn bởi phongnhan Xem bài viết
                        Chào các anh ! Em đang viết chương trình dò đường cho Píc6f877a Dùng ngôn ngữ C . Nhưng gặp khó khăn quá . Em chưa biết đưa giá trị điều xung ra động cơ như thế nào . Chương trình em tham khảo trên mạng là viết cho động cơ có Encoder . Động cơ của em không dùng encoder.
                        Một vấn đề nữa là em không thể mô phỏng PWM trên Protesus được bang máy hiển thị sóng
                        Cảm ơn các anh và các ban!!!!!!!!!!!!!
                        Đây là chuơng trình em tham khảo trên mạng có sủa đổi nhưng không chạy mong mọi người giúp đỡ !
                        Cơ bản em phải hiểu nguyên lý của việc điều khiển động cơ dò đường, khi đó việc em điều xung sẽ dễ dàng hơn.
                        Hầu hết các các Robot dò đường các bạn làm không sử dụng luật điều chỉnh mềm, mà sử dụng lựt điều chỉnh theo tỉ lệ (Lệch nhiều thì điều khiển nhiều, lệch ít thì điều khiển ít). Do đó việc điều xung sẽ phụ thuộc vào độ lệch (lấy từ mảng nhiều cảm biến phát hiện lệch ít hay nhiều). có thể điều xung làm 4 level: 20-80, 30-70, 40-60, 50-50 (Toff - Ton).

                        Comment


                        • #13
                          Cần j tới tận 8sensor, mình dùng có 6sensor thôi vẫn mượt mà. Quan trọng là bạn phải tìm được cặp xung chuẩn cho hai động cơ, rồi từ đó điều khiển hai động cơ theo hàm xung mình tao ra. cách gá lắp cảm biến cũng quan trọng, nên nhớ là led phải đi trước quang trở

                          Hotmail: tien168bn.utehy@hotmail.com
                          Gmail: tien168bn.utehy@gmail.com

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...
                          X