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











Standardowe pliki nagłówkowe unixa, ale dodatkowo wiringPi.h:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/resource.h>
#include <time.h>
#include <wait.h>
#include <wiringPi.h>

Definiujemy, do których pinów podpięliśmy sygnały Trig i Echo czujnika:

#define TRIGPIN 21
#define ECHOPIN 22

Dwie stałe których użyjemy do walki z zakłóceniami:

#define SERIES 100  //tyle pomiarow
#define SERIES1 5  // tyle najmniejszych i najwiekszych pomiarow odrzucic
                   // jako zaklocenia

Przez tę wartość, według producenta czujnika trzeba podzielić czas trwania sygnału Echo, żeby wyliczyć odległość. Ale prędkość dźwięku w powietrzu zależy od temperatury, w temperaturze 35 ℃ rozchodzi się 11% szybciej, niż przy -25 ℃. Być może wartość tę trzeba będzie w szczególnych przypadkach skorygować:

#define SPEEDDIV 58

Pomijamy definicje zmiennych, są przecież w załączonym programie źródłowym, skupimy się na programie.

int main (void)
{

PID procesu, który uruchomimy przyda się żeby łatwiej włączyć wyświertlanie komunikatów diagnostycznych:

  pid=getpid();
  printf("Start %d\n", pid);fflush(0);

Zwiększamy priorytet naszego procesu. Zwiększy to dokładność pomiaru czasu trwania sygnału Echo. Niewiele i niestety kosztem szybkości innych procesów. Jeśli jednak nasz program do pomiaru odległości jest częścią najważniejszego procesu działającego na naszym Raspberry...

  setpriority(0,0,-20);

Teraz debugging. Chcemy, żeby po wysłaniu do procesu sygnału USR1 zaczął wyświetlać komunikaty diagnostyczne, po wysłaniu USR2 przestał.
A więc kill - USR1 8823 program gada, kill -USR2 8823 przestaje gadać. To 8823 to PID naszego procesu, dlatego wcześniej go odczytaliśmy i wyświetliliśmy.

  signal(SIGUSR1, catch_USR);
  signal(SIGUSR2, catch_USR);

Po otrzymaniu sygnału USR1 lub USR2 wykonana zostanie funkcja catch_USR, która ustawi zmienną debug odpowiednio na 1 lub 0:

void catch_USR(int signal_num)
{
fflush(0);
if(signal_num==SIGUSR1)
debug=1;
if(signal_num==SIGUSR2)
debug=0;
}