gpt4 book ai didi

c - HC-SR04 树莓派

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:33 25 4
gpt4 key购买 nike

我有 raspberry pi b,我正在尝试用 C 编写代码,这将允许我使用 HC-SR04 Ultrasonic Ranging Module .我使用 bcm2835 库来控制 GPIO 引脚。我已经按照this website连接了.这是我的尝试:

# 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. 即使指向很远的地方,循环也几乎立即完成,导致两次 time() 调用的值完全相同。这可能是由于我获取当前时间的糟糕方法,但我不确定。

我很确定我在这里遗漏了一些明显的东西,但我需要帮助才能找到它。

最佳答案

编辑:更好的解决方案是使用 GPIO 中断来计时回声间隔

一个建议(必须是评论,但我没有足够的声誉)

使用 gettimeofday() 而不是 time() —— 它提供了更高的时间分辨率。

此外,我将以这种方式更改 while 循环:

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);

关于c - HC-SR04 树莓派,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31413593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com