Forum >> Principianti >> fermare robot al rilascio dei tasti direzionali

Pagina: 1

Salve a tutti, ho necessità di comandare un robot con i tasti direzionali del computer, ho scritto il codice che allego ma avrei bisogno che al rilascio del tasto direzionale i motori si fermino.
Ringrazio anticipatamente chiunque riesca a darmi una mano.

Grazie





# import librerie curses e GPIO

import curses

import RPi.GPIO as GPIO

import time




# selezione dei 4 pin per controllare il bridge-motor

GPIO.setmode(GPIO.BCM)

GPIO.setwarnings(False)

GPIO.setup(13,GPIO.OUT)

GPIO.setup(19,GPIO.OUT)

GPIO.setup(18,GPIO.OUT)

GPIO.setup(12,GPIO.OUT)

# definizione degli spostamenti (come da esempio precedente)

def backward() :

GPIO.output(13,GPIO.HIGH)

GPIO.output(19,GPIO.LOW)

GPIO.output(18,GPIO.HIGH)

GPIO.output(12,GPIO.LOW)



def forward() :

GPIO.output(19,GPIO.HIGH)

GPIO.output(13,GPIO.LOW)

GPIO.output(18,GPIO.LOW)

GPIO.output(12,GPIO.HIGH)




def stop ():

GPIO.output(13,GPIO.LOW)

GPIO.output(19,GPIO.LOW)

GPIO.output(18,GPIO.LOW)

GPIO.output(12,GPIO.LOW)



def left ():

GPIO.output(19,GPIO.HIGH)

GPIO.output(13,GPIO.LOW)

GPIO.output(18,GPIO.HIGH)

GPIO.output(12,GPIO.LOW)



def right ():

GPIO.output(19,GPIO.LOW)

GPIO.output(13,GPIO.HIGH)

GPIO.output(18,GPIO.LOW)

GPIO.output(12,GPIO.HIGH)






# cattura dei tasti premuti dall'utente



screen = curses.initscr()

curses.echo()

curses.cbreak()

screen.keypad(True)







# cicla indefinitamente per catturare i comandi

try:

while True:



char = screen.getch()

print char





# su = avanza

if char == curses.KEY_UP:



forward()





# giu = retromarcia

elif char == curses.KEY_DOWN:





backward()



# sinistra = left (gira a sinistra)

elif char == curses.KEY_LEFT:





left()

# destra = right (gira a destra)

elif char == curses.KEY_RIGHT:





right()

# p = ferma il robot

if char == ord('p'):

stop()

# q = carattere di interruzione del programma

if char == ord('q'):

break












# restituisce il controllo della tastiera

finally:

curses.nocbreak()

screen.keypad(0)

curses.echo()

curses.endwin()




# prima di uscire, pulizia del GPIO

GPIO.cleanup()






--- Ultima modifica di 19marinho in data 2020-06-05 12:51:34 ---
Ciao,



Premetto che non utilizzo RPi da un bel po' di tempo, però penso che tu possa provare a fare un ciclo while nidificato per ogni input:




while True: 
  while char == curses.K_UP:
    forward()
E così anche per gli altri.

In alternativa potresti utilizzare l'event handling di pygame che, a mio avviso, è molto intuitivo (a discapito della lunghezza del codice che, a volte, può diventare molto carico).
Infatti sviluppando un gioco in pygame, un po' di tempo fa, ho utilizzato una tecnica simile ed ha funzionato molto bene.




Spero di esserti stato utile

Niccolò




(Potrei sbagliarmi perché non conosco molto bene la libreria curses, ma credo credo che esista un metodo per verificare se un evento è terminato, in questo caso la pressione di un tasto)


--- Ultima modifica di Il Linuxino in data 2020-06-07 15:15:39 ---



--- Ultima modifica di Il Linuxino in data 2020-06-07 15:40:53 ---


Pagina: 1



Esegui il login per scrivere una risposta.