Drives Feetech SM, STS, and SCS bus servos from ARCx virtual servo ports via EZB or COM port, with sync writes and telemetry.
How to add the Feetech Rs485 Servo Driver robot skill
- Load the most recent release of ARCx on a compatible operating system (Get ARCx).
- Press the + Skills menu from the top menu bar in ARCx.
- Choose the Servo category tab.
- Press the Feetech Rs485 Servo Driver icon to add the robot skill to your project.
Don't have a robot yet?
Follow the Getting Started Guide to build a robot and use the Feetech Rs485 Servo Driver robot skill.
How to use the Feetech Rs485 Servo Driver robot skill
Drives Feetech serial bus servos - the SM (RS485) series, and the STS and SCS (TTL) series - from ARCx's virtual servo ports.
Once configured, a Feetech servo behaves like any other servo in ARCx: Auto Position, the servo skill, Servo.SetPosition(), the Kinematics Service and everything else move virtual port V1, and this skill turns that into the right packet on the bus.
The bus can be wired to an EZB, or straight to a USB adapter on a COM port of the computer running ARCx (such as the Feetech FE-URT-1), in which case no EZB is needed for the bus itself.
Supported families:
| Family | Notes |
|---|---|
| SM series (SM40BL and others, RS485, magnetic encoder) | 4096 steps. The register table this skill was written from. |
| STS series (STS3215, STS3032, STS3020, TTL, magnetic encoder) | 4096 steps, same table as SM. |
| SCS series (SCS15, SCS225, SCS0009, TTL, potentiometer) | 1024 steps, big endian words, no acceleration or current registers. From the Feetech documentation, untested. |
Untested against hardware at the time of writing - treat the first bring-up with care. For SCS servos, see also the Feetech Bus servo Driver skill, which targets them specifically.
Requirements
- Feetech servos daisy chained on one bus, all at the same baud rate, each with a different ID.
- Servo power at their own voltage.
- One of: an EZB hardware UART (full duplex, can read servos), an EZB digital port (transmit only - servos can be moved but not read), or a COM port with a USB to RS485/TTL adapter (full duplex).
Adding it to a project
- Wire the bus and power the servos.
- Add the skill (Servo category).
- On the Bus tab pick the port type and set the baud rate - Feetech servos ship at 1000000.
- On the Tools tab press Scan bus to see which IDs answer.
- On the Servos tab add an entry per servo: virtual port, ID, model family, operating mode and position range.
- Press Initialize and move a servo to check it.
Mapping ports to IDs
Each entry maps one ARCx virtual port (V0 to V255) to a servo ID. The ID does not have to match the port number - V3 can drive ID 17. Other skills only ever see the virtual port.
| Setting | Meaning | Default |
|---|---|---|
| Port | The ARCx virtual servo port other skills move. | V1 |
| ID | The servo ID (0-253) programmed into the servo. | 1 |
| Model | SM and STS share a table with 4096 steps; SCS has 1024 steps and a different byte order, so this has to be right. | SM series |
| Operating mode | Position moves between the min and max. Wheel spins continuously, with the ARCx position choosing direction and speed (centre is stopped). PwmOpenLoop drives the motor directly, with the ARCx position choosing direction and duty (centre is off). | Position |
| Min position / Max position | The raw positions the lowest and highest ARCx positions map to. 4095 for SM and STS, 1023 for SCS. | 0 / 4095 |
| Invert | Reverse the direction, for a mirrored mounting. | off |
| Wheel speed limit | Wheel mode: the raw speed the extreme ARCx positions map to. PWM mode: the duty (0-1000). Position 1 is full reverse, the centre stopped, the maximum full forward. | 2000 |
| Default goal speed | Raw goal speed applied on initialization and used until a skill sets a velocity. 0 is maximum. | 0 |
| Default acceleration | Raw acceleration (100 steps/s per unit, 0-254) applied on initialization. 0 is maximum. Ignored by SCS, which has no acceleration register. | 0 |
| Enabled | A disabled entry is kept but ignored, so a servo can be parked without losing its settings. | on |
Bus settings
| Setting | Meaning | Default |
|---|---|---|
| Board index | Which EZB's virtual ports are this skill's servos. For the UART and digital port types it is also the EZB the bus is wired to; a COM port bus still needs it for the V ports. | 0 |
| Port type | UART1 is the usual EZB choice. DigitalPort is transmit-only software serial (no reads, and only 4800-115200). ComPort is a USB to RS485/TTL adapter on this machine. | UART1 |
| Digital port | Which digital port to transmit from, for DigitalPort. | D0 |
| COM port | COM3, /dev/ttyUSB0, for ComPort. |
empty |
| Baud rate | Every servo on the bus must be set to this. | 1000000 |
| Response timeout (ms) | How long to wait for an answer to a read or ping. | 100 |
| Inter-command delay (ms) | Pause after every packet. 0 sends as fast as the port can. | 2 |
| Initialize on connect | Open the port and apply each servo's drive mode and defaults when the EZB connects, or when the project loads for a COM port bus. | on |
| Only reply to reads | Tell every servo to answer only reads and pings, so writes are not slowed by replies on the half duplex bus. | on |
| Debug logging | Every packet to the log as hex. Useful when wiring a new chain, noisy once it works. | off |
Telemetry
Background polling of every enabled servo's position, speed, temperature, voltage, load, current, protection status and moving flag. Needs a hardware UART or a COM port, and is off by default because every poll is bus traffic.
| Setting | Meaning | Default |
|---|---|---|
| Enabled | Poll the servos. | off |
| Interval (ms) | How often a full pass is started. | 1000 |
| Set global variables | Publish each reading as script variables. | on |
| Variable prefix | Start of every variable name. | Feetech |
| Over temperature limit | A servo reaching this many degrees Celsius is reported in the log. 0 disables the check. | 65 |
| Release on over temperature | Torque off a servo that reaches the limit, so it cools instead of tripping its own protection. | on |
With the default prefix, port V1 publishes FeetechV1Position, FeetechV1Temperature, FeetechV1Voltage, FeetechV1Load, FeetechV1Current, FeetechV1Status, FeetechV1Moving and FeetechV1Online.
The window
Bus status and packet counters, Initialize, Scan bus, Read all, Torque on, Release all, and a row per configured servo with its live values and last error.
Sync writes
When several configured servos are moved in the same operation, the driver sends a sync write - one packet for the whole group - so a whole-arm Auto Position frame arrives at the servos together.
EEPROM settings
Most of the Set... control commands write to the servo's EEPROM, so they persist across power cycles and belong in a setup script, not a control loop. The skill unlocks and re-locks the EEPROM around each one; only raw register writes need SetLock by hand.
The Window tab sets the robot skill's window title, its size on the workspace and notes about what it does in this project.
Troubleshooting
| Symptom | Cause |
|---|---|
| Nothing answers a scan | Wrong baud rate, wrong port, unpowered bus, or A/B (or TTL data) wired the wrong way round. |
| Some servos answer, others do not | Duplicate IDs, or a bad link in the chain. |
| Servos move but cannot be read | The bus is on a transmit-only DigitalPort. |
| Position is wrong or the range is halved | Wrong model family - SCS is 1024 steps and big endian, SM/STS are 4096 and little endian. |
| Movement is jerky with several servos | Raise Inter-command delay, or slow down telemetry. |
| A servo releases itself under load | Overload or over-current protection tripped. Check GetStatus, and the protection registers. |
| A servo hums and jitters when holding | Raise the dead band. |
| A servo vanishes after a baud rate change | Change the bus Baud rate to match; the servo kept the new rate. |
| A servo vanishes after a factory reset | Its ID went back to 1 and its baud rate to the factory rate. |
See also
- Feetech Bus servo Driver - the SCS series specifically
- Dynamixel servo Driver - the same idea for Robotis servos
- Servo, Auto Position (movement panel), Kinematics Service - things that move these ports
Control Commands for the Feetech Rs485 Servo Driver robot skill
There are Control Commands available for this robot skill which allows the skill to be controlled programmatically from scripts or other robot skills. These commands enable you to automate actions, respond to sensor inputs, and integrate the robot skill with other systems or custom interfaces. If you're new to the concept of Control Commands, we have a comprehensive manual available here that explains how to use them, provides examples to get you started and make the most of this powerful feature.
Control Command ManualThis robot skill has 60 control commands, listed below. Send them from a JavaScript or Python script, from Blockly, or from another robot skill.
The first value is always the window title, which is the name in the title bar of the robot skill on your workspace. It starts out as Feetech Rs485 servo Driver, which is what every example below uses. If you rename the robot skill, or add a second copy of it to the project, use the title as it appears on that window instead.
ControlCommand() can be shortened to CC(), and both spellings work in JavaScript and in Python. The examples are JavaScript; Python is the same call, except that true and false are written True and False.
FactoryReset
Restore factory settings. The ID goes back to 1 and the baud rate to the factory rate
Syntax
ControlCommand("Feetech Rs485 servo Driver", "FactoryReset", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "FactoryReset", "servoPort");
GetBusStatus
A one line description of the bus and whether it initialized
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetBusStatus")
Returns: String
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetBusStatus");
GetCurrent
The current draw in mA (SM and STS series only)
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetCurrent", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Double [5.0e324 to 1.7e308]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetCurrent", "servoPort");
GetGoalPosition
The raw position the servo was last told to move to
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetGoalPosition", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Integer [-2,147,483,648 to 2,147,483,647]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetGoalPosition", "servoPort");
GetIsMoving
True while the servo is still travelling to its goal
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetIsMoving", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetIsMoving", "servoPort");
GetLoad
The present load, -1000 to 1000, where 1000 is 100% of stall torque and the sign is the direction
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetLoad", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Integer [-2,147,483,648 to 2,147,483,647]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetLoad", "servoPort");
GetPing
True when the servo answers on the bus
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetPing", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetPing", "servoPort");
GetPosition
The servo's real position as the raw register value (0 to 4095, 0 to 1023 on SCS)
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetPosition", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Integer [-2,147,483,648 to 2,147,483,647]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetPosition", "servoPort");
GetPositionDegrees
The servo's real position in degrees from the start of its range
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetPositionDegrees", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Double [5.0e324 to 1.7e308]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetPositionDegrees", "servoPort");
GetPositionScaled
The servo's real position scaled to the ARCx servo position range like any other servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetPositionScaled", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Integer [-2,147,483,648 to 2,147,483,647]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetPositionScaled", "servoPort");
GetServoPorts
The virtual servo ports configured as Feetech servos, as strings such as V1
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetServoPorts")
Returns: Array of String
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetServoPorts");
GetStatus
The active protections, such as overload or temperature. OK when there are none
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetStatus", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: String
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetStatus", "servoPort");
GetTemperature
The internal temperature in degrees Celsius
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetTemperature", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Integer [-2,147,483,648 to 2,147,483,647]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetTemperature", "servoPort");
GetTorqueEnabled
True when the servo's torque is on
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetTorqueEnabled", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetTorqueEnabled", "servoPort");
GetVelocity
The present speed in steps per second. Negative is reverse
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetVelocity", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Integer [-2,147,483,648 to 2,147,483,647]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetVelocity", "servoPort");
GetVersion
The firmware and servo version the servo reports
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetVersion", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: String
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetVersion", "servoPort");
GetVoltage
The supply voltage in volts
Syntax
ControlCommand("Feetech Rs485 servo Driver", "GetVoltage", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Double [5.0e324 to 1.7e308]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "GetVoltage", "servoPort");
InitializeBus
Open the port and apply every servo's drive mode and defaults, as happens when the EZB connects
Syntax
ControlCommand("Feetech Rs485 servo Driver", "InitializeBus")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "InitializeBus");
ReadRegisterByte
Read one byte from the servo's memory table at the address
Syntax
ControlCommand("Feetech Rs485 servo Driver", "ReadRegisterByte", (String)servoPort, (Number)address)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | address | Number | A number, without quotes |
Returns: Integer [-2,147,483,648 to 2,147,483,647]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "ReadRegisterByte", "servoPort", 0);
ReadRegisterBytes
Read a number of bytes from the memory table at the address. Returns space separated hex
Syntax
ControlCommand("Feetech Rs485 servo Driver", "ReadRegisterBytes", (String)servoPort, (Number)address, (Number)count)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | address | Number | A number, without quotes |
| 3 | count | Number | A number, without quotes |
Returns: String
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "ReadRegisterBytes", "servoPort", 0, 0);
ReadRegisterInt16
Read a signed 16 bit value from the servo's memory table at the address
Syntax
ControlCommand("Feetech Rs485 servo Driver", "ReadRegisterInt16", (String)servoPort, (Number)address)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | address | Number | A number, without quotes |
Returns: Integer [-2,147,483,648 to 2,147,483,647]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "ReadRegisterInt16", "servoPort", 0);
ReadRegisterUInt16
Read an unsigned 16 bit value from the servo's memory table at the address
Syntax
ControlCommand("Feetech Rs485 servo Driver", "ReadRegisterUInt16", (String)servoPort, (Number)address)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | address | Number | A number, without quotes |
Returns: Integer [-2,147,483,648 to 2,147,483,647]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "ReadRegisterUInt16", "servoPort", 0);
ReleaseAll
Release (torque off) every configured servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "ReleaseAll")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "ReleaseAll");
ScanBus
Broadcast ping the bus and return a line per servo found (ID, version, status)
Syntax
ControlCommand("Feetech Rs485 servo Driver", "ScanBus")
Returns: Array of String
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "ScanBus");
SetAcceleration
The raw acceleration for position moves, 100 steps/s per unit, 0 to 254. 0 is the servo's maximum. Same as setting the port's acceleration
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetAcceleration", (String)servoPort, (Number)acceleration)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | acceleration | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetAcceleration", "servoPort", 0);
SetAngleResolution
The multiplier of the minimum resolution angle, 1 to 100. Above 1 gives multi turn on STS. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetAngleResolution", (String)servoPort, (Number)multiplier)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | multiplier | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetAngleResolution", "servoPort", 0);
SetBaudRate
Program a new baud rate, as bits per second (1000000, 500000, 250000, 128000, 115200, 76800, 57600, 38400) or the register code 0 to 7. Change the bus baud rate to match afterwards
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetBaudRate", (String)servoPort, (Number)baud)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | baud | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetBaudRate", "servoPort", 0);
SetDeadBand
The clockwise and counter clockwise dead band in steps, 0 to 32. Larger jitters less. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetDeadBand", (String)servoPort, (Number)cw, (Number)ccw)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | cw | Number | A number, without quotes |
| 3 | ccw | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetDeadBand", "servoPort", 0, 0);
SetDriveMode
Switch the servo between Position, Wheel and PwmOpenLoop (or 0, 1, 2) and remember it in the configuration. Saved in the servo's EEPROM
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetDriveMode", (String)servoPort, (String)Position|Wheel|PwmOpenLoop)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | Position|Wheel|PwmOpenLoop | Text | Your text, in quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetDriveMode", "servoPort", "Position|Wheel|PwmOpenLoop");
SetId
Program a new servo ID (0 to 253) into the servo and update the configuration entry to match
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetId", (String)servoPort, (Number)newId)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | newId | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetId", "servoPort", 0);
SetLedAlarmCondition
Bit flags of the protections that flash the LED: 1 voltage, 2 sensor, 4 temperature, 8 current, 16 angle, 32 overload. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetLedAlarmCondition", (String)servoPort, (Number)flags)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | flags | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetLedAlarmCondition", "servoPort", 0);
SetLock
Lock (true) or unlock (false) the servo's EEPROM. The Set commands above unlock and re-lock on their own; this is for raw register writes
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetLock", (String)servoPort, (Bool)locked)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | locked | True or false | true or false, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetLock", "servoPort", true);
SetMaxTorque
The max torque, 1000 is 100% of the stall torque. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetMaxTorque", (String)servoPort, (Number)torque)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | torque | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetMaxTorque", "servoPort", 0);
SetMinStartupForce
The minimum startup force (punch), 1000 is 100% of the stall torque. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetMinStartupForce", (String)servoPort, (Number)force)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | force | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetMinStartupForce", "servoPort", 0);
SetOverCurrentTime
How long the protective current may be exceeded before protection triggers, 10 ms per unit. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetOverCurrentTime", (String)servoPort, (Number)time)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | time | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetOverCurrentTime", "servoPort", 0);
SetOverloadTorque
The torque percent threshold that starts the overload timer, 0 to 254. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetOverloadTorque", (String)servoPort, (Number)percent)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | percent | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetOverloadTorque", "servoPort", 0);
SetPositionAsCenter
Make the current physical position of the servo its centre (2048). Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetPositionAsCenter", (String)servoPort)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetPositionAsCenter", "servoPort");
SetPositionCorrection
The position offset in steps, -2047 to 2047. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetPositionCorrection", (String)servoPort, (Number)steps)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | steps | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetPositionCorrection", "servoPort", 0);
SetPositionLimits
The raw min and max position limits the servo will move between. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetPositionLimits", (String)servoPort, (Number)min, (Number)max)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | min | Number | A number, without quotes |
| 3 | max | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetPositionLimits", "servoPort", 0, 0);
SetPositionPID
The position loop P, D and I coefficients, each 0 to 254. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetPositionPID", (String)servoPort, (Number)p, (Number)d, (Number)i)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | p | Number | A number, without quotes |
| 3 | d | Number | A number, without quotes |
| 4 | i | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetPositionPID", "servoPort", 0, 0, 0);
SetPositionRaw
Move the servo on the virtual port (v1, or id:5 to address by servo ID) to a raw position (0 to 4095, 0 to 1023 on SCS), bypassing the ARCx position mapping
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetPositionRaw", (String)servoPort, (Number)rawPosition)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | rawPosition | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetPositionRaw", "servoPort", 0);
SetPositionRawTimed
Move to a raw position over the given time in ms (0 to ignore) at the given raw speed (0 for maximum)
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetPositionRawTimed", (String)servoPort, (Number)rawPosition, (Number)timeMs, (Number)speed)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | rawPosition | Number | A number, without quotes |
| 3 | timeMs | Number | A number, without quotes |
| 4 | speed | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetPositionRawTimed", "servoPort", 0, 0, 0);
SetProtectionTime
How long the overload torque may be exceeded before protection triggers, 10 ms per unit. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetProtectionTime", (String)servoPort, (Number)time)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | time | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetProtectionTime", "servoPort", 0);
SetProtectionTorque
The torque percent used once overload protection has triggered, 0 to 254. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetProtectionTorque", (String)servoPort, (Number)percent)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | percent | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetProtectionTorque", "servoPort", 0);
SetProtectiveCurrent
The current at which protection triggers, 6.5 mA per unit, 0 to 511. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetProtectiveCurrent", (String)servoPort, (Number)current)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | current | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetProtectiveCurrent", "servoPort", 0);
SetPwm
PWM open loop mode: drive the motor at a signed duty, -1000 to 1000, 0 to stop. Bypasses the ARCx position mapping
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetPwm", (String)servoPort, (Number)duty)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | duty | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetPwm", "servoPort", 0);
SetReturnDelayTime
How long the servo waits before answering, 2 s per unit, 0 to 254. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetReturnDelayTime", (String)servoPort, (Number)delay)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | delay | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetReturnDelayTime", "servoPort", 0);
SetSpeed
The raw goal speed for position moves. 0 is the servo's maximum. Same as setting the port's velocity
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetSpeed", (String)servoPort, (Number)speed)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | speed | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetSpeed", "servoPort", 0);
SetSpeedI
The speed loop integral coefficient used in wheel mode, 0 to 254. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetSpeedI", (String)servoPort, (Number)i)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | i | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetSpeedI", "servoPort", 0);
SetSpeedP
The speed loop proportional coefficient used in wheel mode, 0 to 254. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetSpeedP", (String)servoPort, (Number)p)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | p | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetSpeedP", "servoPort", 0);
SetStatusReturnLevel
true: answer reads and pings only (keeps the bus quiet); false: answer every instruction. Use ALL as the port for every servo. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetStatusReturnLevel", (String)servoPort|ALL, (Bool)onlyReads)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort|ALL | Text | Your text, in quotes |
| 2 | onlyReads | True or false | true or false, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetStatusReturnLevel", "servoPort|ALL", true);
SetTemperatureLimit
The maximum operating temperature in Celsius, 0 to 100. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetTemperatureLimit", (String)servoPort, (Number)celsius)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | celsius | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetTemperatureLimit", "servoPort", 0);
SetTorqueEnable
Turn torque on (hold position) or off (free to move by hand). Off is the same as releasing the port
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetTorqueEnable", (String)servoPort, (Bool)enabled)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | enabled | True or false | true or false, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetTorqueEnable", "servoPort", true);
SetTorqueEnableAll
Turn torque on or off for every configured servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetTorqueEnableAll", (Bool)enabled)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | enabled | True or false | true or false, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetTorqueEnableAll", true);
SetTorqueLimit
The runtime torque limit, 1000 is 100% of the stall torque. Reloaded from the max torque on power up
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetTorqueLimit", (String)servoPort, (Number)torque)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | torque | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetTorqueLimit", "servoPort", 0);
SetUnloadingCondition
Bit flags of the protections that release the servo: 1 voltage, 2 sensor, 4 temperature, 8 current, 16 angle, 32 overload. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetUnloadingCondition", (String)servoPort, (Number)flags)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | flags | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetUnloadingCondition", "servoPort", 0);
SetVoltageLimits
The operating voltage window in volts, for example 9.0 and 14.0. Saved in the servo
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetVoltageLimits", (String)servoPort, (Number)minVolts, (Number)maxVolts)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | minVolts | Number | A number, without quotes |
| 3 | maxVolts | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetVoltageLimits", "servoPort", 0, 0);
SetWheelSpeed
Wheel mode: spin at the raw signed speed, negative for reverse, 0 to stop. Bypasses the ARCx position mapping
Syntax
ControlCommand("Feetech Rs485 servo Driver", "SetWheelSpeed", (String)servoPort, (Number)speed)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | speed | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "SetWheelSpeed", "servoPort", 0);
WriteRegisterByte
Write one byte to the servo's memory table at the address. Unlock the EEPROM first for addresses below 40
Syntax
ControlCommand("Feetech Rs485 servo Driver", "WriteRegisterByte", (String)servoPort, (Number)address, (Number)value)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | address | Number | A number, without quotes |
| 3 | value | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "WriteRegisterByte", "servoPort", 0, 0);
WriteRegisterInt16
Write a 16 bit value (2 bytes, in the servo's byte order) to the memory table at the address
Syntax
ControlCommand("Feetech Rs485 servo Driver", "WriteRegisterInt16", (String)servoPort, (Number)address, (Number)value)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | address | Number | A number, without quotes |
| 3 | value | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Rs485 servo Driver", "WriteRegisterInt16", "servoPort", 0, 0);
This list is read out of the robot skill itself each time its package is uploaded, so it matches the published version (v4).







This robot skill has been updated to v1.
This robot skill has been updated to v2.
This robot skill has been updated to v3.
This robot skill has been updated to v4.
What has changed
compatible with the latest ARCx v2026.09.27.01