اطلاعیه

Collapse
No announcement yet.

کمک در برنامه ربات میکروموس با 3 سنسور التراسونیک

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    کمک در برنامه ربات میکروموس با 3 سنسور التراسونیک

    سلام من برای پروژه کارشناسی یه ربات میکروموس انتخاب کردم که از صفر خوذم شروع کردم به ساختنش ، از سه تا سنسور التراسونیک اسنفاده کردم که می تونید نحوه چینش اونارو در عکسای زیر ببینید ،
    الان مشکل من تو نوشتن برنامه ربات که متاسفانه زیاد رو برنامه نویسی تصلت ندارم ، مشکلم اینجاست که مثلا وقتی شرط می زارم که ربات سمت راستش بازه وارد پیچ بشه در حین چرخش یه لحظه از شرط خارج می شه چون فاصله ها به هم می ریزه من الان به دستوری نیاز دارم که شرطو که چک کرد یک عملیو کامل انجام بده دیگه شرط اولیشو چک نکنه ، برنامه ایم که تا اینجا نوشتم می زارم خواهشا اگه کسی می تونه یکم وقت بزاره کمکم کنه چون تا 3شنبه بیشتر وقت ندارم.
    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.3 Standard
    Automatic Program Generator
    © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date  : 5/19/2014
    Author : IBM-Lenovo
    Company : 
    Comments: 
    
    
    Chip type        : ATmega16A
    Program type      : Application
    AVR Core Clock frequency: 16.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/
    
    #include <mega16a.h>
    #include <alcd.h>
    #include <delay.h>
    #include <stdio.h>
    #include <math.h>
    
    
    #define trig_f PORTD.0
    #define echo_f PIND.1
    #define echo_l PIND.2
    #define trig_l PORTD.3
    #define trig_r PORTC.0
    #define echo_r PINC.1
    #define movf_r PORTB.1
    #define movb_r PORTB.4
    #define movf_l PORTB.5
    #define movb_l PORTB.0
    #define pwm_r OCR1A
    #define pwm_l OCR2 
    int i=0,a=0,sum = 0,x=0,y=0 ;
    unsigned char lcd_buff[16];
    unsigned int d_f,d_l,d_r;
    unsigned long int timer_v;
    float timer_dis,distance,u;
    void turn(void);
    
    
    unsigned int check(void)
    {
        
        timer_v = TCNT0;
        timer_dis=timer_v*0.000064;
        distance=timer_dis*343.0;
        u=(float)distance*50;
        d_f=u;
     
       
       
       
       
       
       lcd_gotoxy(0,0);
       lcd_putsf("distance");
       lcd_gotoxy(0,1);
       sprintf(lcd_buff,"%u cm ",d_f);
       lcd_puts(lcd_buff);
       return d_f;
        
    
      
    
    }
    
    unsigned int check2(void)
    {
    
        timer_v = TCNT0;
        timer_dis=timer_v*0.000064;
        distance=timer_dis*343.0;
        u=(float)distance*50;
        d_r=u;
     
       
       
       
       
       
    
       lcd_gotoxy(6,1);
       sprintf(lcd_buff,"%u cm ",d_r);
       lcd_puts(lcd_buff);
       return d_r;
        
    
      
    
    }
    
    unsigned int check3(void)
    {
    
        timer_v = TCNT0;
        timer_dis=timer_v*0.000064;
        distance=timer_dis*343.0;
        u=(float)distance*50;
        d_l=u;
     
       
       
       
       
       
    
       lcd_gotoxy(12,1);
       sprintf(lcd_buff,"%u cm ",d_l);
       lcd_puts(lcd_buff);
       return d_l;
        
    
      
    
    }
    
    
    void calib(void)
    {
    if(d_r < 12)
       {
       pwm_r = 150;
       pwm_l = 80;
       movf_r = 1;
       movb_r = 0;
       movf_l = 1;
       movb_l = 0;
       
       }
       if(d_r < 10 )
       {
       pwm_r = 90;
       pwm_l = 0;
       movf_r = 1;
       movb_r = 0;
       movf_l = 0;
       movb_l = 0;   
       
       }
       if(d_l < 12)
       {
       
       pwm_r = 80;
       pwm_l = 150;
       movf_r = 1;
       movb_r = 0;
       movf_l = 1;
       movb_l = 0;
       
       }
       
       if(d_l < 10 )
       {
       pwm_l = 90;
       pwm_r = 0;
       movf_l = 1;
       movb_r = 0;
       movf_r = 0;
       movb_l = 0; 
       
       } 
       
    }
    
    void move_f()
    {
    
    pwm_l = 100;
    pwm_r = 100;
    movb_r = 0;
    movf_l = 1;
    movf_r = 1;
    movb_l = 0;
    
    
    }
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTA=0x00;
    DDRA=0xFF;
    
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTB=0x80;
    DDRB=0x37;
    
    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x02;
    DDRC=0x01;
    
    // Port D initialization
    // Func7=Out Func6=In Func5=Out Func4=In Func3=Out Func2=In Func1=In Func0=Out 
    // State7=0 State6=T State5=0 State4=T State3=0 State2=P State1=P State0=0 
    PORTD=0x06;
    DDRD=0xA9;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 15.625 kHz
    // Mode: Fast PWM top=0x00FF
    // OC1A output: Non-Inv.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x81;
    TCCR1B=0x0D;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 15.625 kHz
    // Mode: Fast PWM top=0xFF
    // OC2 output: Non-Inverted PWM
    ASSR=0x00;
    TCCR2=0x6F;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    
    // USART initialization
    // USART disabled
    UCSRB=0x00;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;
    
    // SPI initialization
    // SPI disabled
    SPCR=0x00;
    
    // TWI initialization
    // TWI disabled
    TWCR=0x00;
    
    // Alphanumeric LCD initialization
    // Connections are specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTA Bit 0
    // RD - PORTA Bit 1
    // EN - PORTA Bit 2
    // D4 - PORTA Bit 4
    // D5 - PORTA Bit 5
    // D6 - PORTA Bit 6
    // D7 - PORTA Bit 7
    // Characters/line: 16
    lcd_init(16);
    
    
    
    while (1)
       {
       
       
       
       if(PINB.7 == 1)
       {
       
       lcd_gotoxy(0,0);
       lcd_putsf("Press The Start");
       lcd_gotoxy(5,1);
       lcd_putsf("Button");
       delay_ms(1000);
       lcd_clear();
    
       }
        
       
    
     if(PINB.7 == 0)
     {
    
       
       
       TCCR0 = 0x00;
       TIMSK = 0x00;
       TCNT0 = 0x00;
       trig_f = 1;
       delay_us(20);
       trig_f = 0;
       while(echo_f == 0);
       TCCR0=0x05;
       while(echo_f == 1);
       TCCR0 = 0x00;
       check();
       
       TIMSK = 0x00;
       TCNT0 = 0x00;
       trig_r = 1;
       delay_us(20);
       trig_r = 0;
       while(echo_r == 0);
       TCCR0 = 0x05;
       while(echo_r == 1);
       TCCR0 = 0x00;
       check2();
       
       TIMSK = 0x00;
       TCNT0 = 0x00;
       trig_l = 1;
       delay_us(20);
       trig_l = 0;
       while(echo_l == 0);
       TCCR0 = 0x05;
       while(echo_l == 1);
       TCCR0 = 0x00;
       check3();
       delay_ms(200); 
       
       sum = (d_l + d_r)/2 ; 
       x= (d_l * d_l)+(d_f * d_f);
       x = sqrt(x);
       y = (d_r * d_r)+(d_f * d_f);
       y = sqrt(y);
       
       
       
       if(d_f>30)
       {
       if(d_r<10) i = 0;
       if(d_l<10) i = 1; 
       }
       
       
       if ( d_f >= 25)
       {
       delay_ms(200);
       if(d_f >= 25)
       {
    
       
       move_f();
       
       
        if( d_r > sum+2)
          {
          
          pwm_r = 80;
          pwm_l = 140;
          movb_r = 0;
          movf_l = 1;
          movf_r = 1;
          movb_l = 0;
          
          }
          if(d_l > sum+2)
          {
          pwm_r = 140;
          pwm_l = 80;
          movb_r = 0;
          movf_l = 1;
          movf_r = 1;
          movb_l = 0;
          
          }
          
          if(d_r-6 > 2*d_l)
          {
          pwm_r = 120;
          pwm_l = 190;
          movb_r = 1;
          movf_l = 1;
          movf_r = 0;
          movb_l = 0;
          delay_ms(600);
          move_f();
          delay_ms(800);
          
          }
          
    
           
       
       
       }
       }      
       
       
       
         
    
        
       
    
    
       
       if( d_f < 25)
       {
       delay_ms(200);
       if( d_f < 25)
       {
       
    
       
    //    if( d_r > sum+2)
    //      {
    //      
    //      pwm_r = 80;
    //      pwm_l = 140;
    //      movb_r = 0;
    //      movf_l = 1;
    //      movf_r = 1;
    //      movb_l = 0;
    //      
    //      }
    //      if(d_l > sum+2)
    //      {
    //      pwm_r = 140;
    //      pwm_l = 80;
    //      movb_r = 0;
    //      movf_l = 1;
    //      movf_r = 1;
    //      movb_l = 0;
    //      
    //      }
    //   
    //   
    //         if(d_r<8||d_l<8)
    //   {
    //   if(d_l<8)
    //   {
    //   pwm_l = 100;
    //   pwm_r = 0;
    //   movb_r = 0;
    //   movf_l = 1;
    //   movf_r = 0;
    //   movb_l = 0;
    //   }
    //   if(d_r<8)
    //   {
    //   pwm_l = 0;
    //   pwm_r = 100;
    //   movb_r = 0;
    //   movf_l = 0;
    //   movf_r = 1;
    //   movb_l = 0;
    //   }
    //   
    //   
    //   }
    
       
       
       switch (i)
       {
       
       case 0 : 
       if(d_l - d_r >= 2 || d_r - d_l >= 2)
       {
       
       pwm_l = 160;
       pwm_r = 180;
       movb_r = 0;
       movf_l = 0;
       movf_r = 1;
       movb_l = 1;
       };
       break;
       case 1 :
       if(d_l - d_r >= 2 || d_r - d_l >= 2)
       {
       
       pwm_l = 180;
       pwm_r = 160;
       movb_r = 1;
       movf_l = 1;
       movf_r = 0;
       movb_l = 0;
       }; 
       break;
       }
       } 
       }
       
    
       
       
       
       
    }
     
       
       
    
        
       
    
       }
       
       
       
       
    
    }




    #2
    پاسخ : کمک در برنامه ربات میکروموس با 3 سنسور التراسونیک

    والا من زیاد سی بلد نیستم ولی اگه بیسک بود می تونستم کمک کنم
    ولی همین قدر بهت بگم که شما باید یه لحقه و زیر مجموعه ایجاد کنید
    زیر مجموعه ی اول راست و دومی چپ
    و دستورات حرکتی است و چپ رو تو اون ها قرار بدید
    تو حلقه
    دستورات حرکتی جلو
    اگه التراسونیک راست بود برو به زیر مجومه راست
    اگه التراسونیک چپ بود برو به زیر مجموعه چپ
    و داخل زیر مجموعه راست
    دستورات حرکت راست
    .......
    .....
    ....
    اگه التراسونیک جلو بود پرش که به حلقه اصلی
    و داخل زیر مجموعه چپ
    دستورات حرکت چپ
    .......
    .....
    ....
    اگه التراسونیک جلو بود پرش که به حلقه اصلی

    دیگه زحمت تبدیل حرف ها ی ما به سی با خودت :mrgreen:
    آدلان پایا متخصص در حوضه ربات های پرنده
    https://adlanpaya.ir/

    دیدگاه


      #3
      پاسخ : کمک در برنامه ربات میکروموس با 3 سنسور التراسونیک

      نوشته اصلی توسط avr68
      والا من زیاد سی بلد نیستم ولی اگه بیسک بود می تونستم کمک کنم
      ولی همین قدر بهت بگم که شما باید یه لحقه و زیر مجموعه ایجاد کنید
      زیر مجموعه ی اول راست و دومی چپ
      و دستورات حرکتی است و چپ رو تو اون ها قرار بدید
      تو حلقه
      دستورات حرکتی جلو
      اگه التراسونیک راست بود برو به زیر مجومه راست
      اگه التراسونیک چپ بود برو به زیر مجموعه چپ
      و داخل زیر مجموعه راست
      دستورات حرکت راست
      .......
      .....
      ....
      اگه التراسونیک جلو بود پرش که به حلقه اصلی
      و داخل زیر مجموعه چپ
      دستورات حرکت چپ
      .......
      .....
      ....
      اگه التراسونیک جلو بود پرش که به حلقه اصلی

      دیگه زحمت تبدیل حرف ها ی ما به سی با خودت :mrgreen:
      مرسی ولی مشکل من همین اگه است چون من می خوام بگم مثلا اگه سمت راست بیشتر از 25cm بود یعنی بازه و باید دور بزنه ولی وقتی می نویسم
      (if(d_r >25 هنگامه چرخش فاضله ی راست بهم می ریزه مثلا یه لحظه می شه 100cm چون التراسونیک تا زاویه 45 درجه با سطح اندازه ی درست می ده دیگه ربات میره جلو همهچی بهم می ربزه .

      دیدگاه


        #4
        پاسخ : کمک در برنامه ربات میکروموس با 3 سنسور التراسونیک

        والا من زیاد متوجه نشدم چی میگی ولی
        باید اول کامل بچرخی بعد التراسونیک رو چک کنید
        آدلان پایا متخصص در حوضه ربات های پرنده
        https://adlanpaya.ir/

        دیدگاه


          #5
          پاسخ : کمک در برنامه ربات میکروموس با 3 سنسور التراسونیک

          نوشته اصلی توسط avr68
          والا من زیاد متوجه نشدم چی میگی ولی
          باید اول کامل بچرخی بعد التراسونیک رو چک کنید
          الان توی C من برنامم توی یه حلقه کلی دائم دارن فاصله ها چک می شن نمی دونم چجوری چک کنم بد وقنی داره می چرخه بگم دیگه چک نکن تا چرخش کامل بشه .

          دیدگاه


            #6
            پاسخ : کمک در برنامه ربات میکروموس با 3 سنسور التراسونیک

            اره دقیقا
            امیدوارم کمکم مفید بوده باشه
            آدلان پایا متخصص در حوضه ربات های پرنده
            https://adlanpaya.ir/

            دیدگاه


              #7
              پاسخ : کمک در برنامه ربات میکروموس با 3 سنسور التراسونیک

              اگه کسی که c بلده یه نگاه به برنامم بندازه و راهنمایی کنه خیلی ممنون میشم.

              دیدگاه


                #8
                پاسخ : کمک در برنامه ربات میکروموس با 3 سنسور التراسونیک

                سلام دوست عزیز فکر کنم اگه یک متغییر بیت تعریف کنی که تا زمانی که در روتین گردش هست و تموم نشده از حلقه خارج نشه بعد که گردش تموم شد بیت و دوباره مقدار بدی تا برنامه جریان پیدا کنه .موفق باشی/

                دیدگاه


                  #9
                  پاسخ : کمک در برنامه ربات میکروموس با 3 سنسور التراسونیک

                  سلام.

                  مشکلتون یه مورد عادیه و با حرف درست نمیشه. باید خودتون دست به کار بشید. مثلا چند جا delay اضافه کنید یا مثلا یک سری شرط دیگه بنویسید.

                  کلا من مخالفم که برنامه میکروموس را اینطوری بنویسید. اگه می خواید درست و حسابی باشه باید حرکات ربات به صورت خانه به خانه باشه. یعنی از یه خونه بره تو خونه دیگه و اونجا تصمیم بگیره. اینطوری جا برای الگوریتم نویسی هم باز میشه.

                  دیدگاه

                  لطفا صبر کنید...
                  X