2015-07-14 4 views
1

У меня есть малина pi b, и я пытаюсь написать код в C, который позволит мне использовать HC-SR04 Ultrasonic Ranging Module. Я использовал библиотеку bcm2835 для управления контактами GPIO. Я подключил его в соответствии с this website. Вот моя попытка: естьHC - SR04 raspberry 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; 
} 

Две проблемы:

  1. Мой метод для чтения времени является точным только до 1 сек, - тем не менее, как я искал лучший способ сделать это я нашел два методы и окончательный ответ, который на самом деле лучше (clock_gettime() или gettimeofday()).
  2. Даже при очень большом удалении петли заканчиваются почти мгновенно, что приводит к точному значению как вызовов времени(). Это может быть связано с моей дрянной метод получения текущего времени, но я "не уверен.

Я довольно уверен, что я что-то очевидное здесь отсутствует, но мне нужна помощь в поиске ее.

+0

посланной код не чисто компиляции. вот некоторые из проблем. 1) usleep() требует #include (или аналогичный) заголовочный файл 2) это утверждение: 'printf ("D:% i \ n", delta);' ожидает аргумент 'int', но аргумент 2 равен 'time_t' 3) это утверждение: 'printf ("DISTANCE:% i \ n", distance);' ожидает аргумент 'int', но аргумент 2 равен 'double' – user3629249

+0

опубликованный код не выполняет чисто компиляцию. вот еще несколько проблем:. 1) главный параметр «argc» не используется 2) главный параметр «argv []» не используется. Предложите объявить main через: 'int main (void)' – user3629249

+0

, чтобы получить точную (или, по крайней мере, более точную) синхронизацию, 1) использовать прерывания, управляемые эхо-сигналом. 2) используйте gettimeofday() непосредственно перед передачей и в функции обработчика прерываний. – user3629249

ответ

1

EDIT: Лучшим решением было бы использовать GPIO прервет времени эхо интервал

Одно предложение (должно быть действительно комментарий, но я не хватает репутации)

Использование gettimeofday() вместо time() - обеспечивает большее разрешение в ti мина.

Кроме того, я бы изменить время петли таким образом:

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

Это учебник я сделал на своем блоге, чтобы получить значения из HC-SR04 в C++ на Raspberry Pi!

Вы можете взглянуть на него:

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

В конце концов выглядеть следующим образом:

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

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