Raspberry Pi - Robot Arm
1. Robot Configuration
-
1 * Raspberry Pi processor.
-
4 * SG90 servos.
-
1 * PCA9685.
-
1 * 5V(2A/4A) adaptor.
-
3D printed arm model EEZYbotARM.
1.1 Configure PCA9685
I have followed this post
- Install I2C tools
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
sudo i2cdetect -y 0
- Connect pins
- Install python PCA9685 library
sudo pip3 install adafruit-circuitpython-servokit
1.2 servokit lib
This library offers simple usage of servos.
- Initialize the system (PCA9685 is a 16 channels system):
from adafruit_servokit import ServoKit
kit = ServoKit(channels=16)
- Standard servos, control the desire angle.
kit.servo[servo_id].angle = 180
kit.servo[servo_id].angle = 0
kit.servo[servo_id].set_pulse_width_range(1000, 2000)
- Continuous servo (which is our case with SG90):
kit.continuous_servo[servo_id].throttle = -1
kit.continuous_servo[servo_id].throttle = 1
kit.continuous_servo[servo_id].throttle = 0
kit.continuous_servo[servo_id].throttle = 0.5
Control
def change_servo(angle, ids=[1]):
print(" Rotate to %f"%(angle))
direction = -1
if angle > 0:
direction = 1
for id_servo in ids:
kit.continuous_servo[id_servo].throttle = direction
# rotate the servos
time.sleep(abs(angle))
# stop the servos
for id_servo in ids:
kit.continuous_servo[id_servo].throttle = 0
def go_forward(angle=magnitude, direction=1):
kit.continuous_servo[1].throttle = direction
# rotate the servos
time.sleep(abs(angle))
kit.continuous_servo[1].throttle = 0
def go_left(angle=magnitude, direction=1):
kit.continuous_servo[0].throttle = direction
time.sleep(abs(angle))
kit.continuous_servo[0].throttle = 0
def hands_up(angle=magnitude, direction=1):
kit.continuous_servo[3].throttle = direction
time.sleep(abs(angle))
kit.continuous_servo[3].throttle = 0
def go_up(angle=magnitude, direction=1):
kit.continuous_servo[2].throttle = direction
time.sleep(abs(angle))
kit.continuous_servo[2].throttle = 0