Drives Feetech SCS TTL serial bus servos from ARC virtual ports over EZB UART, digital port, or USB COM adapter.
How to add the Feetech Bus 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 Bus 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 Bus Servo Driver robot skill.
How to use the Feetech Bus Servo Driver robot skill
Drives Feetech SCS series TTL serial bus servos - SCS15, SCS115, SCS0009, SCS215, SCS225, SCS2332 and others that speak the SCS protocol - from ARCx's virtual servo ports.
Once configured, an SCS 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, in which case no EZB is needed for the bus itself.
SCS servos use a 1024 step range over roughly 200 degrees, with big endian register words - a different layout from the SM and STS series. The Feetech Rs485 servo Driver skill covers those; this one is the SCS specialist.
Untested against hardware at the time of writing - treat the first bring-up with care.
Requirements
- SCS servos daisy chained on one bus, all at the same baud rate, each with a different ID.
- Servo power at their own voltage (SCS servos are typically 6-7.4 V).
- 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 TTL adapter.
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 - SCS servos usually 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, mode and range.
- Press Initialize and move a servo to check it.
Mapping ports to IDs
| 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 | SCS15/SCS115, SCS0009, SCS2xx (SCS215/225/2332), or Other for anything else speaking the SCS protocol. | SCS15 |
| Operating mode | Position holds an angle between the limits. Wheel spins continuously, with the ARCx position choosing direction and speed (centre is stopped). | Position |
| Min position / Max position | The raw positions the lowest and highest ARCx positions map to, within 0-1023 over 200 degrees. The defaults keep clear of the end stops, as the original ARC skill did. | 23 / 1000 |
| Invert | Reverse the direction, for a mirrored mounting. | off |
| Wheel speed limit | Wheel mode: the raw speed (0-1023) the extreme ARCx positions map to. Position 1 is full clockwise, the centre stopped, the maximum full counter-clockwise. | 1023 |
| Default goal speed | Raw goal speed for position moves (0.19 degrees/second per unit, 0-1023) until a skill sets a velocity. 0 is the servo's maximum; 1000 is what the ARC skill always used. | 1000 |
| Has moving register | This model has the moving flag at address 66. Not every SCS model does, and one without it answers a read with garbage - leave off unless the datasheet lists it. | off |
| Has current register | This model has the present current register at address 69. Same caution. | off |
| Enabled | A disabled entry is kept but ignored. | 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, 4800-115200 only). ComPort is a USB to 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 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. | off |
Telemetry
Background polling of every enabled servo's position, speed, temperature, voltage, load, current and status. 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. | Scs |
| 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 ScsV1Position, ScsV1Temperature, ScsV1Voltage, ScsV1Load, ScsV1Status and ScsV1Online, plus current and moving for models that have those registers.
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.
Wheel mode on SCS
An SCS servo is put into continuous rotation by zeroing both angle limits; it is put back into position mode by setting them again. The SetWheelMode and SetJointMode control commands do exactly that, and remember the change in the configuration.
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 the data line wired wrong. |
| 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. |
| The range is wrong or positions look doubled | An SM or STS servo is on this bus. Use the Feetech Rs485 servo Driver for those - the word order differs. |
GetIsMoving or GetCurrent returns nonsense |
The model has no such register. Turn off Has moving register / Has current register. |
| The servo grinds at the end of travel | The min/max positions are past the mechanical stops. The defaults of 23 and 1000 exist for that reason. |
| A servo hums and jitters when holding | Raise the dead band. |
| A servo releases itself under load | Overload or overheat protection tripped. Check GetStatus. |
| A servo vanishes after a baud rate change or factory reset | Its ID went back to 1 and/or its baud rate changed; match the bus settings. |
See also
- Feetech Rs485 servo Driver - the SM, STS and SCS families in one skill
- 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 Bus 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 49 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 Bus 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 Bus 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 Bus servo Driver", "FactoryReset", "servoPort");
GetBusStatus
A one line description of the bus and whether it initialized
Syntax
ControlCommand("Feetech Bus servo Driver", "GetBusStatus")
Returns: String
Example
var result = ControlCommand("Feetech Bus servo Driver", "GetBusStatus");
GetCurrent
The current draw in mA. Only on models with the current register (address 69)
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetCurrent", "servoPort");
GetGoalPosition
The raw position the servo was last told to move to
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetGoalPosition", "servoPort");
GetIsMoving
True while the servo is still travelling to its goal. Only on models with the moving register (address 66)
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetIsMoving", "servoPort");
GetLoad
The present load, -1023 to 1023, where the sign is the direction
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetLoad", "servoPort");
GetPing
True when the servo answers on the bus
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetPing", "servoPort");
GetPosition
The servo's real position as the raw register value (0 to 1023)
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetPosition", "servoPort");
GetPositionDegrees
The servo's real position in degrees from the start of its 200 degree range
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetPositionDegrees", "servoPort");
GetPositionScaled
The servo's real position scaled to the ARCx servo position range like any other servo
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetPositionScaled", "servoPort");
GetServoPorts
The virtual servo ports configured as SCS servos, as strings such as V1
Syntax
ControlCommand("Feetech Bus servo Driver", "GetServoPorts")
Returns: Array of String
Example
var result = ControlCommand("Feetech Bus servo Driver", "GetServoPorts");
GetSpeed
The present speed. Negative is clockwise
Syntax
ControlCommand("Feetech Bus servo Driver", "GetSpeed", (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 Bus servo Driver", "GetSpeed", "servoPort");
GetStatus
The active protections from the servo's last reply, such as overload or overheat. OK when there are none
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetStatus", "servoPort");
GetTemperature
The internal temperature in degrees Celsius
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetTemperature", "servoPort");
GetTorqueEnabled
True when the servo's torque is on
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetTorqueEnabled", "servoPort");
GetVersion
The version the servo reports
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetVersion", "servoPort");
GetVoltage
The supply voltage in volts
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "GetVoltage", "servoPort");
InitializeBus
Open the port and apply every servo's mode and defaults, as happens when the EZB connects
Syntax
ControlCommand("Feetech Bus servo Driver", "InitializeBus")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Bus servo Driver", "InitializeBus");
ReadRegisterByte
Read one byte from the servo's memory table at the address
Syntax
ControlCommand("Feetech Bus 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 Bus 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 Bus 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 Bus servo Driver", "ReadRegisterBytes", "servoPort", 0, 0);
ReadRegisterWord
Read a 16 bit value (high byte first) from the memory table at the address
Syntax
ControlCommand("Feetech Bus servo Driver", "ReadRegisterWord", (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 Bus servo Driver", "ReadRegisterWord", "servoPort", 0);
ReleaseAll
Release (torque off) every configured servo
Syntax
ControlCommand("Feetech Bus servo Driver", "ReleaseAll")
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Bus servo Driver", "ReleaseAll");
ScanBus
Broadcast ping the bus and return a line per servo found (ID, version, status)
Syntax
ControlCommand("Feetech Bus servo Driver", "ScanBus")
Returns: Array of String
Example
var result = ControlCommand("Feetech Bus servo Driver", "ScanBus");
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 Bus 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 Bus servo Driver", "SetBaudRate", "servoPort", 0);
SetDeadBand
The clockwise and counter clockwise dead band, about 0.38 degrees per unit. Larger jitters less. Saved in the servo
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "SetDeadBand", "servoPort", 0, 0);
SetDifferentialSampling
The differential sampling coefficient of the position loop, 0 to 254. Saved in the servo
Syntax
ControlCommand("Feetech Bus servo Driver", "SetDifferentialSampling", (String)servoPort, (Number)value)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | value | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Bus servo Driver", "SetDifferentialSampling", "servoPort", 0);
SetId
Program a new servo ID (0 to 253) into the servo and update the configuration entry to match
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "SetId", "servoPort", 0);
SetIntegralLimit
The limit of the position loop's integral term, 0 to 1023. Saved in the servo
Syntax
ControlCommand("Feetech Bus servo Driver", "SetIntegralLimit", (String)servoPort, (Number)limit)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | limit | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Bus servo Driver", "SetIntegralLimit", "servoPort", 0);
SetJointMode
Put the servo back into position mode by setting its angle limits, and remember it in the configuration. Saved in the servo
Syntax
ControlCommand("Feetech Bus servo Driver", "SetJointMode", (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 Bus servo Driver", "SetJointMode", "servoPort", 0, 0);
SetLedAlarmCondition
Bit flags of the protections that flash the LED: 1 voltage, 4 overheat, 32 overload, 0 turns it off. Saved in the servo
Syntax
ControlCommand("Feetech Bus 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 Bus 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 Bus 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 Bus servo Driver", "SetLock", "servoPort", true);
SetMaxTorque
The maximum output torque, 0 to 1023. Saved in the servo
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "SetMaxTorque", "servoPort", 0);
SetMinimumPWM
The minimum PWM (punch), the smallest output the servo drives the motor with, 0 to 1023. Saved in the servo
Syntax
ControlCommand("Feetech Bus servo Driver", "SetMinimumPWM", (String)servoPort, (Number)pwm)
Parameters
| # | Name | Type | What to pass |
|---|---|---|---|
| 1 | servoPort | Text | Your text, in quotes |
| 2 | pwm | Number | A number, without quotes |
Returns: Boolean [true or false]
Example
var result = ControlCommand("Feetech Bus servo Driver", "SetMinimumPWM", "servoPort", 0);
SetPositionLimits
The raw angle limits the servo will move between, 0 to 1023. Both zero is wheel mode. Saved in the servo
Syntax
ControlCommand("Feetech Bus 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 Bus 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 Bus 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 Bus 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 1023), bypassing the ARCx position mapping
Syntax
ControlCommand("Feetech Bus 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 Bus 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). The servo uses the speed when both are given
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "SetPositionRawTimed", "servoPort", 0, 0, 0);
SetReturnDelayTime
How long the servo waits before answering, 2 s per unit, 0 to 254. Saved in the servo
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "SetReturnDelayTime", "servoPort", 0);
SetSpeed
The raw goal speed for position moves, 0.19 degrees/s per unit, 0 to 1023. 0 is the servo's maximum. Same as setting the port's velocity
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "SetSpeed", "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 Bus 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 Bus servo Driver", "SetStatusReturnLevel", "servoPort|ALL", true);
SetTemperatureLimit
The maximum operating temperature in Celsius, 0 to 100. Saved in the servo
Syntax
ControlCommand("Feetech Bus 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 Bus 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 Bus 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 Bus servo Driver", "SetTorqueEnable", "servoPort", true);
SetTorqueEnableAll
Turn torque on or off for every configured servo
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "SetTorqueEnableAll", true);
SetUnloadingCondition
Bit flags of the protections that release the servo: 1 voltage, 4 overheat, 32 overload. Saved in the servo
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "SetUnloadingCondition", "servoPort", 0);
SetVoltageLimits
The operating voltage window in volts, for example 4.5 and 8.5. Saved in the servo
Syntax
ControlCommand("Feetech Bus 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 Bus servo Driver", "SetVoltageLimits", "servoPort", 0, 0);
SetWheelMode
Put the servo into continuous rotation (motor) mode by zeroing both angle limits, and remember it in the configuration. Saved in the servo
Syntax
ControlCommand("Feetech Bus servo Driver", "SetWheelMode", (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 Bus servo Driver", "SetWheelMode", "servoPort");
SetWheelSpeed
Wheel mode: spin at the raw signed speed, -1023 to 1023, negative for clockwise, 0 to stop. Bypasses the ARCx position mapping
Syntax
ControlCommand("Feetech Bus 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 Bus 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 Bus 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 Bus servo Driver", "WriteRegisterByte", "servoPort", 0, 0);
WriteRegisterWord
Write a 16 bit value (high byte first) to the memory table at the address
Syntax
ControlCommand("Feetech Bus servo Driver", "WriteRegisterWord", (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 Bus servo Driver", "WriteRegisterWord", "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