2015-07-14 2 views
1

J'ai framboise pi b et j'essaie d'écrire du code en C qui me permettra d'utiliser le HC-SR04 Ultrasonic Ranging Module. J'ai utilisé la bibliothèque bcm2835 pour contrôler les broches GPIO. Je l'ai connecté selon this website. Voici ma tentative:HC - SR04 framboise pi

# include <bcm2835.h> 
# include <stdio.h> 
# include <time.h> 
# include <stdlib.h> 

# define ECHO RPI_V2_GPIO_P1_03 
# define TRIG RPI_V2_GPIO_P1_05 

int main(int argc, char **argv) { 
if (!bcm2835_init()) 
    return 1; 

bcm2835_gpio_fsel(ECHO, BCM2835_GPIO_FSEL_INPT); 
bcm2835_gpio_fsel(TRIG, BCM2835_GPIO_FSEL_OUTP); 

time_t clockstart = 0; 
time_t clockstop = 0; 

bcm2835_gpio_write(ECHO, LOW); 
delay(2); 

printf("trigger\n"); 

bcm2835_gpio_write(TRIG, HIGH); 
usleep(10); 
bcm2835_gpio_write(TRIG, LOW); 

printf("measure\n"); 


while (bcm2835_gpio_lev(ECHO) == 0) { 
    clockstart = time(NULL); 
} 

printf("B: %i\n", (int)clockstart); 

while (bcm2835_gpio_lev(ECHO) == 1) { 
    clockstop = time(NULL); 
} 

printf("E: %i\n", (int)clockstop); 

time_t delta = clockstop - clockstart; 

printf("D: %i\n", delta); 

double distance = (delta * 340)/2; 

printf("DISTANCE: %i\n", distance); 

bcm2835_close(); 
return 0; 
} 

Deux problèmes existent:

  1. Ma méthode pour le temps de lecture est précise que jusqu'à 1 sec, - mais comme je cherchais une meilleure façon de le faire, j'ai trouvé deux méthodes et pas de réponse définitive dont on est réellement meilleur (clock_gettime() ou gettimeofday()).
  2. Même lorsqu'elles sont pointées très loin, les boucles finissent quasiment instantanément de donner la même valeur aux deux appels time(). Cela pourrait être dû à ma méthode merdique d'obtenir le temps en cours, mais je "ne suis pas sûr.

Je suis sûr que je me manque quelque chose évidente ici, mais je besoin d'aide pour trouver.

+0

le code affiché n'a pas proprement Compile. voici quelques-uns des problèmes. 1) usleep() nécessite le fichier #include (ou similaire) 2) cette instruction: 'printf ("D:% i \ n", delta);' attend un argument 'int' mais l'argument 2 est 'time_t' 3) cette instruction: 'printf ("DISTANCE:% i \ n", distance);' attend un argument 'int' mais l'argument 2 est 'double' – user3629249

+0

le code affiché ne compile pas proprement. voici quelques autres problèmes: 1) le paramètre principal 'argc' n'est pas utilisé 2) le paramètre principal 'argv []' n'est pas utilisé. Suggérer la déclaration via via: 'int main (void)' – user3629249

+0

pour obtenir un timing précis (ou au moins plus précis), 1) utiliser des interruptions, pilotées par la broche d'écho. 2) utilisez gettimeofday() juste avant la transmission et dans la fonction gestionnaire d'interruption. – user3629249

Répondre

1

EDIT: une meilleure solution serait d'utiliser GPIO interrompt en temps l'intervalle d'écho

une suggestion (doit vraiment être un commentaire, mais je n'ai pas assez réputation)

utilisez gettimeofday() au lieu de time() - il fournit une plus grande résolution en ti ming.

En outre, je changerais les boucles while cette façon:

struct timeval start, end; 

while (!bcm2835_gpio_lev(ECHO)); // Although gcc may be smart 
gettimeofday(&start, NULL);  // enough to do this optimisation 
while (bcm2835_gpio_lev(ECHO)); // on its own 
gettimeofday(&end, NULL); 

double delta = (end.tv_sec - start.tv_sec) * 1000.0;  // s to ms 
     delta += (end.tv_usec - start.tv_usec)/1000.0; // us to ms 

printf("D: %f ms\n", delta); 
0

Ceci est un tutoriel j'ai fait sur mon blog, pour obtenir des valeurs de la HC-SR04 en C++ sur Raspberry Pi!

Vous pouvez jeter un coup d'oeil:

https://causeyourestuck.io/2016/04/15/hc-sr04-raspberry-pi-c/

A la fin, il ressemble à ceci:

Sonar sonar; 
sonar.init(trigger, echo); 

while(1){ 
    cout << "Distance is " << sonar.distance(30000) << " cm." << endl; // 30000 is a timeout in microseconds 
}