Umzug von RPi.gpio nach gpiozero

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo,

    in Anlehnung an meinen gestrigen Thread habe ich mich heute mal daran gemacht meine Scripte zum Auf- und Zusperren einer Tür umzuschreiben.

    Zuerst habe ich alles so weit mir möglich in Funktionen gepackt. Hat problemlos geklappt.

    Danach bin ich umgezogen von Rpi.GPIO nach gpiozero. Zunächst nur mit einem Script, weil ich bei einem Punkt dann doch ein wenig Unterstützung brauche.

    Ich möchte zunächst die Funktion des Scripts erklären:

    zu.py: wird das Script gestartet dreht sich ein Motor so lange bis ein Stopkontakt berührt wird und hält dann an.

    So jedenfalls in der Theorie. Der Motor dreht auf Anhieb. sogar gleich in die richtige Richtung. Leider klappt das mit dem Stopkontakt unter gpiozero aber nicht und ich weiß nicht warum. Ich habe den Stopkontakt als Button genommen, das müsste ja eigentlich richtig sein, oder gibt es da etwas anderes dafür?

    Das alte Script funktioniert, es liegt also keine hardwareseitige Fehlfunktion vor.

    Hier die beiden Scripte zum Vergleichen, das ältere, funktionierende zuerst:

    und hier das neue mit gpiozero:


    Weiter habe ich dann geplant mal auszuprobieren die Scripte zu.py und auf.py in eines zu zusammenzufassen, wie hyle mir gestern vorgeschlagen hat. Aber ich ahne, dass ich auch da Hilfe benötigen werde. Schaun wir mal. Eins nach dem anderen.

  • Go to Best Answer
    • Official Post

    Wenn ich das richtig verstehe, dann anhand Deines Beispiels evtl. so


    Von mir ungetestet!



    Aber ich ahne, dass ich auch da Hilfe benötigen werde.


    So schwer ist das nicht.

    Ebenfalls ungetestet! Aufgerufen wird das dann mit /Pfad/zu/schloss.py auf bzw. /Pfad/zu/schloss.py zu.

  • Wenn ich das richtig verstehe, dann anhand Deines Beispiels evtl. so

    Leider nein, auch hier dreht sich nur der Motor endlos und bei betätigen des Stopschalters ändert sich daran auch nichts.

    Ich hab jetzt mal nachgeschaut, wie ich diesen Stoppschalter überhaupt verbaut habe. Der Schalter ist ungedrückt geschlossen, also "an". Wenn der Schalter gedrückt wird fließt kein Strom mehr. Das ist dann quasi das Signal den Motor zu stoppen.


    Ich hab hier eine recht gute Anleitung gefunden und probiere gerade einfach nur diesen Schalter anzusprechen.

    Aber auch das will einfach nicht funktionieren. Meinem Verständnis nach, wenn der default Zustand des Schalters "an" ist müsste das dann so aussehen:

    Python
    #!/usr/bin/env python3
    from gpiozero import Button
    
    button = Button(17)
    button.wait_for_release()
    print("Schalter betätigt")

    Ich habe das jetzt mit press und release und auch mit dem is_pressed von dir, aber nichts davon funktioniert.

    Wenn ich dieses kleine Programm so starte wie es jetzt ist, dann wird die Printzeile ausgegeben, das Programm beendet ohne dass ich den Schalter berührt habe. Ersetze ich das wait_for_release durch wait_for_press passiert überhaupt nichts auch nicht wenn ich den Schalter betätige.

    • Best Answer
    • Official Post

    wait_for_press() könnte hier tatsächlich am sinnvollsten sein. Vielleicht erstmal ohne Funktion so:




    //Edit

    das Programm beendet ohne dass ich den Schalter berührt habe

    Wie hast Du den verkabelt? Hoffentlich GPIO gegen GND wie hier im Bild zu sehen ist https://gpiozero.readthedocs.i…table/recipes.html#button.

  • Wie hast Du den verkabelt? Hoffentlich GPIO gegen GND wie hier im Bild zu sehen ist https://gpiozero.readthedocs.i…table/recipes.html#button.

    Oops! :daumendreh2: Da war doch was. Nö, ich hab das schon seit Jahren von 3v auf Pin laufen. Der Pi hats bisher überlebt.

    Habs jetzt geändert. Und jetzt funktioniert es auch mit dem Button.

    Das Zuschließ-Script sieht jetzt so aus:

    und aufschließen so:

    Der Code sieht wirklich wesentlich übersichtlicher aus als vorher. Werde mich mal ans zusammenschmeißen beider Scripte wagen, das hast du ja weiter oben wirklich super mit deinem Beispielcode erklärt.


    Was mich allerdings an diesem gpiozero gegenüber dem RPi.GPIO stört ist die längere Zeit die es beim Aufrufen des Scripts bis zum starten des Motors benötigt. Das ist etwa eine Sekunde länger :sleepy: . Das RPi.GPIO reagierte fast sofort. Kann man das noch beschleunigen?


    Trotzdem schon mal Danke für die Lösung mit der falschen Verkabelung!

  • Hallo,


    ich würde deine Logik etwas umdrehen. So wie es jetzt ist, führst du in der 'while'-Schleife immer und immer wieder den Befehl 'motor.forward()' aus.

    Wenn ich das richtig im Kopf habe, dann reicht es ab den Befehl einmal abzusenden und dann läuft der Motor.


    Du kannst ja die Funktion 'zuschliessen' aufrufen und dann den Motor starten. Dann startest du eine Dauerschleife und überwachst den Button in einer 'if'-Abfrage. Wenn der Button gedrückt wird, dann stoppt der Motor. Mit 'break' wird die Dauerschleife verlassen. Damit man die CPU-Auslastung gering hält, baut man in so Schleifen häuft noch ein 'sleep' ein.


    Das würde dann so aussehen:

    Du siehst, jetzt wird durch das 'not' die Bedingung umgedreht (negiert, falls du mal über das Wort stolperst).


    Du hast mit gpiozero die Möglichkeit den Status deines Pins, softwaretechnisch anzupassen. Also wenn der Pin am Pi 'high' ist, kannst du mit 'active_state' den Software-Pin auf 'low' setzen.

    Eventuell geht dass dann so:



    Habe leider keinen Motor hier, um das alles zu testen und hoffe das es funktioniert.

    Zum Schluss noch, du siehst das ich kein 'exit()' benutze. Das braucht man nicht, weil wenn das Programm durch gelaufen ist, dann beendet es sich auch.


    Grüße

    Dennis

    🎧 Mein Auto springt, mein Toaster kocht, es zwickt mich im Genick. Meine Frau ist eingelocht, die Spülmaschine tickt. Meine Telefonapperat brüllt mich seit Tagen an, er ist schon lange abgestellt im Bett liegt Peter Pan. Die Uhr geht falsch, die Haustür singt, mein Spiegel schlägt zurück - Ich werde noch verrückt, was solls ich bin entzückt. Die Badewanne zieht nicht ab ihr glaubt nicht was ich seh' - Sie ist voll Himbeerengelee 🎧

    • Official Post

    Genau! Wie ich im Beitrag #4 schon schrieb wäre wait_for_press() in diesem Fall das Mittel der Wahl. ;)


    Im Hauptskript, in dem Du auch den anderen Kram regelst (RFID-Karten usw.) würde ich when_pressed verwenden und das obige Skript-Beispiel wirklich nur für SSH-Button nutzen. Der Punkt ist die etwas längere Dauer der Initialisierung bei gpiozero.

  • ich würde deine Logik etwas umdrehen. So wie es jetzt ist, führst du in der 'while'-Schleife immer und immer wieder den Befehl 'motor.forward()' aus.

    Wenn ich das richtig im Kopf habe, dann reicht es ab den Befehl einmal abzusenden und dann läuft der Motor.

    Ja, das verstehe ich. Vielleicht ist das auch der Grund, warum der Motor nicht jedesmal sauber stoppt, sonder bereits am Stopper hängt und noch Sekundenbruchteile "nachbrummt"

    Habe beide Scripts ausprobiert.

    Das zweite von dir gibt eine Fehlermeldung aus.

    Ich habe es ein wenig abgewandelt. Den Status wieder rausgenommen und wait_for_press durch wait_for_release ersetzt. Läuft wunderbar und "brummt" nicht mehr.


    Zum Schluss habe ich jetzt auf.py unz zu.py zusammen in eine Datei gepackt wie hyle mir es oben schön als Beispiel gezeigt hat:


    Funktioniert auch super mit den Argumenten.


    Dennis89 du hattest in dem anderen Thread hast du gesagt ich könne dieses Script einfach in mein Hauptprogramm importieren und bräuchte somit kein subprocess mehr. Das scheint mit einem anderen import zu kollidieren und erzeugt eine Fehlermeldung. Weiß nur nicht ob ich das jetzt hier noch mit dran hängen soll oder lieber ein neues Thema dafür aufmachen soll.

  • Das scheint mit einem anderen import zu kollidieren und erzeugt eine Fehlermeldung.

    Habs selbst rausgefunden. Das ist jetzt natürlich irgendwie blöd nach der ganzen Arbeit, aber das importierte RFID aus pirc522 scheint wohl mit RPi.GPIO geschrieben worden zu sein :lol:


    Code
    Traceback (most recent call last):
      File "./nfctuer.py", line 40, in <module>
        rdr = RFID()
      File "/usr/local/lib/python3.7/dist-packages/pi_rc522-2.2.1-py3.7.egg/pirc522/rfid.py", line 88, in __init__
    ValueError: A different mode has already been set!

    Dann hat sich das mit dem Import erstmal erledigt.

    Meine eigentliche Frage wurde beantwortet, mein Problem gelöst.


    Ich danke allen beteiligten für ihre Hilfe!

  • Hallo,


    ich bin jetzt aus deinem letzten Beitrag nicht ganz schlau geworden. Wenn alle Probleme erledigt sind, dann kannst du den Beitrag von mir jetzt einfach ignorieren. Wenn irgendetwas mit dem importieren nicht so funktioniert, wie du es dir gewünscht hast, dann kannst du gerne deine Codes zeigen (hier oder in einem neuen Thema) und eventuell hat jemand eine Idee.


    Grüße

    Dennis

    🎧 Mein Auto springt, mein Toaster kocht, es zwickt mich im Genick. Meine Frau ist eingelocht, die Spülmaschine tickt. Meine Telefonapperat brüllt mich seit Tagen an, er ist schon lange abgestellt im Bett liegt Peter Pan. Die Uhr geht falsch, die Haustür singt, mein Spiegel schlägt zurück - Ich werde noch verrückt, was solls ich bin entzückt. Die Badewanne zieht nicht ab ihr glaubt nicht was ich seh' - Sie ist voll Himbeerengelee 🎧

  • ich bin jetzt aus deinem letzten Beitrag nicht ganz schlau geworden.

    na ja, ich arbeite eben nach und nach die Sachen ab die mir geraten wurden. OK viele davon. Eine war das Ding von dir aus dem anderen, oben verlinkten Thread eben, dass ich ja subprocess  nicht brauche das kann man importieren. Wollte ich halt noch umsetzen. Aber da kam dann diese Fehlermeldung. Da ich das Modul pirc522 nicht umschreiben kann lass ich es jetzt halt mit subprocess. Schönen Restsonntag wünsche ich :)

  • woher hast du das Script vom RFID?

    Ich finde dazu X Scripte. Wäre vllt möglich das Script vom RFID entweder auf gpiozero umzuschreiben oder den Modus vom Rpi.gpio so zu setzen das es da keinen Ärger gibt.

  • woher hast du das Script vom RFID?

    Ich finde dazu X Scripte. Wäre vllt möglich das Script vom RFID entweder auf gpiozero umzuschreiben oder den Modus vom Rpi.gpio so zu setzen das es da keinen Ärger gibt.

    Das RFID bzw. das pirc522 findest du hier: Github


    Ich weiß, dass es etliche Ansätze für den RC522 gibt, ich hab sie alle einige davon durchprobiert. Leider sind die alle schon etwas betagter. Auf meinem alten 2b liefen die noch perfekt, allerdings ist da die ganze Installation auch schon ein paar Jahre alt, da läuft glaube ich noch ein jessie drauf.. Auf einem PiZero mit aktuellem Buster erzeugen die meissten RC522 Scripte, sofern man sie überhaupt zum laufen bringt, eine 100%ige Prozessorauslastung die sich auch nicht durch irgendwelche Sleeps großartig verbessern ließ. Da hatte ich hier auch schon ein Thema zu aufgemacht gehabt. Dieses Pirc522 ist das einzige, dass "normal" läuft. Aber auch hier meine ich mich zu erinnern, dass ich was am Code in einem Script ändern musste (irgendwo im Diskussionsbereich zu finden) um einen Fehler auszuräumen. Außerdem musste ich zum Beschreiben das Write aus einer anderen 522 Installation nehmen, weil das wiederum bei Pirc nicht richtig funktioniert.

    Du siehst, ich hab da ganz schön was zusammengestückelt. Aber das rfid.py jetzt auch noch komplett umzuschreiben traue ich mir auch mit Hilfe nicht zu und ist eigentlich auch unnötig. Es läuft ja alles so wie es soll.