by hdbreaker
Esta entrada sigue con la serie de Robotica del blog, en la misma desarrollaremos una interfaz en python con la cual capturaremos los valores analógicos de las Axis de un Joystick USB para alimentar el Pulso Modulado de Ondas (PWM) de nuestro circuito y de esta forma lograr regular la velocidad de los motores a controlar.
Para esto, nos ayudaremos de la muy conocida librería Pygame, pero distorsionando un poco la idea para la que fue creada, ya que no desarrollaremos un Vídeo Juego pero si utilizaremos el modulo pygame.joystick para interactuar con el hardware.
Lo importante de pygame es comprender como trata las pulsaciones:
En pygame, todo lo que sucede es un evento y cada evento tiene una clasificación, por lo que nosotros necesitaremos Iterar entre todos los eventos hasta identificar los que correspondan al movimiento de los AXIS del Joystick
para esto debemos obtener todos los eventos manejados por la librería, esto lo logramos con la siguiente función: pygame.event.get()resumiendo, nosotros iteraremos entre todos los eventos capturados por event.get() de la siguiente forma:
for event in pygame.event.get(): # User did something if event.type == pygame.QUIT: # If user clicked close done=True # Flag that we are done so we exit this loop if event.type == pygame.JOYAXISMOTION: if(event.axis==1): #arriba y abajo stick izq #Capturamos el valor analógico if(event.axis==2): #izquierda y derecha stick derecho #Capturamos el valor analógico
pygame.QUIT corresponde al evento de salida en pygame (el boton de exit)
pygame.JOYAXISMOTION corresponde al evento de movimiento de los sticks del joystick, lo importante a resaltar de este evento es que se subdivide en 4 valores enteros (1,0,3,2), los cuales representan Norte-Sur y Este-Oeste del Análogo Izquierdo y derecho respectivamente: (Los números pares, representan el movimiento horizontal de los Análogos mientras que los impares el movimiento vertical)#Movimiento Vertical
event.axis==1 #Stick Izquierdo
event.axis==3 #Stick Derecho
#Movimiento Horizontal
event.axis==0 #Stick Izquierdo
event.axis==2 #Stick Derecho
Teniendo en claro esto, solo nos queda capturar los valores que nos envía el hardware, teniendo en cuenta que el valor de reposo (centro) de los Análogos es 0 y la amplitud de movimiento es de punto decimal yendo desde 1 a -1
#Valor Análogo Decimal
-1 #Arriba Maximo
1 #Abajo Maximo
-1 #Izquierda Maximo
1 #Derecha Maximo
Comprendiendo esto se puede llegar al siguiente código para este proceso:
import pygame pygame.init() done = False # Initialize the joysticks pygame.joystick.init() # -------- Main Program Loop ----------- while done==False: # Get count of joysticks joystick_count = pygame.joystick.get_count() # For each joystick: for i in range(joystick_count): joystick = pygame.joystick.Joystick(i) joystick.init() # Get the name from the OS for the controller/joystick name = joystick.get_name() # Usually axis run in pairs, up/down for one, and left/right for # the other. axes = joystick.get_numaxes() #print axes flagAceleracion=0 flagMov=0 for event in pygame.event.get(): # User did something if event.type == pygame.QUIT: # If user clicked close done=True # Flag that we are done so we exit this loop if event.type == pygame.JOYAXISMOTION: #arriba y abajo if(event.axis==1): if(flagAceleracion==0): print "Acelero" axis = joystick.get_axis(1) print axis * -10 flagAceleracion=1 if(flagAceleracion==0): print "Desacelero" axis = joystick.get_axis(1) print axis * -10 flagAceleracion=1 if(event.value==0.0): flagAceleracion=0 #derecha y izq if(event.axis==2): if(flagMov==0): print "Izquierda" axis = joystick.get_axis(2) print axis * 10 flagMov=1 if(flagMov==0): print "Derecha" axis = joystick.get_axis(2) print axis * 10 flagMov=1 if(event.value==0.0): flagMov=0 pygame.quit ()
En este ejemplo multiplico el valor de axis por 10 para obtener un numero entre 10 y -10 ya que estos valores me resultan mas cómodos para mi proyecto, para completar el código bastaría accionar los motores pasando como parámetro PWM el valor de la variable axis ya sea de forma local o por medio de sockets.
Espero les sea de utilidad, para profundizar en el uso de pygame les comparto el link a su documentación oficial: http://pygame.org/docs/
Saludos!