Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

arduino mega 2560, czujnik HC-SR04,Eclipse

Kobison1 12 Dec 2018 22:24 462 10
  • #1
    Kobison1
    Level 4  
    Witam,
    Mam problem napisaniem programu w eclipsie w C. Chciałbym napisać program na arduino mega 2560, w którym po wykryciu przez czujnik ultradźwiekowy przeszkody w odległości 20cm zapala się lampka. Nie wiem dokładnie jak obsłużyć czujnik. Czy muszę stosować przerwania? Mógłby ktoś podesłać przykladowy program obsługujący czujnik?
    Pozdrawiam
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    LChucki
    Level 31  
    Kobison1 wrote:
    Czy muszę stosować przerwania?

    Nie.

    Kobison1 wrote:
    Mógłby ktoś podesłać przykladowy program obsługujący czujnik?

    Wątpię. Jak cos już napisałeś to nie ma problemu aby pomóc, ja nie masz nic, to albo szukaj w sieci gotowca albo próbuj coś napisać.

    Kobison1 wrote:
    napisaniem programu w eclipsie w C

    Czemu Eclipse? W Eclipse debuger działa średnio (przynajmniej tak kiedys było).Czyżby szkoła kardasia? Większość na tymforum, na AVR, pisze w darmowym i dobrym AtmelStudio.
  • #3
    khoam
    Level 41  
    Kobison1 wrote:
    Mógłby ktoś podesłać przykladowy program obsługujący czujnik?


    https://forbot.pl/blog/kurs-arduino-czujnik-odleglosci-hc-sr04-funkcje-id4290
    Trzeba trochę przewinąć tę stronę.
  • #4
    Kobison1
    Level 4  
    khoam nie o to mi chodziło. To jest program napisany w arduino IDE a to nie jest czyste C. :(
  • #5
    BlueDraco
    MCUs specialist
    To napisz, jaki masz problem z napisaniem analogicznego programu w C na podstawie tego z Arduino. Możesz też użyć dowolnej wyszukiwarki w celu znalezienia kodu w C i zaadoptowania go do swoich potrzeb.
    Jeśli podjęcie jakiegokolwiek wysiłku jest dla Ciebie zbyt trudne, proponuję udać się na forum Atnel, gdzie po wygłoszeniu kilku peanów na cześć właściciela zostaniesz obdarowany rozwiązaniem.
  • #7
    khoam
    Level 41  
    Kobison1 wrote:
    To jest program napisany w arduino IDE a to nie jest czyste C.

    Naprawdę? A co to jest "czyste C"? Nie ma czegoś takiego, jak język Arduino. Framework Arduino został napisany w C++, używa kompilatora i linkera C++, ale większość przykładów dla początkujących (w tym ten, co podałem w linku) jest napisane w stylu C i nie ma z tym problemów. Jeżeli nie potrafisz skopiować treści przykładowych kodów do Eclipse, to jest inna klasa problemu.
  • #8
    Kobison1
    Level 4  
    Code:

    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>





    #define HC_TRIG  (1<<PC7)
    #define TRIG_PORT  PORTC
    #define TRIG_DIR  DDRC


    #define HC_ECHO  (1<<PD6)
    #define ECHO_PORT  PORTD
    #define ECHO_DIR  DDRD

     


    volatile uint16_t Timer1;
     
    volatile uint16_t EchoWidth;
    uint16_t dystans;
    volatile uint8_t echo_flag;
    char buf[10];

    void soft_timers_init(void);
    void hc_pomiar(void);


    int main (void) {



    TRIG_DIR |= HC_TRIG;     //wyjscie, stan LO
    ECHO_PORT |= HC_ECHO;    //wyjscie, stan HI



    DDRD |=(1<<PA7);


    soft_timers_init();

    //konfiguracja TIMER1- w trybie ICP

    TCCR1B |= (1<<ICES1);      // zbocze narastające
    TCCR1B|= (1<<CS11);      // preskaler 8
    TIMSK |= (1<<TICIE1);      // zezwolenie na rpzerwanie ICP


    sei();                 //globalne zezwolenie na przerwania

    while(1){

       if(!Timer1){
         if(echo_flag){

          

          dystans=(EchoWidth+29)/58;


          echo_flag=0;
         }

          Timer1=50;
          hc_pomiar();

       }

       






    }


    void hc_pomiar(void){

       TRIG_PORT |= HC_TRIG;      // wystawienie jedynki na TRIG
       _delay_ms(10);         // wymagane 10us stanu wysokiego
       TRIG_PORT &= ~HC_TRIG;      // wystaienie zera na TRIG


    ISR(TIMER1_CAPT_vect) {
       static uint16_t LastCapture;

       if(!(TCCR1B & (1<<ICES1)){
         EchoWidth=ICR1-LastCapture;
         echo_flag=1;
       }
       LastCapture= ICR1;

       TCCR1B^= (1<<ICES1);


    Dodano po 1 [minuty]:

    Stworzyłem takie coś . Tylko w którym miejscu mam umieścić zapalnie lampki ?
  • #9
    LChucki
    Level 31  
    Tak z ciekawości 10ms czy us
    Code:

    _delay_ms(10);         // wymagane 10us stanu wysokiego


    Dodano po 1 [minuty]:

    Kobison1 wrote:
    Tylko w którym miejscu mam umieścić zapalnie lampki ?

    Nigdzie nie widzę przeliczania czasu na odległość.

    Dodano po 1 [minuty]:

    Możesz wyjaśnić co robi ten fragment
    Code:

    Timer1=50;
    hc_pomiar();
  • #10
    Kobison1
    Level 4  
    LHucki:
    1.Tam jest 10ms, moja pomyłka w komentarzu,
    2.Przeliczanie czasu na odległość :
    "dystans=(EchoWidth+29)/58;"
    3. Oznacza to, że podawanie impulsu na czujnik i odbieranie go odbywa się co 500ms.
  • #11
    LChucki
    Level 31  
    Kobison1 wrote:
    "dystans=(EchoWidth+29)/58;"

    Jeśli masz dystans to w czym problem z
    Kobison1 wrote:
    Tylko w którym miejscu mam umieścić zapalnie lampki

    Porównaj dystans z zadana wartością i zapal lub zgaś lampkę.