
Servo motor
tomrodinger/servomotor
Open-source NEMA-17 integrated servomotor (motor + closed-loop driver + controller + encoder). RS-485, Python/Arduino libraries, MCP server for AI control. Hardware, firmware and software.

Open-source NEMA-17 integrated servomotor (motor + closed-loop driver + controller + encoder). RS-485, Python/Arduino libraries, MCP server for AI control. Hardware, firmware and software.
Coin Cell Tester is an open-source printed circuit board by tomrodinger, from the tomrodinger/servomotor repository on GitHub, published under the MIT licence. It is a 2-layer board of 98.9 × 91.4 mm with 204 parts on 90 nets, routed with 1,255 tracks and 184 vias.
It is built around the STM32G030C8T6, RS485 and CJ431, with the ME6211C33R5G, SN75176BDRG and AO3400A among its other parts. Its parts include 120 resistors, 40 transistors, 10 diodes, 8 capacitors and 6 connectors. It belongs with the robots and motor control and interfaces and adapters boards and the STM32 boards of this library.
The M17 is a NEMA-17 integrated servomotor: motor, closed-loop driver, motion controller and magnetic encoder in one unit. It daisy-chains over RS-485, ships with Python and Arduino libraries, and has a first-party MCP server so an AI assistant (Claude Desktop, Claude Code, Cursor, …) can drive real motors from plain English.
Hardware, firmware and software are all in this repository under the MIT license.
| M17-34 | M17-40 | M17-48 | M17-60 | |
|---|---|---|---|---|
| Length | 33.5 mm | 40.1 mm | 48.7 mm | 59.7 mm |
| Holding torque | 0.28 N·m | 0.42 N·m | 0.55 N·m | 0.65 N·m |
| Weight | 210 g | 285 g | 360 g | 470 g |
All sizes: 12–24 V, up to ~1.1 A, up to 560 RPM, closed-loop 32 kHz control, RS-485 at 230400 baud, 64-bit unique ID + one-byte alias per motor, standard NEMA-17 mount. Indoor use (IP20).
Buy one: gearotons.com (from $20; ships worldwide from Shenzhen). Documentation: 9o.at/M17_1.5 · Datasheet (PDF) · Python API · Arduino API
pip install servomotorimport time, servomotor
servomotor.open_serial_port() # prompts for the USB–RS-485 adapter the first time
m = servomotor.M3("X", time_unit="seconds", position_unit="shaft_rotations")
m.enable_mosfets()
m.trapezoid_move(1.0, 1.0) # one full turn, in one second
time.sleep(1.1)
m.disable_mosfets()
servomotor.close_serial_port()That is python_programs/example_trapezoid_move.py.
Units are yours to choose (degrees, rotations, radians, encoder counts; seconds or milliseconds) —
the library converts. No STEP/DIR timing, no microstep configuration.
Install the Servomotor library by Gearotons from the Arduino Library Manager, or from
Arduino_library/. Wire the board's UART to an RS-485 transceiver, then:
#include <Servomotor.h>
void setup() {
Servomotor motor('X', Serial1); // alias 'X'; the port opens on first use
motor.setPositionUnit(PositionUnit::SHAFT_ROTATIONS);
motor.setTimeUnit(TimeUnit::SECONDS);
motor.enableMosfets();
motor.trapezoidMove(2.0f, 3.0f); // two rotations over three seconds
delay(4000);
Serial.println(motor.getPosition()); // where it actually is, from the encoder
}
void loop() {}That is a trimmed Arduino_library/example_one_move.cpp
(the full file adds the ESP32 RS-485 pin definitions).
uvx --from servomotor-mcp servomotor-mcp # runs with a simulated motor if no hardware is attachedAdd it to Claude Desktop or run claude mcp add gearotons-motor -- uvx --from servomotor-mcp servomotor-mcp,
then ask: "Find my motors, then move the one on the bench to 90 degrees and tell me where it ended up."
Details and the full tool list: Gearotons/servomotor-mcp.
▶ 50-second video: the real motor and this session side by side (recorded 2026-09-09 on a bench M17).
| Folder | Contents |
|---|---|
firmware/ | Motor firmware (STM32G0), plus bootloader_STM32G030/ and bootloader_STM32G031/ |
PCB/ | Schematics, board layouts and 3D (STEP) models of the controller board |
python_programs/ | The servomotor Python library source, examples, test and characterisation scripts |
Arduino_library/ | The Arduino/ESP32 C++ library and examples |
API_documentation/ | Generated Python and Arduino API references (Markdown and PDF) |
servomotor_datasheets/ | Datasheet sources and PDFs (EN, DE, ES, FR, IT, PT), dimension drawings |
production_test_system/, motor_tests/ | How we test motors before they ship |
marketting_page/ | Source of the gearotons.com product page |
The command set is data-driven: every firmware command is defined once in
motor_commands.json and the Python library, the Arduino library and the MCP server are generated
from it, so they always agree.
This backward-compatible M17 release adds Get PID constants (command 48). It returns the configured raw P, I and D values without changing controller or motion state. With the updated Python bindings in this repository:
p, i, d = m.get_pid_constants()The release image targets M17 hardware 1.5, software compatibility code 3. See the release notes for the wire contract, upgrade/rollback commands, client requirements and test evidence.
Direct-drive torque tops out at 0.65 N·m (gear it or go up a frame size for more), it is IP20 and indoor-only, and it is not a STEP/DIR drop-in for an existing 3D-printer board — it wants a serial bus and a host that sends it moves. We would rather you know that before you buy.
Questions and builds: GitHub Discussions · email info@gearotons.com. Issues and pull requests welcome — the whole stack is here to be read, modified and improved.
Built and assembled by Gearotons in Shenzhen. MIT license — see LICENSE.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 32 | DNP | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R10, R14, R16, R18, R19, R20, R30, R31, R32, R33, R34, R35, R42, R43, R44, R45 +16 |
| 18 | 4.7K | Resistor_SMD:R_0603_1608Metric | R2, R3, R6, R7, R25, R29, R36, R37, R38, R39, R40, R41, R57, R58, R59, R60 +2 |
| 16 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q10, Q11, Q12, Q13, Q14, Q15, Q25, Q26, Q27, Q28, Q29, Q30, Q37, Q38, Q39, Q40 |
| 16 | MMBT3904 | Package_TO_SOT_SMD:SOT-23 | Q1, Q2, Q3, Q4, Q6, Q8, Q16, Q17, Q18, Q19, Q21, Q23, Q31, Q32, Q33, Q35 |
| 10 | 1K | Resistor_SMD:R_0603_1608Metric | R28, R71, R113, R114, R115, R116, R117, R118, R119, R120 |
| 9 | KT-0603R | LED_SMD:LED_0603_1608Metric | D1, D2, D3, D5, D6, D7, D8, D9, D10 |
| 8 | 2N3906 | Package_TO_SOT_SMD:SOT-23 | Q5, Q7, Q9, Q20, Q22, Q24, Q34, Q36 |
| 8 | DNP | Resistor_SMD:R_0603_1608Metric | R75, R76, R77, R90, R91, R92, R104, R105 |
| 8 | DNP | Resistor_SMD:R_1210_3225Metric | R84, R85, R86, R99, R100, R101, R110, R111 |
| 8 | DNP | Resistor_SMD:R_0805_2012Metric | R78, R79, R80, R93, R94, R95, R106, R107 |
| 8 | DNP | Resistor_SMD:R_0402_1005Metric | R72, R73, R74, R87, R88, R89, R102, R103 |
| 8 | DNP | Resistor_SMD:R_1206_3216Metric | R81, R82, R83, R96, R97, R98, R108, R109 |
| 7 | 10K | Resistor_SMD:R_0603_1608Metric | R1, R4, R5, R13, R15, R17, R24 |
| 4 | 100nF | Capacitor_SMD:C_0603_1608Metric | C7, C9, C18, C35 |
| 4 | MountingHole | MountingHole:MountingHole_3.2mm_M3 | MH1, MH2, MH3, MH4 |
| 3 | MountingHole | Coin_Cell_Tester:Wire hole | MH5, MH6, MH7 |
| 2 | 1uF | Capacitor_SMD:C_0603_1608Metric | C6, C41 |
| 2 | LOGO | LOGO | G***, G*** |
| 2 | PWR | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J3, J5 |
| 2 | TS-1187A-B-A-B | Button_Switch_SMD:SW_SPST_TL3342 | RST1, SW1 |
| 2 | TestPoint | TestPoint:TestPoint_Plated_Hole_D2.0mm | TP1, TP2 |
| 1 | 1.5K | Resistor_SMD:R_0603_1608Metric | R12 |
| 1 | 100k 1% NTC | Resistor_SMD:R_0402_1005Metric | TH1 |
| 1 | 10K/0.1% | Resistor_SMD:R_0603_1608Metric | R27 |
| 1 | 150 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R23 |
| 1 | 15K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R65 |
| 1 | 19-217/GHC-YR1S2/3T | LED_SMD:LED_0603_1608Metric | D4 |
| 1 | 2.2uF | Capacitor_SMD:C_0603_1608Metric | C1 |
| 1 | 2.8K/0.1% | Resistor_SMD:R_0402_1005Metric | R26 |
| 1 | 300 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R66 |
| 1 | 300K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R21 |
| 1 | 3K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R22 |
| 1 | 4.7uF | Capacitor_SMD:C_0603_1608Metric | C11 |
| 1 | 470 | Resistor_SMD:R_0603_1608Metric | R11 |
| 1 | 5R | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R112 |
| 1 | 600 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R49 |
| 1 | 60K | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R48 |
| 1 | 75 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R50 |
| 1 | BAT | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J6 |
| 1 | CJ431 | Package_TO_SOT_SMD:SOT-23 | U3 |
| 1 | CR2477 | Battery:BatteryHolder_Keystone_105_1x2430 | BT1 |
| 1 | LED | LED_SMD:LED_0603_1608Metric | PWR1 |
| 1 | ME6211C33 | Package_TO_SOT_SMD:SOT-23-5 | U1 |
| 1 | Programming | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J2 |
| 1 | RS485 | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J4 |
| 1 | SN75176BDR | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U5 |
| 1 | STM32G030C8T6 | Package_QFP:LQFP-48_7x7mm_P0.5mm | U2 |
| 1 | Serial Port | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J1 |

