• Connecting the XBox One Controller via Bluetooth

    Max-Felix Müller05/03/2019 at 20:41 0 comments

    What 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?

    1. You enter a text editor in the terminal called Nano. You open the file rc.local which is run on startup
    2. 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.
    3. Saves the rc.local file.
    4. 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...
    Read more »

  • Second build

    Max-Felix Müller05/03/2019 at 20:20 0 comments

    Going 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

    Max-Felix Müller05/03/2019 at 20:15 0 comments

    At 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

    Max-Felix Müller05/03/2019 at 20:04 0 comments

    As often, I got inspired by a YouTube video. It is linked on this project's main page.