Language
FEETECH serial bus servos are high-performance, cost-effective servo solutions designed for robotics, automation, and DIY projects. They utilize the custom FT-SCS communication protocol, supporting both TTL single-bus and RS485 communication methods, allowing multiple servos to be controlled via a single bus.
Key Features
Communication Protocol
- Dual Communication Support: Compatible with TTL level (high-speed) and RS485 (strong anti-interference) communication methods
- Async Duplex Communication: Uses a question-and-answer interaction model between controller and servo
- Multi-Servo Bus Control: Up to 254 servos can be connected on a single bus, each with a unique ID (0-253)
- Default Configuration: 1M baud rate, 8 data bits, 1 stop bit, no parity
- Broadcast Control: ID 254 can be used to send commands to all servos simultaneously
Control Modes
- Position Servo Mode: Precise position control with 0.087° resolution
- Constant Speed Mode: Smooth speed control for continuous rotation applications
- PWM Open-loop Mode: Direct PWM control for custom speed regulation
- Stepping Mode: Step-based position control for precision applications
Protection & Monitoring
- Over-temperature protection
- Over-voltage/under-voltage protection
- Over-current protection
- Load overload protection
- Real-time feedback of position, speed, load, voltage, and temperature
Basic Control Example
Below is a simple Python example demonstrating how to control a FEETECH servo via serial port:
import serial
import time
# Initialize serial port
ser = serial.Serial('COM3', 1000000, timeout=1) # Adjust COM port as needed
def calculate_checksum(data):
"""Calculate checksum for SCS protocol"""
checksum = sum(data)
return (~checksum) & 0xFF
def ping_servo(servo_id):
"""Ping servo to check connection"""
command = [0xFF, 0xFF, servo_id, 0x02, 0x01]
checksum = calculate_checksum(command[2:])
command.append(checksum)
ser.write(bytearray(command))
response = ser.read(6)
return len(response) > 0
def set_servo_position(servo_id, position, speed=1000):
"""Set servo target position with specified speed"""
# Position: 0-4095 corresponds to 0-360° (adjust based on your servo model)
# Speed: steps per second
pos_low = position & 0xFF
pos_high = (position >> 8) & 0xFF
speed_low = speed & 0xFF
speed_high = (speed >> 8) & 0xFF
command = [0xFF, 0xFF, servo_id, 0x09, 0x03, 0x2A,
pos_low, pos_high, 0x00, 0x00, speed_low, speed_high]
checksum = calculate_checksum(command[2:])
command.append(checksum)
ser.write(bytearray(command))
response = ser.read(6)
return response
# Example usage
if __name__ == "__main__":
servo_id = 1
# Check if servo is connected
if ping_servo(servo_id):
print(f"Servo ID {servo_id} connected successfully")
# Move servo to position 2048 (middle position, approximately 180°) at 1000 steps/sec
set_servo_position(servo_id, 2048, 1000)
print(f"Servo moving to position 2048")
time.sleep(2)
# Move servo to position 0 (minimum position, approximately 0°) at 500 steps/sec
set_servo_position(servo_id, 0, 500)
print(f"Servo moving to position 0")
else:
print(f"Failed to connect to servo ID {servo_id}")
ser.close()
Memory Table Overview
FEETECH servos feature a comprehensive memory table structure for configuration and status monitoring:
| Region | Description | Persistence |
|---|---|---|
| Version Information | Firmware version, hardware information | Read-only |
| EPROM Configuration | Servo ID, baud rate, angle limits, PID parameters, protection settings | Persists after power off |
| SRAM Control | Torque switch, target position, running speed, torque limit | Reset on power off |
| SRAM Feedback | Current position, speed, load, voltage, temperature, status | Real-time read-only |
| Factory Parameters | Calibration parameters, performance limits | Read-only |
Common Commands
| Command | Value | Function |
|---|---|---|
| PING | 0x01 | Query servo working status |
| READ DATA | 0x02 | Read data from control table |
| WRITE DATA | 0x03 | Write data to control table |
| REG_WRITE | 0x04 | Asynchronous write (execute on ACTION command) |
| ACTION | 0x05 | Trigger all queued REG_WRITE commands |
| SYNC_WRITE | 0x83 | Synchronously write to multiple servos simultaneously |
| RESET | 0x0A | Reset servo state and parameters |

