Bogusław Kempny

Ultradźwiękowy pomiar odległości

×
Autor English
Początek HC-SR04 LCD Kamera fork() sms strfry() GPIO impulsy Klawiatura Brama GPIO PWM SG90 RFID Grafolog RCP Shutdown Temperatura ....











Inicjalizacja wiringPI:

  if (wiringPiSetup () == -1)
  exit (1) ;

Programujemy ECHOPIN jako wejściowy, TRIGPIN jako wyjściowy.
ECHOPIN będzie jednak robił coś więcej niż zwykle. Po zmianie stanu sygnału na nim zostanie wygenerowane przerwanie, wykonany zostanie kod w funkcji int_impuls.


    pinMode (ECHOPIN, INPUT) ;
    wiringPiISR (ECHOPIN, INT_EDGE_BOTH, &int_impuls);
    pinMode (TRIGPIN, OUTPUT) ;

Wystarczy w funkcji int_impuls zapamiętać czas, kiedy sygnał stał się jedynką i czas, kiedy spadł do zera, aby w prosty sposób wyliczyć czas trwania impulsu Echo.


void int_impuls(void) {
      if (digitalRead (ECHOPIN) == 1)
       {
clock_gettime(CLOCK_REALTIME, &tim);
       }
      else 
       {
clock_gettime(CLOCK_REALTIME, &tim2);
        impuls=0;
       }
}

Zanim zaczniemy pomiar, jeszcze jedna uwaga. Jeśli proces dostanie przerwanie, sleep (i parę innych funkcji) nie wznowi działania po jego obsłużeniu.
Sleep 10 sekund może trwać sekundę, dlatego w naszym programie użyjemy własnej funkcji:


void Delay(int microsec)
{

 tim3.tv_sec = 0;
 tim3.tv_nsec = microsec * 1000;
     while(nanosleep(&tim3,&tim3)==-1)
          continue;
}