CANSTEPPER · CLOSED-LOOP CAN NODE
CANStepper: closed-loop NEMA 17 control over CAN, programmable in Python
Same price as on Amazon.in · about $33 USD for international orders
+ shipping · bulk and college pricing availableUSD price · + international shipping from $9 · pay with PayPal
Bolt it on the back of a NEMA 17, pip install grafito-canstepper, and command position from Python over USB or CAN. Missed steps are detected and corrected on the board, and up to 31 axes share one two-wire CAN bus. Designed and supported by Grafito Innovations in Kochi, India.
- Closed loop on the board: 200 Hz position loop, lost steps corrected
- MT6701 14-bit magnetic encoder, ~0.022° resolution
- TMC2209 driver, 2.0 A RMS / 2.8 A peak, StallGuard4
- Up to 31 axes on one two-wire CAN bus at 1 Mbps
- Python library (grafito-canstepper) plus a G-code layer
- Endstop and sensorless homing · E-stop per node, group or whole bus
- 5–24 V DC input · USB-C · Wi-Fi and Bluetooth (ESP32-C3)
CHOOSE YOUR OPTION
Selected: Board Only — ₹2,899
Buy on AmazonAVAILABLE AT AMAZON.IN- Ships worldwide in 1–2 business days from Kochi, India
- 30-day returns on unused units in original packaging
- Defective units replaced (email hello@grafito.in with photos)
- Bulk and college lab quotations with GST
- Engineering support from the team that wrote the firmware
// MEASURED PERFORMANCE
Tested, not estimated
PR42HS40-1204AF-02 motor at 24 V, 8 microsteps, SpreadCycle.
// FEATURES
How CANStepper works

// CLOSED LOOP
Position measured at the shaft, not assumed
An MT6701 14-bit magnetic encoder (16384 counts/rev, ~0.022°) sits under the motor shaft, and the board checks it 200 times per second.
- Lost steps are corrected, not silently accumulated.
- Stalls are detected: a blocked axis faults instead of grinding.
- Closed loop is on by default and can be turned off per node for open-loop stepping.
Measured results are in the performance section above.

// WIRING
One bus, up to 31 axes
Your PC or Raspberry Pi connects over USB-C to any board on the chain; there is no separate CAN adapter. Boards are daisy-chained with 4-pin JST PH 2.0 cables carrying +24V, CANL, CANH and GND, so power and CAN travel together.
- Termination: set the onboard DIP switch (120 Ω) ON only on the two boards at the physical ends of the bus, OFF on every board in between.
- Power: a 24 V DC bus supply is recommended (input range 5–24 V).
- CAN runs at 1 Mbps with up to 31 nodes.

// PYTHON
Your first closed-loop move in about 15 minutes
Firmware comes pre-flashed. Install grafito-canstepper (Python 3.9+, only dependency pyserial), discover the bus and move. The full snippet is in the quickstart below as copyable text.
- G-code layer: G0 / G1 / G28 / M112 with Cartesian and CoreXY kinematics.
- E-stop in three scopes: per node, per group or bus-wide with one broadcast frame.

// CONNECTORS
Every pin, labelled
- CAN IN / CAN OUT: two 4-pin JST PH 2.0, +24V · CANL · CANH · GND, for daisy-chaining.
- Motor: A+ · A− · B+ · B−.
- Switch input: 3-pin JST PH 2.0 for a micro, proximity or inductive switch.
- DIP switch: CAN termination (120 Ω) ON / OFF.
- USB-C: programming, configuration and the Python host link.
- Buttons: EN (reset) and BOOT.

// MECHANICAL
Mounts on the back of any NEMA 17
- Board outline 42.28 × 42.28 mm, matching the 42 mm motor face.
- 4 × Ø3.3 mm mounting holes; M3 × 40 mm screws and 3 mm spacers are in the box.
- The diametric magnet must sit centred over the MT6701 with roughly a 1–2 mm air gap.

// GOOD TO KNOW
Is CANStepper right for your build?
Built for: robot arms and multi-axis robots, camera sliders and turntables, lab and liquid-handling automation, Python and Raspberry Pi motion projects. A G-code layer is included on top of the Python library.
Good to know: there is no STEP/DIR input, since commands arrive over CAN or USB. It is not a drop-in for 3D-printer firmware such as Klipper, Marlin, GRBL or Mach3. Set CAN termination on the two end boards only.
// SPECIFICATIONS
Technical specs
| MCU | ESP32-C3 (Wi-Fi + BLE) |
|---|---|
| Motor driver | TMC2209, UART, StallGuard4 |
| Motor current | 2.0 A RMS / 2.8 A peak |
| Encoder | MT6701, 14-bit, 16384 counts/rev |
| Angle resolution | ~0.022° |
| Position loop | 200 Hz, trapezoidal / S-curve planning |
| Input voltage | 5–24 V DC (24 V typical and maximum) |
| CAN | TCAN3413, 1 Mbps, up to 31 nodes |
| Protocols | GCSP v1 or CANopen CiA 301/402 |
| Other interfaces | USB-C (data), Wi-Fi, Bluetooth |
| Protection | Over-temp warning + shutdown, short detection |
| Operating temp | 0–50 °C (design estimate, not yet characterised) |
Included in the box
- TMC2209 heat sink and encoder magnet
- Ready-made cables (crimped to the length you need on request)
- 4 × M3 40.0 mm socket head screws
- 4 × 3 mm spacers
- NEMA 17 motor (Board + Motor option)
// QUICKSTART
First closed-loop move in about 15 minutes
Firmware comes pre-flashed. Mount the board, seat the magnet, connect 5–24 V and USB-C, then install the library.
Read the quickstart$ pip install grafito-canstepper
from canstepper import CANStepperBus
bus = CANStepperBus.serial("/dev/ttyACM0")
bus.discover()
node = bus.node(1)
node.set_run_current(40).enable()
node.move_to(360.0, blocking=True)
bus.estop_all()
// FAQ
International shipping & buying
Do you ship CANStepper outside India?
Yes, we ship worldwide. International orders can be paid in USD on grafito.in, or contact us at hello@grafito.in for a shipping quote to your country.
Who pays import duties and taxes?
Import duties, taxes and customs fees for international orders are paid by the buyer, as set by your country's customs.
How much is international shipping and how long does it take?
It depends on the destination and order size. Email hello@grafito.in with your country and quantity and we will send a quote.
Can I buy on Amazon?
Yes, buyers in India can order CANStepper on Amazon.in at the same ₹2,899 price.
Questions not covered here? Contact us or email hello@grafito.in.
// DOWNLOADS



