1

下面是我在 Intel Galileo Gen2 上运行的代码。我只是想知道为什么当物体真正靠近超声波传感器时,程序会停止并抱怨变量 sig “分配前引用的局部变量‘sig’”?

import mraa
import time

trig = mraa.Gpio(0)
echo = mraa.Gpio(1)

trig.dir(mraa.DIR_OUT)
echo.dir(mraa.DIR_IN)


def distance(measure='cm'):
    trig.write(0)
    time.sleep(0.2)

    trig.write(1)
    time.sleep(0.00001)
    trig.write(0)

    while echo.read() == 0:
            nosig = time.time()

    while echo.read() == 1:
            sig = time.time()

    # et = Elapsed Time
    et = sig - nosig

    if measure == 'cm':
            distance =  et * 17150
    elif measure == 'in':
            distance = et / 0.000148
    else:   
            print('improper choice of measurement!!')
            distance = None

    return distance


while True:
    print(distance('cm'))
4

2 回答 2

2

问题是:

while echo.read() == 0:
        nosig = time.time()

while echo.read() == 1:
        sig = time.time()

如果满足第一个条件并且在读取下一行时尚未返回 1,则 sig 将永远不会获得值。

于 2015-08-30T18:54:01.290 回答
2

您的问题是您的传感器产生的尖峰太短而无法注意到,因为您的采样频率while echo.read()是有限的。

然后这永远不会定义变量sig

要克服这个问题,sig = None请在输入函数时进行定义,然后再对其进行测试None——然后你就知道你不能使用你的测量了。

如果您想以更高的频率进行采样,则需要使用比 Python 更快的语言,例如 C++。

于 2015-08-30T18:59:30.810 回答