首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HC-SR04超声波传感器的C程序显示的距离不正确

HC-SR04超声波传感器的C程序显示的距离不正确
EN

Stack Overflow用户
提问于 2018-09-06 22:53:10
回答 1查看 890关注 0票数 0

我有一个树莓派零与AlphaBot2,其中有HC-SR04型超声波传感器。使用Python的实现效果很好。我想用C语言实现,因为我需要将它与另一个同样用C语言编写的程序绑定在一起,并且出于优化的原因。我注意到的第一件事是Python代码使用RPi.GPIO库,而在C中我必须使用wiringPi或bcm2835。所以我决定使用wiringPi库。我的程序执行了,但是距离不正确。与我在web上发现的实现不同的是,我使用的是TRIG 22和ECHO 27,因为我的HC-SR04连接在AlphaBot2上。我没有使用2个电阻来连接它到树莓派。当我在传感器前面放置一些障碍物时,即使我把它移到30厘米,我也只能得到3到5厘米。

代码语言:javascript
复制
Distance: 3905724cm
    Distance: 5cm
    Distance: 5cm
    Distance: 5cm
    Distance: 5cm
    Distance: 3cm
    Distance: 3cm
    Distance: 5cm
    Distance: 5cm

下面是我的代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>

#include "ultrasonicClient.h"

#define TRUE (1==1)

// HC-SR04 ultrasonic sensor on AlphaBot2 Pi Zero
#define TRIG 22
#define ECHO 27

static volatile long startTimeUsec;
static volatile long endTimeUsec;
double speedOfSoundMetersPerSecond = 340.29;

void recordPulseLength() {
    startTimeUsec = micros();
    while (digitalRead(ECHO) == HIGH);
    endTimeUsec = micros();
}

void setupUltrasonic() {
    wiringPiSetup();
    pinMode(TRIG, OUTPUT);
    pinMode(ECHO, INPUT);

    // TRIG pin must start LOW
    // Initialize the sensor's trigger pin to low. If we don't pause
    // after setting it to low, sometimes the sensor doesn't work right.
    digitalWrite(TRIG, LOW);
    delay(500); // .5 seconds
}

int getCM() {
    // Send trig pulse
    // Triggering the sensor for 10 microseconds will cause it to send out
    // 8 ultrasonic (40Khz) bursts and listen for the echos.
    digitalWrite(TRIG, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG, LOW);

    int now = micros();
    // Wait for echo start
    // The sensor will raise the echo pin high for the length of time that it took
    // the ultrasonic bursts to travel round trip.
    while (digitalRead(ECHO) == LOW && micros() - now < 30000);
    recordPulseLength();

    long travelTimeUsec = endTimeUsec - startTimeUsec;
    double distanceMeters = 100 * ((travelTimeUsec / 1000000.0) * 340.29) / 2;

    //Wait for echo end
    long startTime = micros();
    while (digitalRead(ECHO) == HIGH);
    long travelTime = micros() - startTime;

    //Get distance in cm
    int distance = travelTime * 34000 / 2;

    return distanceMeters * 100;
}

int runUltrasonicClient() {
    int count = 0;
    setupUltrasonic();

    while (count < 60) {
        printf("Distance: %dcm\n", getCM());
        count++;
        delay(500); // 0.5 second
    }
    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-07 22:29:32

我找到了一段使用bcm2835执行的代码。

代码语言:javascript
复制
static uint64_t cyclePulse(int trigger, int echo) {
    if (!bcm2835_init())
        return 1;

    // Set RPi pin echo to be an input pin
    bcm2835_gpio_fsel(echo, BCM2835_GPIO_FSEL_INPT);
    // Set RPi pin P1-11 to be an output pin
    bcm2835_gpio_fsel(trigger, BCM2835_GPIO_FSEL_OUTP);

    // Declare the unsigned int timer variables to measure pulses
    uint64_t width, begin, start, end;
    int max = 80, check;

    begin = bcm2835_st_read();

    // Emit pulse for 10 microseconds
    bcm2835_gpio_write(trigger, HIGH); // Set trigger state HIGH
    bcm2835_delayMicroseconds(10);  // Wait 10 microseconds
    bcm2835_gpio_write(trigger, LOW);  // Set trigger state LOW

    // Infinite loop until a pulse is received
    while (bcm2835_gpio_lev(echo) == LOW && check < max) {
        start = bcm2835_st_read();
        check = (int) begin - start;
    }

    // Loop and delay for one microsecond until falling edge detected
    while (bcm2835_gpio_lev(echo) == HIGH) {
        bcm2835_delayMicroseconds(1);
    }
    // Record the ending time of the pulse to get the pulse width
    end = bcm2835_st_read();

    // Get the final with of the pulse
    width = end - start;

    //Close the bcm2835 bridge
    bcm2835_close();

    // Return the total width of the returned pulse
    return width;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52206882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档