Riešenia od užívateľov

Úvod Diskusné Fóra Fórum Riešenia od užívateľov

Ukázať 2 vlákna odpovedí
  • Autor
    Príspevky
    • #407
      YrobotZ
      Keymaster

      Návody a zdrojové kódy vytvorené užívateľmi

    • #438
      Martin Piala
      Účastník (Participant)

      Dobrý deň,
      chcel som si trochu osvojiť použitie ultrazvukového senzoru, ovládanie motorov a použitie tlačítok. Preto som vytvoril pomerne jednoduchý program, v ktorom sa robot vždy “drží” v určitej vzdialenosti od prekážky pred ním. Túto vzdialenosť môžeme meniť pomocou SW2 a SW3. Program funguje tak, že robot si vždy oderia vzdialenosť k objektu pred ním použitím supersonic senzora a na základe toho buď ide dopredu alebo cúva. Ak je v požadovanej vzdialenosti, tak stojí. Na senzor som použil 8-bitový Timer (motory už používali 16-bitový), preto je tam istá nepresnosť pár cm v meraní (cca 4,41 cm).
      Tu je kód 🙂

      #define F_CPU 1000000
      #include <avr/io.h>
      #include <util/delay.h>
      #include <int_def.h>
      
      int Time=0;
      int distance=30;
      int Pressed2=0;
      int Pressed3=0;
      
      void init(void)
      {
          DDRA|=1<<4|1<<5|1<<6;
          DDRB|= 1<<6| 1<<7 | 1<<2 | 1<<3;
          
          PORTB |= (1<<2)|(1<<3);
          
          PORTA|=(1<<5);
          PORTA|=(1<<6);
          
          DDRD = (1<<PD5)|(1<<PD6) | (1<<PD4)|(1<<PD7); //z MOTOR_Tutorial
          PORTD&=~(1<<PD5)|(1<<PD6) | (1<<PD4)|(1<<PD7);
          
          TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM10);
          TCCR1B = (1<<CS11);
          
          OCR1AH = 0;
          OCR1AL = 0;
          
          OCR1BH = 0;
          OCR1BL = 0;
          
          TCCR2|= 1<<CS22|1<<CS21;
          TCNT2=0;
       
      }
      
      void echo(void)
      {
          _delay_ms(60);
          PORTA|=1<<4;
          _delay_us(10);
          PORTA&=~(1<<4);
          while (!(PINA & (1<<PA3)));
          TCNT2 = 0;
          while (PINA & (1<<PA3));
          Time=(256*TCNT2)/58;  /*prescaling 256 (presnosť je preto iba na cca 4,41cm, pretože 16bitový
                                 Timer je použitý na motory*/
          
      }
      
      void motorvpred(int R, int L)
      {
          OCR1AL=L;
          OCR1BL=R;
          PORTD&=~(1<<6);
          PORTD|=1<<7;
      }
      void motorvzad(int R, int L)
      {
          OCR1AL=L;
          OCR1BL=R;
          PORTD&=~(1<<7);
          PORTD|=1<<6;
      }
      
      motorstop()
      {
          OCR1AL=0;
          OCR1BL=0;
      }
      
      void main(void)
      {
          init();
          
          while (1) {
              echo();
              if (Time>(distance+20))
              {
                  PORTA|=(1<<5);
                  PORTA&=~(1<<6);
                  motorvpred(255,255);
              }
              else if (Time>distance)
              {
                  PORTA|=(1<<5);
                  PORTA&=~(1<<6);
                  motorvpred(90,90);
              }
              else if (Time<(distance-10))
              {
                  PORTA|=(1<<5);
                  PORTA&=~(1<<6);
                  motorvzad(90,90);  //dozadu sa nemôže veľmi rozbiehať, pretože si strhne senzory vpredu :D
              }
              else
              {
                  PORTA|=(1<<6);
                  PORTA&=~(1<<5);
                  motorstop();
              }
              if (bit_is_clear(PINB,2)) {
                  if (distance<200) {
                      distance=distance+10;  //zväčšíme vzdialenosť
                  }
                  while (bit_is_clear(PINB,2));
                  _delay_ms(50);
              }
              if (bit_is_clear(PINB,3))
              {
                  if (distance>15) {
                      distance=distance-10;  //zmenšíme vzdialenosť
                  }
                  while (bit_is_clear(PINB,3));
                  _delay_ms(50);
              }
              
          }
          
      }
    • #538
      kenshin
      Účastník (Participant)

      frcnul som na svoj git ukazku ako na yrobota v c++ :

      https://github.com/michalnand/other_projects/tree/master/yrobot_cpp_demo

      treba mat nainstalovane avr-g++

Ukázať 2 vlákna odpovedí
  • Musíte byť prihlásený any ste mohli odpovedať na túto tému