Skip to content

feat(servo): register the Feetech STS3036 under the STS3215 definition - #150

Merged
pierre-rouanet merged 1 commit into
pollen-robotics:developfrom
arthur-mourgue:feat/feetech-sts3036
Oct 7, 2026
Merged

pierre-rouanet merged 1 commit into
pollen-robotics:developfrom
arthur-mourgue:feat/feetech-sts3036

Conversation

@arthur-mourgue

@arthur-mourgue arthur-mourgue commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Adds the Feetech STS3036 (ST-3036-C001) under the STS3215 definition with model number 521.

This lets LeRobot address the motor by name once huggingface/lerobot#4672 (Feetech buses on rustypot's find_model) lands and a rustypot release includes it. I'm using it for a 3-finger hand replacing the SO-101 gripper.

Bench validation

Tested on hardware using a single ST-3036-C001 connected to a Waveshare Bus Servo Adapter (CH343) at 6V and 1 Mbps.

  • Scanned model number 521 (bytes [9, 2] little-endian at address 3, firmware 3.10)
  • Register map matches the STS3215 table (voltage reads 6.2V, temperature 31°C, limits 0 to 4095)
  • Manual rotation confirms the 12-bit magnetic encoder resolution (4099 steps over one full turn)
  • Position control validated under 30% load limit (4 moves of 30 degrees, errors within 1 step)
  • Python bindings retested with a local wheel (find_model("sts3036") returns 521 and the bus reads actual positions)

Registers 0–86 as read from the servo (raw bytes):

[3, 10, 0, 9, 2, 1, 0, 0, 1, 0, 0, 255, 15, 80, 90, 40, 232, 3, 108, 36, 36, 32, 32, 0, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, 20, 200, 80, 10, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 1, 48, 15, 0, 0, 0, 0, 62, 31, 0, 0, 0, 48, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 1, 10, 50, 1, 160, 250, 250]

Tests pass locally with cargo test, cargo fmt --check and stub_gen.

Related: #113 registers the STS3032 as 2563, in the byte order used before 1.10.0 (where the STS3215 was 2307, now 777). Read little-endian, as here, it would be 778 (bytes [10, 3]), so it is still distinct from 521.

The bench scripts and this change were drafted with an AI coding agent; I ran the hardware checks myself and reviewed everything.

An ST-3036-C001 answers model number 521 (bytes 9, 2 at address 3,
read little-endian as for the STS3215) and reads and moves through the
STS3215 control table: checked on one servo at 6 V and 1 Mbps, on a
Waveshare Bus Servo Adapter (A).

Registering it lets find_model("sts3036") return the STS3215 definition,
so a LeRobot bus built on rustypot can name the motor. The tests pin the
name to its number and definition.
@pierre-rouanet
pierre-rouanet merged commit 5a6d0a0 into pollen-robotics:develop Oct 7, 2026
15 checks passed
pierre-rouanet added a commit that referenced this pull request Oct 13, 2026
Bump the crate version and turn the Unreleased changelog section into the
1.12.0 release notes: a failed sync read names the motor it stopped at
(SyncReadError), and the Feetech STS3036 is registered under the STS3215
definition (#150).

A fast sync read that times out now reports TimeoutError inside a
SyncReadError, where it used to return the port's io::Error.

Assisted-by: Claude:claude-opus-5-5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants