3
$\begingroup$

I have a hexapod that a friend and I built this summer, but there is a big problem whenever we try to move multiple servos. When using the Adafruit_Python_PCA9685 library, I am able to move the servos perfectly fine for a short period, but then they will breakdown and start erratically twitching.

To illustrate the problem, I just modified a few lines from Adafruit's simpletest.py program.

Here is the code:

# Simple demo of of the PCA9685 PWM servo/LED controller library.
# This will move channel 0 from min to max position repeatedly.
# Author: Tony DiCola
# License: Public Domain
from __future__ import division
import time

# Import the PCA9685 module.
import Adafruit_PCA9685


# Uncomment to enable debug output.
import logging
logging.basicConfig(level=logging.DEBUG)

# Initialise the PCA9685 using the default address (0x40).
# pwm = Adafruit_PCA9685.PCA9685()

# Alternatively specify a different address and/or bus:
pwm = Adafruit_PCA9685.PCA9685(address=0x40, busnum=2)

# Configure min and max servo pulse lengths
servo_min = 300  # Min pulse length out of 4096
servo_max = 400  # Max pulse length out of 4096

# Helper function to make setting a servo pulse width simpler.
def set_servo_pulse(channel, pulse):
pulse_length = 1000000    # 1,000,000 us per second
pulse_length //= 60       # 60 Hz
print('{0}us per period'.format(pulse_length))
pulse_length //= 4096     # 12 bits of resolution
print('{0}us per bit'.format(pulse_length))
pulse *= 1000
pulse //= pulse_length
pwm.set_pwm(channel, 0, pulse)

# Set frequency to 60hz, good for servos.
pwm.set_pwm_freq(60)

print('Moving servo on channel 0, press Ctrl-C to quit...')
while True:
# Move servo on channel O between extremes.
for i in range(0, 3):
    for j in range(0,3):
    k = (4*i)+j
    pwm.set_pwm(k, 0, servo_min)
    time.sleep(1)
    pwm.set_pwm(k, 0, servo_max)
    time.sleep(1)

And here is a video of the "erratic movement" (the first 8 seconds are normal movement)

I am running the code on a Beagle Bone Green Wireless with ubuntu on it and I am using turnigy TGY-S091D servos.

Here is a photo of the wiring photo of the hexapod's wiring

I don't have enough reputation to post more detailed pictures, but hopefully this is enough.

Please help.

$\endgroup$
2
  • 1
    $\begingroup$ is current draw an issue? $\endgroup$
    – holmeski
    Commented Nov 1, 2016 at 18:21
  • $\begingroup$ Does a single servo behave the same way after awhile? $\endgroup$
    – SteveO
    Commented Nov 5, 2016 at 4:22

2 Answers 2

1
$\begingroup$

The movement you are seeing is what I would expect to see if your ground was rising becouse of current draw. Basically as you turn on more servos you will see there current draw will make the apparent voltage drop and the pulses for PWM grow more indistinct, digital servos will generally still work ok but analog servos like you have will stutter as you show.

In order to resolve this problem I would suggest you wire up the power in a more robust way directly connecting much larger gauge wire to your servo boards and your power supply, definitely not through a breadboard, and possibly installing thease capacitors in the provided spots on the boards

$\endgroup$
0
$\begingroup$

You should avoid breadboards when working with circuits subject to significant currents or vibration.

That said - the power side of the servos (centre wire) can and should be supplied by a private and isolated supply. The arduino has its own on-board regulator but that is limited to under 500mA. If you are driving the servos directly from the arduino then when your servos are working they are drawing too much current, resulting in a voltage drop which is interfering with the signal.

The second issue may simply be circuit noise. All brushed motors are digitally noisy - that noise appears as spurious signals on the supply rail which can interfere with high frequency MCUs for example. If circuit noise is suspected - an oscilloscope on the arduino supply rail will show the problem. Often a simple capacitor (0.1uF) to ground is sufficient to attenuate the noise.

The solution is to use a BEC (Battery Elimination Circuit) which isolates the power used by the BEC connected devices, in this case your servos, from other devices connected to the same battery. With the BEC in place and supplying power to the servos, the ground connection must be common with the control signal ground and the power ground. The control signal is therefore independent of the servo supply voltage and is always referenced to the arduino ground.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.