2014-06-22 15 views
6

ja sterowania zdalnego samochodzik użyciu kodu Pythona .Jak na razie kodu jest jak poniżejPython Klawisz i Key Release Listener

def getkey(): 
     fd = sys.stdin.fileno() 
     old = termios.tcgetattr(fd) 
     new = termios.tcgetattr(fd) 
     new[3] = new[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO 
     new[6][TERMIOS.VMIN] = 1 
     new[6][TERMIOS.VTIME] = 0 
     termios.tcsetattr(fd, TERMIOS.TCSANOW, new) 
     c = None 
     try: 
       c = os.read(fd, 1) 
     finally: 
       termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, old) 
     return c 

def car(): 
    while True: 
     key = getkey() 
     if key == 's': #Down arrow 
      print "Down" 
      Backward() 
     elif key == 'w': #Up arrow 
      print "Up" 
      forward() 
     elif key == 'a': 
      print "left" 
      Left() 
     elif key == 'd': 
      print "Right" 
      Right() 
     elif key == 'q': #Quit 
      print "That's It" 
      break 
def forward(): 
    GPIO.output(11,True) #Move forward 

po naciśnięciu „w” forward() wywoływana jest metoda i samochód porusza się do przodu, ale nie zatrzyma się, dopóki nie odejdę z programu ani nie zadzwonię do GPIO.output (11, Flase) z innej metody.

Czy jest jakiś kluczowy odbiornik, który wykrywa zwolnienie klawisza dowolnego klucza.

Na przykład, jeśli „w” wciśnięty nazywa ta metoda i jeśli wydany wywołania innej metody kodu

Sudo

if w_isPressed() 
    forward() 
else if w_isReleased() 
    stop() 
+1

Nie można tego zrobić bez faktycznego dostępu do klawiatury. Twój terminal wysyła tylko naciśnięcia klawiszy, więc nie możesz stwierdzić, kiedy został zwolniony klucz. – Blender

+1

Możesz to zrobić za pomocą PyGame. – kindall

Odpowiedz

1

Widziałem Pygame grę bibliotekę rozwoju są z powodzeniem stosowane w podobnych sytuacjach przed , obsługa systemów i maszyn w czasie rzeczywistym w produkcji, a nie tylko przykłady zabawek. Myślę, że to także odpowiedni kandydat. Sprawdź moduł pygame.key, aby dowiedzieć się, co można zrobić z wejściem klawiatury.

Krótko mówiąc, jeśli nie jesteś obeznany z tworzeniem gier, w zasadzie nieprzerwanie odpytujesz na takie zdarzenia, jak zmiany stanu wejściowego w nieskończonej pętli gry i odpowiednio zareagujesz. Zwykle aktualizacja parametrów systemu za pomocą delt na czas, który upłynął. Jest mnóstwo tutoriali na ten temat, a Pygame jest dostępne i Pygame docs są całkiem solidne.

Prostym przykładem tego, jak się do tego zabrać:

import pygame 

pygame.init() 

# to spam the pygame.KEYDOWN event every 100ms while key being pressed 
pygame.key.set_repeat(100, 100) 

while 1: 
    for event in pygame.event.get(): 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_w: 
       print 'go forward' 
      if event.key == pygame.K_s: 
       print 'go backward' 
     if event.type == pygame.KEYUP: 
      print 'stop' 

Musisz grać z pygame.KEYDOWN, pygame.KEYUP i pygame.key.set_repeat w zależności od tego, jak ruch samochodowy jest realizowany.

+0

Jednym z ograniczeń pygame jest to, że wymaga on połączenia z wyświetlaczem. Oznacza to, że takie podejście nie działa, jeśli łączysz się z bezgłowym raspberry pi z SSH. – malte

Powiązane problemy