-
Connecting the XBox One Controller via Bluetooth
05/03/2019 at 20:41 • 0 commentsWhat a journey!
Who would have guessed how hard it could be to connect a bluetooth device?
Turn the controller on, go into pair mode, search it on the raspberry and connect. Done, isn't it?
Well no, it isn't.
Different error messages are popping up. Some mentioning an IO problem, sometimes it's a unknown device etc.
I can't quite explain why but it has to do with some security check of the bluetooth module that has to be disabled.
Here's how I disabled it and got my controller to work properly:
To do the bluetooth settings automatically on startup, do the following:
1. In your terminal, enter:
sudo nano /etc/rc.local
2. Beneath everything else but before “exit 0”, enter the follwing, but take care to also copy the ‘’ around the later part of the second command:
sleep 10
sudo bash -c 'echo Y > /sys/module/bluetooth/parameters/disable_ertm'
3. Save and quit Nano
4. Reboot to test and confirm (check if the modified file is correct)
What exactly are you doing there?
- You enter a text editor in the terminal called Nano. You open the file rc.local which is run on startup
- After all the other startup tasks, you put the new command. After a short delay it writes a ‘Y’ in the file disable_ertm. To do it you have to issue the command via bash to get root permissions. ERTM will then be disabled.
- Saves the rc.local file.
- Reboots and then runs rc.local file automatically.
If you did everything right your XBox controller should now connect and be accepted as an input device. You can check the functionality using this example code from pygame:
import pygame # 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() 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 20 frames per second clock.tick(20) # Close the window and quit. # If you forget this line, the program will 'hang' # on exit if running from IDLE. pygame.quit ()
-
Second build
05/03/2019 at 20:20 • 0 commentsGoing to 9g servos was a neccessary step to avoid brownouts. However it required a complete redesing of all the parts, since I couldn't just scale them. So I decided to go ahead and also make them less complex. Instead simple shapes will now be glued together to get the desired part.
I printed each part multiple times. On the first ones I did some stress tests and tried different methods of glueing them together. I figured that super glue worked best for me. Later on I did one final print of all the parts and glued them all together using smal clamps to hold them while the glue was setting.
-
First build
05/03/2019 at 20:15 • 0 commentsAt first I tried using larger, standard sized, servos.
However my supply was not capable of delivering enough current to all servos at the same time on 5V. It would always brownout and completly reboot. If I only used one leg and hooked up it's servos to the supply one after the other it worked, but that was no acceptable condition.
So I decided to give it up... For now.
I still uploaded some pictures and an .stl file of the complete robot to admire it's beauty. This first on is the blue/black one.
-
Idea
05/03/2019 at 20:04 • 0 commentsAs often, I got inspired by a YouTube video. It is linked on this project's main page.