Tastaturabfrage für Robotersteuerung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Sammy_2018
User
Beiträge: 1
Registriert: Sonntag 25. März 2018, 14:33

Hallo,

ich fange gerade an meinen Roboter über einen PI3 zu steuern. Zuerst sollte die Steuerung über eine Tastatur (Cursortasten) möglich sein. Sie funktioniert eigentlich soweit. Wenn eine Taste gerückt wird werden die entsprechende GPIOs angesteuert und das Kettenfahrzeug bewegt (2 Elektronikmotoren, die jeweils über eine H-Brücke angesteuert werden) sich entsprechend. Lasse ich die Taste los bleibt er sofort stehen (alles GPIOs aus).
Jetzt zum Problem- wenn ich z.B. die Cursor_Up Taste drücke und anschließend die Cursor_Down (gleichzeitig), fährt der Roboter erst vorwärts und dann rückwärts (wie es auch sein sollte), lasse ich dann die Cursor_Down Taste wieder los bleibt er jedoch stehen, obwohl noch die Cursor_Up Taste gedrückt ist.

Zusammenfassung:
Der Zustand der ersten Taste wird nicht mehr abgefragt, nachdem eine Zweite zwischenzeitlich kurz betätigt wurde.

Wie kann man das hinbekommen, das immer der Befehl der letzten gedrückten Taste ausgeführt wird, bis letzendlich diese losgelassen wird?

Hier der Teil des Codes:

try:
while True:

for event in pygame.event.get():

if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
GPIO.output(7,False)
GPIO.output(11,True)
GPIO.output(13,False)
GPIO.output(15,True)


if event.key == pygame.K_DOWN:
GPIO.output(7,True)
GPIO.output(11,False)
GPIO.output(13,True)
GPIO.output(15,False)


if event.key == pygame.K_RIGHT:
GPIO.output(7,True)
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(15,True)


if event.key == pygame.K_LEFT:
GPIO.output(7,False)
GPIO.output(11,True)
GPIO.output(13,True)
GPIO.output(15,False)


if event.key == pygame.K_ESCAPE or event.unicode == 'q':
pygame.quit()
sys.exit()

if event.type == pygame.KEYUP:
GPIO.output(7,False)
GPIO.output(11,False)
GPIO.output(13,False)
GPIO.output(15,False)


Ich hoffe es gibt ein Möglichkeit...

Grüsse

Tobi
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte Code in Code Tags formatieren.

Und du musst das halt programmieren. Du musst dir merken, welche Taste gedrückt wurde, und welche losgelassen. Und statt direkt zur Tat zu schreiten und die GPIOs zu schalten, musst du bestimmen, welches das gerade gültige fahrkommando ist.

Das Problem benötigt eine Datenstruktur, zb mit einer Liste und deren Methoden append und remove. Wenn eine Taste gedrückt wurde, muss deren Keycode am Ende der Liste eingefügt werden. Und wenn eine Taste losgelassen wurde, muss deinen keycode mit remove entfernt werden. Und das aktuelle Kommando ist immer der letzte Eintrag in der Liste. Oder Stopp, wenn sie leer ist.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sammy_2018: Du mußt halt die gedrückten Tasten speichern. Je nachdem, was Du willst, als einfache Flags oder als Stack. Die GPIOs werden dann aufgrund von geändertem Status und nicht direkt am Tastendruck geändert.
Antworten