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. |