Nuevas Entradas

Joystick Analógico & PWM

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!



Share this:

 
Copyright © 2014 Security Signal.
Designed by OddThemes | Distributed By Gooyaabi Templates