I built a robot spider using 16 9g Servos. It is controlled by an XBox One Controller via Bluetooth.
To make the experience fit your profile, pick a username and tell us what interests you.
We found and based on your interests.
Komplett.stlAn older version of a bigger robot spider. Just here to look cool.Standard Tesselated Geometry - 40.82 MB - 05/03/2019 at 20:17 |
|
|
Fus.stlServo holder for foot.Standard Tesselated Geometry - 349.50 kB - 05/03/2019 at 20:10 |
|
|
Verbindung gespiegelt.stlBasic link. But other direction.Standard Tesselated Geometry - 145.20 kB - 05/03/2019 at 20:10 |
|
|
Knie.stlServo holder for knee.Standard Tesselated Geometry - 236.80 kB - 05/03/2019 at 20:10 |
|
|
Boden und Decke.stlTob and bottom body plate.Standard Tesselated Geometry - 293.83 kB - 05/03/2019 at 20:10 |
|
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?
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 »
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.
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.
As often, I got inspired by a YouTube video. It is linked on this project's main page.
Create an account to leave a comment. Already have an account? Log In.
Become a member to follow this project and never miss any updates
Add a couple decent sized capacitors (100-3000uF+) to the power rail, and you can probably mitigate your brownouts. More is better here, within size constraints. Also, consider supplying your servos with their own power supply, The servos often can work at a little higher voltage than the signaling voltage, and so you can get a 20%-30% overall power (and speed) increase for 'free'. Just share the ground potential between them (at 5V signaling levels anyway), and it all just works.