3

2 つの超音波センサーを使用して Raspberry Pi プロジェクトに取り組んでいます。しかし今、私はpythonスクリプトに問題があります。最後のprint()関数は、センサーの上に手を置いても、常に0.0cmの距離を教えてくれますピン23のセンサーのプラグを抜くと、ピン24の他のセンサーは正しい距離で正しく動作します

#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 ループに何か問題があることはわかっており、すでに多くのことを試しましたが、何も機能しませんでした。どちらのセンサーも、前方に何かがある距離を検出する必要があります。コード内の何かを理解していなくても、それは重要ではありません。それは単なるドイツ語です。

誰かが私を助けてくれることを願っています

4

1 に答える 1

0

2 番目の while ループを分割する必要があると思います。両方の while ループを分割するとよいでしょう。両方のセンサーが低信号を送信すると、最初に while ループが応答します。ただし、2 番目の while ループは、いずれかのセンサーで高信号を受信するとすぐに実行されます。2 番目のセンサーが応答するのを待ちません。

そのため、while ループを 4 つに分割し、信号の送信用に 2 つ、信号の受信用に 2 つ使用します。

于 2016-12-19T19:08:37.660 に答える