Riešenia od užívateľov

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

Táto téma obsahuje 2 odpovede, má 3 hlasy, a bola naposledy aktualizovaná používateľom  kenshin pred 1 rokom, 4 mesiacmi.

  • Autor
    Príspevky
  • #407

    YrobotZ
    Keymaster

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

  • #438

    Martin Piala
    Účastník

    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

    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++

Musíte byť prihlásený any ste mohli odpovedať na túto tému