Dec-10-2017, 04:00 AM
I am trying to limit a Joystick value, that ranges between -1.0 and +1.0, to a value between 0 and 127 with 64 being center. Any idea how to do this? I tried searching google but haven't found anything useful. I'm stumped! I need to send the value to a motor controller that has strict specifications of the 0 to 127 values (MCP/Roboclaw).
The code in question is between the ############### about 3/4 the way down the code. I am currently clamping the value but I don't think this is the best way. I am trying to avoid variables to store directions, but I can if I absolutely need to. It should not matter for my question but I am using a Raspberry Pi 3, the RPi.GPIO import won't work on PC/Mac, that I am aware of, so you may need to remove it, and references, from the code to test it.
The code in question is between the ############### about 3/4 the way down the code. I am currently clamping the value but I don't think this is the best way. I am trying to avoid variables to store directions, but I can if I absolutely need to. It should not matter for my question but I am using a Raspberry Pi 3, the RPi.GPIO import won't work on PC/Mac, that I am aware of, so you may need to remove it, and references, from the code to test it.
import pygame import time import RPi.GPIO as GPIO # https://sourceforge.net/projects/raspberry-gpio-python/ myPin = 4 # I am using the SparkFun Pi Wedge with an LED for testing GPIO.setmode(GPIO.BCM) GPIO.setup(myPin, GPIO.OUT) p = GPIO.PWM(myPin, 50) # standard RC receiver freq p.start(0) # Define some colors BLACK = ( 0, 0, 0) WHITE = ( 255, 255, 255) # This is a simple class that will help us print to the screen # It has nothing to do with the joysticks, just outputting the # information. class TextPrint: def __init__(self): self.reset() self.font = pygame.font.Font(None, 20) def print(self, screen, textString): textBitmap = self.font.render(textString, True, BLACK) screen.blit(textBitmap, [self.x, self.y]) self.y += self.line_height def reset(self): self.x = 10 self.y = 10 self.line_height = 15 def indent(self): self.x += 10 def unindent(self): self.x -= 10 pygame.init() # Set the width and height of the screen [width,height] size = [500, 700] screen = pygame.display.set_mode(size) pygame.display.set_caption("My Game") #Loop until the user clicks the close button. done = False # Used to manage how fast the screen updates clock = pygame.time.Clock() # Initialize the joysticks pygame.joystick.init() # Get ready to print textPrint = TextPrint() # -------- Main Program Loop ----------- while done==False: # EVENT PROCESSING STEP 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 # Possible joystick actions: JOYAXISMOTION JOYBALLMOTION JOYBUTTONDOWN JOYBUTTONUP JOYHATMOTION if event.type == pygame.JOYBUTTONDOWN: print("Joystick button pressed.") if event.type == pygame.JOYBUTTONUP: print("Joystick button released.") # DRAWING STEP # First, clear the screen to white. Don't put other drawing commands # above this, or they will be erased with this command. screen.fill(WHITE) textPrint.reset() # Get count of joysticks joystick_count = pygame.joystick.get_count() textPrint.print(screen, "Number of joysticks: {}".format(joystick_count) ) textPrint.indent() # For each joystick: for i in range(joystick_count): joystick = pygame.joystick.Joystick(i) joystick.init() textPrint.print(screen, "Joystick {}".format(i) ) textPrint.indent() # Get the name from the OS for the controller/joystick name = joystick.get_name() textPrint.print(screen, "Joystick name: {}".format(name) ) # Usually axis run in pairs, up/down for one, and left/right for # the other. axes = joystick.get_numaxes() textPrint.print(screen, "Number of axes: {}".format(axes) ) textPrint.indent() for i in range( axes ): axis = joystick.get_axis( i ) textPrint.print(screen, "Axis {} value: {:>6.3f}".format(i, axis) ) textPrint.unindent() ################## # Alter the duty cycle based on the axis 0(left/right motion) # Axis 1 will be used later which is Up/Down of the same stick # wich will become forward/reverse # # p.ChangeDutyCycle(round(abs(joystick.get_axis(0) * 100), 2)) print('axis 0 = ', round(abs(joystick.get_axis(0) * 100), 2)) # # ################# buttons = joystick.get_numbuttons() textPrint.print(screen, "Number of buttons: {}".format(buttons) ) textPrint.indent() for i in range( buttons ): button = joystick.get_button( i ) textPrint.print(screen, "Button {:>2} value: {}".format(i,button) ) textPrint.unindent() # Hat switch. All or nothing for direction, not like joysticks. # Value comes back in an array. hats = joystick.get_numhats() textPrint.print(screen, "Number of hats: {}".format(hats) ) textPrint.indent() for i in range( hats ): hat = joystick.get_hat( i ) textPrint.print(screen, "Hat {} value: {}".format(i, str(hat)) ) textPrint.unindent() textPrint.unindent() # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT # Go ahead and update the screen with what we've drawn. pygame.display.flip() # Limit to 30 frames per second clock.tick(30) ################### # #Must stop and clean up the GPIO module p.stop() GPIO.cleanup() # Close the window and quit. # If you forget this line, the program will 'hang' # on exit if running from IDLE. pygame.quit ()Thank you for any help you can provide!