2015-08-30 76 views
1

以下是我在英特爾Galileo Gen2上運行的代碼。我只是想知道爲什麼當物體接近超聲波傳感器時,程序停止並抱怨變量sig「本地變量」sig在分配之前引用「?距離小於4cm時伽利略和超聲波錯誤

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

回答

2

您的問題是由您的傳感器產生的尖峯太短而無法察覺,因爲您的while echo.read()的採樣頻率有限。

然後從未定義變量sig

爲了克服這個問題,在進入功能時定義sig = None,再後來它被None測試 - 那麼你知道你不能使用你的測量。

如果您希望以更高的頻率進行採樣,則需要使用比Python更快的語言,例如, C++。

+0

非常感謝您的理解:) – Jedani

+0

如果回答您的問題,請將其標記爲如此。謝謝 :) – deets

2

的問題是:

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

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

如果第一個條件得到滿足,並沒有下一行被讀取,然後SIG將永遠不會得到一個值的時間恢復爲1。

+0

我同意史蒂夫..這是超聲波傳感器數據表http://www.micropik.com/PDF/HCSR04.pdf 它說最小距離是2釐米! – Jedani

+0

@Jedan看到我的答案 - 你的採樣率太低。 – deets