2016-03-19 2 views
3

Я работаю над проектом «Малина Pi» с двумя ультразвуковыми датчиками. Но теперь у меня проблема с скриптом python. Функция печати() в конце всегда говорит мне 0.0cm расстояние, даже если я парить с моей рукой над датчиком Если я отключаю датчик на штыре 23 другого датчика на выводе 24 работает правильно с правильным расстояниемДва ультразвуковых датчика на малине Pi с скриптом Python

#Bibliotheken einbinden 
import RPi.GPIO as GPIO 
import time 
from pykeyboard import PyKeyboard 

#GPIO Modus (BOARD/BCM) 
GPIO.setmode(GPIO.BCM) 

#GPIO Pins zuweisen 
GPIO_TRIGGER = 18 
GPIO_ECHO_RECHTS = 24 
GPIO_ECHO_LINKS = 23 

#Richtung der GPIO-Pins festlegen (IN/OUT) 
GPIO.setup(GPIO_TRIGGER, GPIO.OUT) 
GPIO.setup(GPIO_ECHO_RECHTS, GPIO.IN) 
GPIO.setup(GPIO_ECHO_LINKS, GPIO.IN) 


#Instanz von PyKeyBoard erstellen 
k = PyKeyboard() 

#Testausagbe 
print("Script startet") 

def distanz(): 
# setze Trigger auf HIGH 
GPIO.output(GPIO_TRIGGER, True) 

# setze Trigger nach 0.01ms auf LOW 
time.sleep(0.00001) 
GPIO.output(GPIO_TRIGGER, False) 

StartZeit_RECHTS = time.time() 
StopZeit_RECHTS = time.time() 

StartZeit_LINKS = time.time() 
    StopZeit_LINKS = time.time() 

# speichere Startzeit des rechten sensors 
while GPIO.input(GPIO_ECHO_RECHTS) == 0 and GPIO.input(GPIO_ECHO_LINKS) == 0: 
    StartZeit_RECHTS = time.time() 
    StartZeit_LINKS = time.time() 


# speichere Ankunftszeit des rechten sensors 
while GPIO.input(GPIO_ECHO_RECHTS) == 1 or GPIO.input(GPIO_ECHO_LINKS) == 1: 
    StopZeit_RECHTS = time.time() 
    StopZeit_LINKS = time.time() 




# Zeit Differenz zwischen Start und Ankunft des rechten sensors 
TimeElapsed_RECHTS = StopZeit_RECHTS - StartZeit_RECHTS 
# mit der Schallgeschwindigkeit (34300 cm/s) multiplizieren 
# und durch 2 teilen, da hin und zurueck 
distanz_RECHTS = (TimeElapsed_RECHTS * 34300)/2 

# Zeit Differenz zwischen Start und Ankunft des linken sensors 
    TimeElapsed_LINKS = StopZeit_LINKS - StartZeit_LINKS 
    # mit der Schallgeschwindigkeit (34300 cm/s) multiplizieren 
    # und durch 2 teilen, da hin und zurueck 
    distanz_LINKS = (TimeElapsed_LINKS * 34300)/2 


if distanz_RECHTS < 12.0 and distanz_RECHTS > 0.0: 
    #Kommando um ein Tab weiter zu springen 
    k.press_key(k.control_l_key) 
    k.tap_key(k.tab_key) 
    k.release_key(k.control_l_key) 
    return distanz_RECHTS 

elif distanz_LINKS < 12.0 and distanz_LINKS > 0.0: 
    #Kommando um ein Tab zurueck zu springen 
      k.press_key(k.control_l_key) 
    k.press_key(k.shift_l_key) 
      k.tap_key(k.tab_key) 
      k.release_key(k.control_l_key) 
    k.release_key(k.shift_l_key) 
      return distanz_LINKS 

else: 
    return 0.0 

if __name__ == '__main__': 
try: 
    while True: 
     abstand = distanz() 
     print ("Gemessene Entfernung = %.1f cm" % abstand) 
     time.sleep(1) 

    # Beim Abbruch durch STRG+C resetten 
except KeyboardInterrupt: 
    print("Messung vom User gestoppt") 
    GPIO.cleanup() 

Это сценарий, над которым я программирую. Я знаю, что что-то не так с петлями while, и я уже много пробовал, но ничего не получилось. Оба датчика должны просто определить, как далеко что-то впереди. Если вы не понимаете что-то в коде, это не важно, это просто немецкий язык.

Надежда кто-то может помочь мне

ответ

0

Я думаю, вы должны разделить второе время цикла. Хорошо расколоть оба петель. Первая петля реагирует, когда оба датчика посылают низкий сигнал. Но второй цикл while выполняется, как только он получает высокий сигнал в любом из датчиков. Он не ждет ответа второго датчика.

Итак, разделите циклы while на четыре, а два - на сигнал отправки, а два - на прием сигнала.