R2D2 Arm Connected to RPI3 With PCA9685

RPI3
You can use the RPI3 to use the servos. But the servo power will need to separte from the RPI3. The RPI3’s 5V is not enough to use servos long term. For initial testing they will work. But what you will find is the servos will glitch if connected to the RPI3’s header. The RPI3 causes the glitches. So eventually you need to find an alternative way to run the servos. There are two options I had on hand: a Maestro Mirco and PCA9685.
PCA9685
The PCA9685 requires 2 power inputs: 3.3V and 5V. The 3.3V is for the PCA9685 board. The 5V is for the Servo Power. You will use the RPI3’s 3.3V to power the PCA9685 board. But you will need to use an alternative 5V supply to power the servos. The RPI3’s 5V is not enough to power the servos. It may work a little, but it cannot be used long term. The USB cell phone battery charges can be used as the 5V supply.
This board can handle up to 16 servos or motor controllers. On my DonkeyCar I control the steering and motors using this board and it has been very responsive. This should fit all my needs for servo controls. In my dome I will have a lot of servos to control, up to 10 I believe. I may have a separte one of these boards just for the dome. These boards can also be daisy chained. You just need to change the address by soldering 2 pads together.
Next step, create a Node and Topic and wires this all up to the Flask API.
Schematic
RPI3 PCA9685
------------------------------
Pin 1 (3.3V) VCC
Pin 3 (GPIO2) SDA
Pin 5 (GPIO3) SCL
Pin 9 (GND) GND
Servo Color Code
Brown = GND
Red = Power
Orange = Signal
Power Supply PCA9685
------------------------------
5V 5V
GND GND

RPI3 and PCA9685 Running the Servos
Code
Packages to install on Ubuntu
sudo apt install python-smbus
sudo apt install i2c-tools
Packages to install in Python
pip install adafruit-circuitpython-servokit
Source Code Used
https://github.com/ricoai/R2D2/blob/master/controls/adafruit_servo_driver.py
from adafruit_servokit import ServoKit
import time
class AdafruitServoControl:
"""
Use the Adafruit PCA9685 board to control the servos.
https://learn.adafruit.com/adafruit-16-channel-servo-driver-with-raspberry-pi?view=all
pip install adafruit-circuitpython-servokit
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
"""
def __init__(self, min_servo=750, max_servo=2500):
"""
Initialize the maestro. Set the comm port if you need to set the specific. Set the min
and max servo pulse width if not default.
:param comm_port: Comm port of the maestro.
:param min_servo: Min servo pulse width in quarter seconds.
:param max_servo: Max servo pulse width in quarter seconds.
"""
self.kit = None # Hold the Adafruit Servokit
self.min_servo = min_servo # Min pulse width of servo in quarter seconds
self.max_servo = max_servo # Max pulse width of servo in quarter seconds
self.setup_controller() # Setup maestro
def setup_controller(self):
"""
Setup the maestro controller
:return:
"""
self.kit = ServoKit(channels=16)
self.kit.servo[0].set_pulse_width_range(self.min_servo, self.max_servo)
self.kit.servo[1].set_pulse_width_range(self.min_servo, self.max_servo)
self.kit.servo[0].angle = 0
self.kit.servo[1].angle = 0
def center(self):
"""
Center the servo.
:return:
"""
self.set_angle(0.0) # CENTER (6000)
def set_angle(self, chan, angle):
"""
Set the servo to the given angle.
:param chan: Servo channel to move
:param angle: Angle to move the servo
:return:
"""
if angle > 180:
angle = 180
if angle < 0:
angle = 0
self.kit.servo[chan].angle = angle
print("Chan: " + str(chan) + " angle: " + str(self.kit.servo[chan].angle))
if __name__ == '__main__':
servo = AdafruitServoControl()
time.sleep(1.0)
servo.set_angle(0, 180)
servo.set_angle(1, 180)
time.sleep(1.5)
servo.set_angle(0, 0)
servo.set_angle(1, 0)
Parts List
The R2D2 arm holder can be found at http://astromech.com/