Laserlichtschranke simpel auslesen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Toastgott
User
Beiträge: 3
Registriert: Mittwoch 10. Juni 2020, 14:39

Guten Tag ich bin neu in diesem Forum und habe mich heute extra wegen einem Problem bei dem ich hilfe benötige angemeldet.

Meine Skills sind eher noch im Anfängerbereich einzuordnen was Python angeht, bin aber nicht vollständig programmier unerfahren.

Nun zu meinem Problem:

Ich versuche an meinem Raspberry Pi 3 2 Laserlichtschranken im laufendem programm so auszulesen das ich quasi einfach nur den zustand abfrage, soll heissen ich habe ein bestehendes programm was in einer while schleife läuft und irgwas tut. nun möchte ich in jedem schleifen umlauf nacheinander prüfen ob schleife 1 offen oder geschlossen ist und entsprechende maßnahmen für einen zustand treffen in meinem beispiel will ich prüfen ob s1(schleife1) geschlossen ist und dann weitere operationen vornehmen und das gleiche im anschluss mit s2(schleife2).

im meinem naiven kopf sieht das in etwa so aus.

while 1:
if s1 = 1:
...
if s2 = 1:
...

Module und laser sind die gleichen wie von dieser Seite:
https://tutorials-raspberrypi.de/raspbe ... distanzen/

so wie in dem beispiel kann ich es aber nicht machen weil hier permanent in einer while das hauptprogramm quasi unterbrochen wird und bei mir ist es wichtig das ein schleifenumlauf des hauptprogramms 1 Sekunde ist.

für ideen oder beispiele währe ich echt mega dankbar.

Kuss schonmal im vorraus ;P
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Jedes GPIO Framework (empfohlen wird dieser Tage gpiozero) besitzt die Faehigkeit, Rueckruffunktionen zur Ereignisbehandlung anzugeben. Damit kannst du die jeweiligen Ereignisse der Lichtschranken in eine Queue stopfen, und in deiner Hauptschleife abfragen, ob und was in der Queue so drin steckt. Eine Suche hier im Forum sollte da ausreichend Hinweise liefern. Ich wuerde aber via Google suchen. PHP BB Forumssuche selbst ist eher mau.
Benutzeravatar
__blackjack__
User
Beiträge: 13113
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Toastgott: Was ist denn jetzt das konkrete Problem oder die konkrete Frage?

Zu dem was im Kopf schon existiert: Python hat einen Typ für Wahrheitswerte (`bool`) mit den Werten `True` und `False`. Da sollte man keine Zahlen für missbrauchen. Wird in dem Beispiel in dem Blog ja richtig gemacht.

Der Vergleichsoperator in Python lautet ``==``. ``=`` ist für Zuweisungen.

An der Stelle wo `s1` und `s2` stehen muss halt der entsprechende Funktionsaufruf hin um den Zustand von einem Pin abzufragen. Das Ergebnis vergleicht man nicht mit einem Wert, sondern verwendet das direkt als Bedingung. Oder man verwendet ``not`` wenn man das Gegenteil testen will.

Vor der Schleife fehlt noch der Setup-Kram, und man sollte sicherstellen, das am Programmende `GPIO.cleanup()` aufgerufen wird. Dann kann man sich auch die Deaktivierung von Warnungen sparen, wie fälschlicherweise im Code vom Blog zu sehen ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Toastgott
User
Beiträge: 3
Registriert: Mittwoch 10. Juni 2020, 14:39

@_Blackjack_
mein Problem ist simpel ausgedrückt das ich es nicht aus eigener kraft schaffe es zu programmieren und ich mir erhofft habe das mir hier jemand mit Codebeispielen unter die Arme greift haha
Toastgott
User
Beiträge: 3
Registriert: Mittwoch 10. Juni 2020, 14:39

Hallo zusammen ich konnte das Problem lösen juhu, die Antworten haben mir indirekt geholfen der Tipp mit dem GPIOzero hat mich zu einem einsteiger tutorial gebracht:

https://tutorials-raspberrypi.de/raspbe ... ng-lernen/

aber kurz gefasst war der befehl den ich gesucht habe: "GPIO.input(PORT)"
hier noch der code für andere zum ausprobieren:

Code: Alles auswählen

import RPi.GPIO as GPIO
import time

s1 = 23 #Lichtschrankenport 1 GPIO 23
s2 = 22 #Lichtschrankenport 2 GPIO 22

GPIO.setmode(GPIO.BCM)

#beide Ports als GPIO eingänge eingerichtet
GPIO.setup(s1, GPIO.IN)
GPIO.setup(s2, GPIO.IN)
#endlosschleife für wiederholte abfrage der eingänge
while 1:
    print("s1")
    print(GPIO.input(s1)) #auslesen des Lichtschrankenports 1
    print("s2")
    print(GPIO.input(s2)) #auslesen des Lichtschrankenports 2
    print("__________")
    time.sleep(1.0)       #1 Sekunde warten
Ich hoffe falls in zukunft jemand vor dem selben Problem steht das ich hiermit weiterhelfen konnte :wink:
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist nicht gpiozero, und das ist auch keine geeignete Loesung, ausser es ist garantiert, dass du niemals Ausloesungen hast die unter einer Sekunde lang sind.
Benutzeravatar
__blackjack__
User
Beiträge: 13113
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Toastgott: Anmerkungen zum Quelltext:

Ich schrob doch extra schon, dass es Wahrheitswerte gibt und man dafür keine Zahlen missbrauchen sollte.

``as`` bei Importen ist zum umbenennen gedacht, `GPIO` wird aber gar nicht umbenannt.

Die Kommentare sind alle überflüssig oder könnten es sein, wenn man nicht so schlechte Namen wie `s1` und `s2` verwenden würde. Die Kommentare die nichts mit schlechten Namen zu tun haben, sagen nur das was da ganz offensichtlich bereits als Code steht.

Konstanten werden in Python KOMPLETT_GROSS geschrieben.

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

`GPIO.setup()` kann man mehr als einen Pin übergeben.

Das man auf jeden Fall vor dem Programmende `GPIO.cleanup()` aufrufen sollte, hatte ich auch schon geschrieben.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import time

from RPi import GPIO

PHOTO_SENSOR_A_PIN = 23
PHOTO_SENSOR_B_PIN = 22


def main():
    try:
        GPIO.setmode(GPIO.BCM)

        GPIO.setup([PHOTO_SENSOR_A_PIN, PHOTO_SENSOR_B_PIN], GPIO.IN)
        while True:
            print("PHOTO_SENSOR_A_PIN")
            print(GPIO.input(PHOTO_SENSOR_A_PIN))
            print("PHOTO_SENSOR_B_PIN")
            print(GPIO.input(PHOTO_SENSOR_B_PIN))
            print("__________")
            time.sleep(1.0)
    finally:
        GPIO.cleanup()


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten