Tasterabfrage ! Benötige dringend Hilfe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Blendi
User
Beiträge: 1
Registriert: Samstag 18. Juni 2022, 20:57

Hallo,
zunächst ich kenn mich mit Python sehr wenig aus.
Versucht hab ich eine Parkschranke über einen Servomotor zu realisieren.
Dies mach ich über 2 Befehle wo ich die Position abfrage.
Das Problem ist wenn ich die Parkschranke runterfahren will, sollte ein Sensor abgefragt werden.
Dies macht man doch normalerweise über ein „IF Befehl“ falls ich mich nicht täusche oder ?
Ich bekomm das leider einfsch nicht hin und werd auch nicht schlauer :(
Bitte dringend um Lösungen/Hilfe
Danke euch

Das Programm :

import RPi.GPIO as GPIO
import time

servoPIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPIN, GPIO.OUT)

p = GPIO.PWM(servoPIN, 50) # GPIO 18 als PWM mit 50Hz
p.start(2.5) # Initialisierung
try:
while True:

p.ChangeDutyCycle(7.0)
time.sleep(0.5)
p.ChangeDutyCycle(0)
p.stop()




except KeyboardInterrupt:
p.stop()
GPIO.cleanup()
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, das geht mit if. Ich wuerde mal einen Blick in das Tutorial auf python.org werfen, und das durcharbeiten, damit du eine Vorstellung davon bekommst, wie die grundlegenden Anweisungen in Python arbeiten.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Blendi: Anmerkungen zum Quelltext:

Eingerückt wird per Konvention vier Leerzeichen pro Ebene, nicht zwei.

``as`` beim importieren ist zum umbenennen gedacht, `GPIO` wird aber gar nicht umbenannt.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Also `SERVO_PIN` statt `servoPIN`.

Verwende in Namen keine kryptischen Abkürzungen. Einbuchstabige Namen sind selten ausreichend um dem Leser die Bedeutung des Wertes dahinter zu vermitteln.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

`GPIO.cleanup()` sollte nicht nur aufgerufen werden wenn das Programm durch Strg-C abgebrochen wird, sondern grundsätzlich am Ende des Programmablaufs. Das gilt hier auch für das anhalten des Servomotors.

Das in dem Kommentar noch mal die Pin-Nummer steht ist keine gute Idee. Dafür hat man ja die Konstante definiert. Wenn man die mal ändert, sollte man nicht daran denken müssen an anderer Stelle im Programm Kommentare anpassen zu müssen.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import time

from RPi import GPIO

SERVO_PIN = 18


def main():
    try:
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(SERVO_PIN, GPIO.OUT)

        servo = GPIO.PWM(SERVO_PIN, 50)
        servo.start(2.5)
        while True:
            servo.ChangeDutyCycle(7.0)
            time.sleep(0.5)
            servo.ChangeDutyCycle(0)
            servo.stop()

    except KeyboardInterrupt:
        pass
    finally:
        servo.stop()
        GPIO.cleanup()


if __name__ == "__main__":
    main()
Was ist das für ein Sensor? Wie fragt man den ab? Wo genau liegt das Problem dabei?

Ich würde übrigens empfehlen von `RPi.GPIO` auf `gpiozero` umzusteigen. Das ist die modernere und bessere API.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2.
Konstanten schreibt man komplett gross, SERVO_PIN.
`as` ist dazu da, einen importierten Namen umzubenennen, GPIO wird aber gar nicht umbenannt.
`p` ist ein schlechter Variablenname, weil er nichts aussagt.
`cleanup´ muß immer aufgerufen werden, nicht nur bei Ctrl+C.

Code: Alles auswählen

from RPi import GPIO
import time

SERVO_PIN = 18

def initialize():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(SERVO_PIN, GPIO.OUT)

    servo = GPIO.PWM(SERVO_PIN, 50) # GPIO 18 als PWM mit 50Hz
    servo.start(2.5) # Initialisierung
    return servo


def main():
    servo = initialize()
    try:
        while True:
            servo.ChangeDutyCycle(7.0)
            time.sleep(0.5)
            servo.ChangeDutyCycle(0)
    except KeyboardInterrupt:
        pass
    finally:
        servo.stop()
        GPIO.cleanup()

if __name__ == "__main__":
    main()
Jetzt hast Du aber nur eine Endlos-Schleife, ohne irgendwelche Tastenabfrage. Die fehlt bei Dir, so dass auch nichts funktionieren kann.
Antworten