Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

GP2Y0D340K SHARP podczerwony czujnik zblizeniowy

14 Lis 2009 22:50 2444 6
  • Poziom 11  
    Witam. Mam problem z GP2Y0D340K. Gdy łącze go do uC z ustawionym portem jako wejście wspomniany GP2Y0D340K po podłączeniu pokazuje głupoty, tzn nie można dokończy nawet inicjacji pozostałych peryferiów. W zasadzie zawsze na wyjściu czujnika prawie zawsze panuje stan niski, chociaż raz się zdarzyło , że na dodatkowej przedłużce kabla wszystko działało jak należy ale już tego nie udało mi się powtórzyć. Oczywiście rezystor i kondensator podłączone jak w dokumentacji GP2Y0D340K. Proszę was o pomoc co z tym fantem zrobić.

    Pozdrawiam Paweł.
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 27  
    Podłącz może go "na sucho" tzn. zasil go, podłącz zasilanie, kondensator, rezystor, a na wyjściu daj diodę. Po prostu sprawdź czy działa. Być może go uszkodziłeś (zdziwiłbym się, chyba, że był źle podłączony), ale o ile nie zasiliłeś go napięciem ujemnym (odwrotnie) to powinien działać. Sprawdź czy go poprawnie podłączasz.
    Twój opis wskazuje na problem z mikrokontrolerem, programowy albo sprzętowy. Najlepiej pokaż kod i schemat połączeń.

    Przy okazji ja mam pytanie do osób używających tego czujnika: jak zmienić mu zasięg (niby jest "adjustable")? Nawet mu zdjąłem przód, ale niczego nie mogłem poruszyć.
  • Poziom 11  
    Z kodem może byc problem bo pełno bo to fragment drivera do sterownka mini sumo i pelno w nim makr ale to nie ważne , ale zastanawia mnie ta dioda o której piszesz czy ona jest konieczna? Czy ona coś konkretnego daje, mierzyłem na sucho miernikiem bez diody i wszystko gra. Co do kodu to jest to coś w tym stylu:

    Code:

    DDRC&=~(1<<0);
    PORT|=(1<<0);

    if (PINC & (1<<0))// lub z "!"  nie pamietam
    {
    //... cos tam rob
    }
  • Poziom 27  
    Po prostu "kocham" taki zapis :|

    DDR &= 0b11111110; //1 przesunięte o 0 i zanegowane
    przesuwanie o 0 nie ma sensu, bo to nie jest przesuwanie, poza tym używanie przesuwania bitowego do ustawiania portów jest jednym z najbardziej nieczytelnych rozwiązań.
    W każdym razie: powinno działać. Co w takim razie może być źle:
    - wywołujesz przerwanie, które nigdzie nie prowadzi (nie wiem jakiego procka używasz, bo nie podałeś, konfiguracji reszty peryferiów też nie znam)
    - masz włączony Watchdog i procek się po prostu resetuje. Dodaj w pętli głównej programu resetowanie watchdoga, a najlepiej wyłącz go (albo zrób to i to)
    -z diodą chodziło mi o przetestowanie czy czujnik w ogóle działa, jeśli sprawdzałeś miernikiem i działa, to ok
  • Poziom 11  
    Używam atmegi 8, podam moze caly kod, w głównym while-u jest kod ospowiedzialny za sprawdzenie czujnika:
    Code:

    #include <avr/io.h>
    #include <util/delay.h>





    #define DDR_LED DDRD
    #define PORT_LED PORTD
    #define LED 2
    #define LED_INIT DDR_LED|=(1<<LED)
    #define LED_ON PORT_LED|=(1<<LED) 
    #define LED_OFF PORT_LED&=~(1<<LED)





    #define DDR_MOTOR_ENABLE_L DDRB
    #define DDR_MOTOR_ENABLE_R DDRB
    #define PORT_MOTOR_ENABLE_L PORTB
    #define PORT_MOTOR_ENABLE_R PORTB
    #define MOTOR_ENABLE_L 1
    #define MOTOR_ENABLE_R 2
    /*
    #define ENABLE_MOTOR_L PORT_MOTOR_ENABLE_L|=(1<<MOTOR_ENABLE_L)
    #define ENABLE_MOTOR_R PORT_MOTOR_ENABLE_R|=(1<<MOTOR_ENABLE_R)
    #define DISABLE_MOTOR_L PORT_MOTOR_ENABLE_L&=~(1<<MOTOR_ENABLE_L)
    */
    #define DISABLE_MOTOR_R PORT_MOTOR_ENABLE_R&=~(1<<MOTOR_ENABLE_R)
    #define MOTOR_SPEED_L 1
    #define MOTOR_SPEED_R 2


    #define DDR_MOTOR_ROTATE_L_1 DDRD
    #define DDR_MOTOR_ROTATE_L_2 DDRD
    #define DDR_MOTOR_ROTATE_R_1 DDRD
    #define DDR_MOTOR_ROTATE_R_2 DDRD
    #define PORT_MOTOR_ROTATE_L_1 PORTD
    #define PORT_MOTOR_ROTATE_L_2 PORTD
    #define PORT_MOTOR_ROTATE_R_1 PORTD
    #define PORT_MOTOR_ROTATE_R_2 PORTD
    #define MOTOR_ROTATE_L_2 6
    #define MOTOR_ROTATE_L_1 5
    #define MOTOR_ROTATE_R_2 4
    #define MOTOR_ROTATE_R_1 3
    #define ACTIVATE_MOTOR_L_1 PORT_MOTOR_ROTATE_L_1|=(1<<MOTOR_ROTATE_L_1)
    #define ACTIVATE_MOTOR_L_2 PORT_MOTOR_ROTATE_L_2|=(1<<MOTOR_ROTATE_L_2)
    #define ACTIVATE_MOTOR_R_1 PORT_MOTOR_ROTATE_R_1|=(1<<MOTOR_ROTATE_R_1)
    #define ACTIVATE_MOTOR_R_2 PORT_MOTOR_ROTATE_R_2|=(1<<MOTOR_ROTATE_R_2)
    #define DISACTIVATE_MOTOR_L_1 PORT_MOTOR_ROTATE_L_1&=~(1<<MOTOR_ROTATE_L_1)
    #define DISACTIVATE_MOTOR_L_2 PORT_MOTOR_ROTATE_L_2&=~(1<<MOTOR_ROTATE_L_2)
    #define DISACTIVATE_MOTOR_R_1 PORT_MOTOR_ROTATE_R_1&=~(1<<MOTOR_ROTATE_R_1)
    #define DISACTIVATE_MOTOR_R_2 PORT_MOTOR_ROTATE_R_2&=~(1<<MOTOR_ROTATE_R_2)

    #define DDR_START_BUTTON DDRD
    #define PORT_START_BUTTON PORTD
    #define START_BUTTON 0
    #define START ((PIND & (1<<START_BUTTON)))

    #define DDR_DISTANCE_METER_R DDRC
    #define PORT_DISTANCE_METER_R PORTC
    #define DISTANCE_METER_R 5
    #define DDR_DISTANCE_METER_L DDRC
    #define PORT_DISTANCE_METER_L PORTC
    #define DISTANCE_METER_L 4
    #define DISTANCE_R (!(PINC & (1<<DISTANCE_METER_R)))
    #define DISTANCE_L (!(PINC & (1<<DISTANCE_METER_L)))


    void Motor_driver_Init(void)
    {
       DDR_MOTOR_ENABLE_R|=(1<<MOTOR_ENABLE_R);
       DDR_MOTOR_ENABLE_L|=(1<<MOTOR_ENABLE_L);
       
       DDR_MOTOR_ROTATE_R_1|=(1<<MOTOR_ROTATE_R_1);
       DDR_MOTOR_ROTATE_R_2|=(1<<MOTOR_ROTATE_R_2);
       DDR_MOTOR_ROTATE_L_1|=(1<<MOTOR_ROTATE_L_1);
       DDR_MOTOR_ROTATE_L_2|=(1<<MOTOR_ROTATE_L_2);
       
       DISACTIVATE_MOTOR_L_1;
       DISACTIVATE_MOTOR_L_2;
       
       DISACTIVATE_MOTOR_R_1;
       DISACTIVATE_MOTOR_R_2;

       
       
       
       TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
       TCCR1B|=(1<<CS11)|(1<<CS10)|(1<<WGM12);
       
       
       
       


    }

    void Motor(char Motor_direction_R,char Motor_direction_L,char Motor_speed_R,char Motor_speed_L)
    {

       switch (Motor_direction_R)
       {
       case 1:
       ACTIVATE_MOTOR_R_1;
       break;

       case 2:
       ACTIVATE_MOTOR_R_2;
       break;   
       
       default:
       DISACTIVATE_MOTOR_R_1;
       break;
       }

       
       
       
       switch (Motor_direction_L)
       {
       case 1:
       ACTIVATE_MOTOR_L_1;
       break;

       case 2:
       ACTIVATE_MOTOR_L_2;
       break;

       default:
       DISACTIVATE_MOTOR_L_1;
       break;
       }
       
       OCR1A=Motor_speed_L;
       OCR1B=Motor_speed_R;



    }

    void Motor_emergency_STOP(void)
    {
    Motor(0,0,0,0);
    }

    void Start_button_Init(void)
    {
    DDR_START_BUTTON&=~(1<<START_BUTTON);
    PORT_START_BUTTON|=(1<<START_BUTTON);
    }

    void Distance_meter_Init(void)
    {
    DDR_DISTANCE_METER_R&=~(1<<DISTANCE_METER_R);
    DDR_DISTANCE_METER_L&=~(1<<DISTANCE_METER_L);

    PORT_DISTANCE_METER_R|=(1<<DISTANCE_METER_R);
    PORT_DISTANCE_METER_L|=(1<<DISTANCE_METER_L);

    }



    int main(void)
    {


       LED_INIT;
       Motor_driver_Init();
       Start_button_Init();
       Distance_meter_Init();

       Motor(0,0,0,0);   
       LED_OFF;
       
       
          while (START);
       
          LED_ON;   
          _delay_ms(100);
          LED_OFF;
       
       
             while(1)
             {


                if(DISTANCE_L)
                {
                LED_ON;   
                _delay_ms(50);
                LED_OFF;
                _delay_ms(50);
                LED_ON;
                _delay_ms(50);
                LED_OFF;
                }

             }

    }
  • Poziom 27  
    Przed każdym _delay_ms dodaj:
    asm volatile ("WDR"::);
    i zobacz czy będzie lepiej działać.
  • Poziom 11  
    Problem rozwiązany ,powód banalny: spalony port mikroprocesora. Dzięki za zainteresowanie moją sprawą i pomoc.