Python Tastendrücke

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Morgen,

    ich bin von dem Thread "Wie sage ich es in Python ? (Einsteigerfragen)" hierhin gewandert, da der Umfang meiner Frage etwas spezieller in die Materie geht.
    Nun zu meinem Problem:

    Ich habe ein Python Programm, welches über eine Dual-H-Brücke zwei Motoren ansteuert. Im Moment werden diese über einen "Impuls" angeschalten. D.h. Drücke ich Pfeiltaste nach oben fährt er Vorwärts bis ein anderer Befehl (z.B. rechts) kommt. Normalerweise muss man vor jedem Befehl in Python wenn es mit raw.input() etc. gemacht wird ein ENTER Befehl geben. Dies hab ich dann mit dem Keyevent curses.getch() umgangen und das funktioniert auch wunderbar.

    Was ich jetzt gerne hätte ist die Funktion:
    SOLANGE die Pfeiltaste oben gedrückt ist soll er fahren. Wird diese losgelassen hält er an. :)

    Ich habe schon einiges herumgeeiert aber irgendwie komm ich nicht so drauf.

    Nun zu meinem Programmcode:

    Eventuell sollte man das IF durch ein WHILE ersetzen aber es kommt auf das selbe Ergebnis hinaus.


    Liebe Grüße und schonmal vielen Dank :danke_ATDE:

    Neolinga

  • So, dann wollen wir mal ein paar Sachen ausprobieren.

    Als allererstes sollte der stdscr.refresh() Befehl direkt hinter den while Befehl und vor den key = stdscr.getch(), damit Du mit Key immer den aktuellsten stand hast und nicht den von der Runde vorher.

    Jetzt bleibt das Problem, das stdscr.getch() immer auf eine Taste WARTET.
    Also ist die Möglichkeit damit eine Steuerung zu realisieren eigentlich ungeeignet.

    Ich würde das jetzt einfach mal so lösen:

    Jetzt setzt er bei Tastendruck den Motor in Bewegung, wartet 2ms und schaltet ihn wieder aus. Dann gehts zurück zur Abfrage, da die Taste noch gedrückt ist gehts sofort wieder los. Evtl. ruckelt es dann ein bisschen, aber mit der Abfrage sehe ich erstmal keine andere Möglichkeit. :denker:
    Probiere vllt. mal mit der Länge der Pause etwas rumzuspielen, damit eine möglichst flüssige Bewegung dabei rumkommt. Ist also nur eine suboptimale Lösung.

    Wir bräuchten eine Abfrage, die NICHT auf einen Tastendruck WARTET.
    Mit einem Joypad und Pygame wäre das kein Problem.
    Ich guck nochmal ob ich da was finde. ;)

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

  • Ich glaube das Problem dieses Codes ist, dass bei gedrückter UP Taste der Befehl immer aufgrund Impulswiederholung weiter addiert wird.
    Sprich:
    Drücke ich 5 Sekunden auf UP habe ich z.B. 50 Impulse , also 50x0,2=10s. Also fährt er 10s vorwärts, nicht 5 :/ mache ich die Zeitangabe kleiner, habe ich durch ein PWM eine recht kleine Umdrehungsanzahl der Motoren. (Der einzige Weg diese hinsichtlich Geschwindigkeit zu steuern).

    Ich hoffe das war verständlich ausgedrückt :)

    Liebe Grüße

    Neolinga

    edit:
    bezüglich Joypad: Hast du da schon Verwendung für in Python gefunden, sprich lässt sich dies einbinden? Wenn ich jetzt von einem Joystick ausgehe, der in der Mitte eine "Ruheposition" hat, ist dies dann ein eigenes Signal? Wenn ich also den Stick nach vorne Bewege gibt er Gas. Lasse ich ihn los klappt er wieder zurück. Wenn ich letzteres als eigenen Befehl auslesen könnte, wäre das ein guter Anfang :)

    Einmal editiert, zuletzt von RapidDawn12618 (14. April 2014 um 17:19)

  • Finde einfach keine Möglichkeit, die Tastatur abzufragen...:s
    Ich kann mir einfach nicht vorstellen, dass das nicht mit ein paar Zeilen Möglich ist...
    Suche aber weiter... :geek:

    Für die Abfrage vom Joystick hätte ich da was brauchbares.


    Damit kannst Du schonmal die Eingabe testen. Damit werden aber erstmal nur die Tasten abgefragt. Die "HAT" Steuerung geht etwas anders, hatte diesen Code aber schon in meiner Sammlung und gerade zur Hand.
    HIER gibt es weitere Informationen.

    Wenn Du das über das Terminal startest, ist es sicherlich nötig die Debug-Messages abzuschalten. HIER hat Meigrafd mir eine gute Beschreibung gepostet, wie das geht.

    Wenn Du möchtest, binde ich Dir das noch in Deinen Code ein, damit Dein Fahrzeug endlich mal vernünftig steuerbar ist :)

    /edit: ich habe auch noch eine komplexe Abfrage geschrieben, womit alle Tasten auszulesen sind. Außerdem lassen sich damit 2 Verschiedene Joypads abfragen, da ich hier einmal ein PS2 Nachbau von HAMA und einen X-Box Controller hab. Das Programm erkennt, was eingestöpselt ist und stellt die Belegung entsprechend um. Das ganze kann einfach über eine Subroutine eingebunden werden (über import) und mit "joy(taste,typ)" abgefragt werden.
    Mit dem Argument "Taste" kann man entweder alle Tasten abfragen (0) oder eine spezielle Taste.
    Mit "Typ" kann man festlegen, ob das Programm warten soll oder der Status der Taste sofort ausgegeben wird.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

    Einmal editiert, zuletzt von LieberScholli (14. April 2014 um 18:47)

  • Das wäre richtig mega cool wenn du das für mich machen könntest. Habe hier nur ein Gamepad von Saitek >>Hier<< funktioniert das mit dem auch? Wenn nicht könntest du mir dann eventuell mal von deinem einen Link schicken?

    Am allerbesten wäre natürlich eine Drahtlosverbindung von Controller und Fahrzeug.
    Aber erst mal klein und dann größer werden :D

    Ich war auch mehr als nur verwundert das es soetwas in Python nicht gibt. Ich dachte da gibt es für alles eine Lösung :P

    Habe auch vor, wenn alles wunderbar klappt, ein Tutorial zu schreiben mit Codes, Hardware etc.

    Vielen Dank dir schonmal für deine Mühe und liebe Grüße

    Neolinga

  • Hiermit sollte das erstmal funktionieren.

    Die Tasten müssen wahrscheinlich noch an Dein Pad angepasst werden.
    Am besten kannst Du das mal mit dem ersten Code von mir ausprobieren, welche Tasten welche Ausgabe bewirken. Habe im Code dafür nochmal einen Hinweis geschrieben. Die Tastaturabfrage habe ich komplett rausgenommen. Zum Abbrechen kann dann eine weitere Taste verwendet werden.
    Wichtig wäre wahrscheinlich noch das ausschalten der Debug-Message. Link dafür ist oben. Kann aber sein das Du das Problem nicht hast.

    Mein Programm zur Joystick-Abfrage werde ich später nochmal in einem extra Thread posten, da das für Deine Zwecke vllt. erstmal zuviel ist. Zumal das für Dein Pad komplett angepasst werden müsste. Ließe sich aber dann mit wenigen Zeilen in Deinen Code einbauen. Wenn Du also ein Funk X-Box Pad hast (oder andere Funk-Pads) kannst Du Dein Fahrzeug auch drahtlos steuern. Den Link dazu reiche ich dann hier nach.

    Dann hoffe ich mal dass das so alles klappt...:rolleyes:
    Viel spass und liebe Grüße, Scholli.

    /edit: kleine Änderung: while Schleife während der Motor läuft eingebaut. Soll bezwecken, das es nicht immer in die GPIO Funktion springt.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

    Einmal editiert, zuletzt von LieberScholli (14. April 2014 um 21:56)

  • DU BIST EIN GENIE :D :danke_ATDE:

    Tausend Dank. Also das läuft mit meinem Controller eigentlich recht gut ^^
    Kannst du mir eventuell noch ein Link von genau dem Drahtloscontroller schicken mit dem es auch sicher geht?

    Habe vor mir auch so ein xbox controller zu besorgen, jedoch will ich nicht ins "blaue" hineinkaufen.

    In meinem Bildschirm rattert jetz die Abfrage durch, das werde ich dann mithilfe von meigrafs Post noch ein wenig anpassen.

    Es wäre natürlich auch bombig von dir wenn du dann den Code wenn du fertig bist uppen könntest und deine Denkweise uns erklären könntest.

    Liebe Grüße und nochmal herzlichen Dank

    Neolinga


    PS: Das mit der Python Tastaturabfrage interessiert mich trotzdem noch immer :cool:

  • Ich habe zwar keine Ahnung von Python und pygame, aber wäre es nicht möglich (und damit schneller), die Werte "True" und "False" direkt durch den Inhalt der Variablen "FirstState" und "SecondState" zu ersetzen? Die sind ja 1 oder 0.

    Aus

    wird

    Code
    #A routine to control a pair of pins
    def ControlAPairOfPins(FirstPin,FirstState,SecondPin,SecondState):
      print "Controlling them pins"
        GPIO.output(int(FirstPin),FirstState)
        GPIO.output(int(SecondPin),SecondState)
      #Just return
      return

    Oder bin ich völlig auf dem Holzweg und Python optimiert den Code so, daß die Verarbeitungsgeschwindigkeit dadurch nicht beeinflußt wird? :s

  • @ Oerks:
    Da hast Du schon recht. Die Steuerung der GPIO Pins kann man noch optimieren. Dein Code ist da schon genau richtig. Aber an der Verarbeitungsgeschwindigkeit tut sich da nicht allzuviel. Höchstens wenn man die Schleife sehr häufig nutzt, bzw. das Timing enorm wichtig ist, sollte man das schon optimieren. Schätze aber dass das hier nicht so stark ins Gewicht fällt. Spätestens wenn Neolinga sich den Code öfter mal ansieht und noch mehr Erfahrung gesammelt hat, wird ihm das auch auffallen.

    Ging aber primär um die verdammte Tastaturabfrage.
    Das lässt mich echt nicht in ruhe. :geek::s:D

    @Neolinga:
    Also ich hab das "Originale" X-Box Pad für PC. Ist nicht schwer zu finden. Davon gibt es 2 Versionen. die mit Kabel kostet ca.28€, die ohne Kabel ca. 38€. Hab ne weile vorm Regal gestanden und mich dann doch für die Kabellose entschieden. Die 10€ ist das schon wert. Hab das ursprünglich für GTAIV gebraucht, da alle anderen Pads schwer zu konfigurieren waren. Es gibt aber auch davon günstige Nachbauten, die "eigentlich" 1 zu 1 funktionieren "sollten". Hab da aber keine Erfahrungswerte.

    Super das es läuft :thumbs1:.
    Hab aber schon wieder kleine Optimierungen im Kopf :D. Oerks liegt da nämlich nicht allzu falsch mit seinen Vermutungen.

    Mein Joypad-Modul für Python habe ich jetzt mal gepostet. HIER zu finden.
    Die Anpassung für Deinen Code schreibe ich Dir bei Gelegenheit dann mal hier.

    Beste Grüße, Scholli.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

    Einmal editiert, zuletzt von LieberScholli (14. April 2014 um 23:56)

  • Super, vielen Dank

    morgen werde ich mich auch noch ein bisschen mit der Codeoptimierung auseinander setzen, auch von wegen Koordination der Pins.
    Dann kommt wenn ich fertig bin eine komplette Anleitung, von der Hardware über Software und Überlegungen zum Ansteuern eines kleinen Roboters mit dem Gamepad :)

    Das mit der Anpassung ist echt nett von dir und ich warte gepannt :P

    Oerks: Deine Anmerkung werde ich Berücksichtigen und hoffentlich auch mit gewünschtem Ergebnis umsetzen können


    Liebe Grüße

    Neolinga

  • Ja, ein paar Bilder wären echt klasse.
    Würde echt gern mal sehen, was sich da Bewegt...:)
    Einen kleinen Bugfix hätte ich da schonmal. Ist mir jetzt erst aufgefallen.
    Setze unter alle "while abfrage() == "UP": pass"
    mal ein "key = False".
    Dann geht der Motor schneller (hehe.. millisekunden) in die Ruheposition.
    Der Ablauf ist dann allgemein etwas "runder", da er aus der Schleife halt mit dem Stopsignal rausgeht und den alten Wert nicht unnütz ein zweites mal mit sich rumschleppt.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!