Skip to content

Known problems and rules

Read this page before you write code that talks to the servos.

# Problem Rule
1 Goal position uses the same units as present position. An earlier note said “present + offset”. That was wrong. Write goal = present to hold a joint.
2 Goal speed 0 means “do not move” in position mode. Set a nonzero speed cap to move. Set 0 again when you stop.
3 Goal position and goal speed read 0 after power-up. Set every goal to the present position before you set a nonzero speed.
4 Writing a goal turns torque on. Writing the mode turns torque off. After a mode change, write goal = present to hold the joint.
5 In velocity mode, the present position does not include the calibration offset. Do not compare positions across modes.
6 The servos do not enforce the URDF joint limits. Check the limits in software (the players do).
7 After a reversal, J1–J3 can stick for 0.2–0.5 s. Expect it. ILC reduces its effect.
8 Elephant’s documentation names register 22 “I” and register 23 “D”. 22 is D, 23 is I (Feetech’s table).
9 After J6 was turned by hand about 9 turns while limp, it turned away from its goal (+45° in 0.4 s) as soon as motion was enabled. The servo counts turns inside, although it reports one turn only (confirmed 2026-10-06, see Multi-turn). A power cycle cleared it (2026-10-04). Firmware 4.5+ sets J6 to multi-turn, so its reading and its goal count the same turns. With older firmware: after you turn J6 more than half a turn by hand, power-cycle the arm before the next motion.
# Problem Rule
10 Laptop path: a SYNC WRITE followed by a request within ~0.3 ms is lost (24 % with no gap). SYNC WRITE has no reply. Wait ≥ 0.5 ms after each SYNC WRITE (SYNC_WRITE_GAP = 1 ms), or drain the port.
11 ATOM: back-to-back SYNC WRITEs lost the second write on some servos. Verify setup writes by reading them back.
12 Feetech checksums can be 0xFE, which looks like a stock-ATOM frame header. Check every candidate header for length, footer and command.
13 There is no bus arbitration. Only one device drives the bus at a time.
14 Unsupported stock-ATOM queries (for example 0x19) froze the stock ATOM. Use only known commands.
15 Two-byte reads through the stock ATOM (0x53 with a mode byte) gave wrong values. Read one byte at a time, or read the servos directly.
# Problem Rule
16 The FT232R latency timer is 16 ms by default and resets on unplug and on robot power-cycle. Set it to 1 ms each time you connect. The scripts do this.
17 The FT232R and the ATOM’s USB chip have the same USB ID (0403:6001). Select the FT232R by serial (B00033ZX).
18 The old bus functions (read_state, write_goals) allocate ~2 KB per call, so the garbage collector stalled the loop for 30–80 ms at times. Use BusBuffers with read_state! and write_goals! in control loops: they allocate nothing (the players do).
19 On Linux (Raspberry Pi), LibSerialPort.open leaves XON/XOFF output flow control on. A 0x13 byte in a servo reply paused the writes for 100 ms: 96 stalls of 221 ms in a 25 s run (2026-10-04). Open the bus with MyCobot.open_bus(), which turns all flow control off.
# Problem Rule
20 With the ATOM in the arm and the 12 V supply off, the ATOM’s USB powers the servos. Flash the ATOM out of the arm. Then use OTA.
21 With the 12 V supply on, the ATOM’s USB does not connect (checked again on 2026-10-05: macOS sees no USB device). If the USB cable is connected first and the 12 V supply is turned on after, the connection stays. Use OTA updates.
22 The ATOM’s USB corrupts data above 115 200 baud. Flash and read at 115 200 baud.
23 Without firmware that does it, the servos start with torque off (limp arm). The controller firmware holds the pose at power-up. Park the arm before you change firmware.
24 The LED matrix blocks for ~0.75 ms per update. Update it from core 0, never inside the control loop.
25 WiFiUDP is not safe across cores. Only the network task uses the sockets.
26 The ATOM button is out of reach when the arm moves. Do not use it as an emergency stop.
27 Elephant’s documentation lists G19 and G22 (function interface group 6) as general-purpose I/O. They carry the servo bus. Do not use G19 or G22 as I/O.
# Problem Rule
28 A power cycle resets servo goals and speeds, and the arm can sag while the power is off. Support the arm. Expect a new start pose.
29 An OTA update failed once without a reason, and then every retry got “Authentication Failed” with the correct password (2026-10-05). Do not retry many times. Turn the arm off and on (the ATOM restarts), then update again. The cause is not known.