tomrodinger/servomotor
Open-source NEMA-17 integrated servomotor (motor + closed-loop driver + controller + encoder). RS-485, Python/Arduino libraries, MCP server for AI control. Hardware, firmware and software.

tomrodinger/servomotor
Open-source NEMA-17 integrated servomotor (motor + closed-loop driver + controller + encoder). RS-485, Python/Arduino libraries, MCP server for AI control. Hardware, firmware and software.

tomrodinger/servomotor
Open-source NEMA-17 integrated servomotor (motor + closed-loop driver + controller + encoder). RS-485, Python/Arduino libraries, MCP server for AI control. Hardware, firmware and software.

tomrodinger/servomotor
Open-source NEMA-17 integrated servomotor (motor + closed-loop driver + controller + encoder). RS-485, Python/Arduino libraries, MCP server for AI control. Hardware, firmware and software.

tomrodinger/servomotor
Open-source NEMA-17 integrated servomotor (motor + closed-loop driver + controller + encoder). RS-485, Python/Arduino libraries, MCP server for AI control. Hardware, firmware and software.

tomrodinger/servomotor
Open-source NEMA-17 integrated servomotor (motor + closed-loop driver + controller + encoder). RS-485, Python/Arduino libraries, MCP server for AI control. Hardware, firmware and software.

Robast-GmbH/PCB_Designs
This repository contains all the necessary files and instructions for the PCBs that are designed using KiCad. Here is an overview of the main components: - .github: Contains Github-specific configurations, including…

maxlab-io/tokay-lite-pcb
Tokay AI Camera - ESP32 camera development board


elagil/net-bmp
An Ethernet-connected SWD/JTAG debug adapter (blackmagic probe)

JoeMighty/opentouch-s3
A modern remake of the Bare Conductive Touch Board: 12 capacitive touch electrodes, MP3/WAV/MIDI audio, and now WiFi, Bluetooth LE, USB-C, a proper LiPo power path, a fuel gauge, line-in, MIDI out, Qwiic and an RGB LED.



punkfab/pcb-corpus
235 real KiCad boards from open-source hardware repositories, prepared as a placement and routing benchmark
It measures 98.9 × 91.4 mm and has 2 copper layers, 1.6 mm thick.
204 parts, built around the STM32G030C8T6, RS485, CJ431 and ME6211C33R5G. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the tomrodinger/servomotor repository on GitHub, at the commit this page was made from: the board is PCB/Coin_Cell_Tester/PCB/V2/Coin_Cell_Tester.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).