Shop/Stepper Controllers/CANStepper

CANSTEPPER · CLOSED-LOOP CAN NODE

CANStepper: closed-loop NEMA 17 control over CAN, programmable in Python

₹2,899

Same price as on Amazon.in · about $33 USD for international orders

+ shipping · bulk and college pricing available

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
Paid via Cashfree. Ships across India · 30-day returns. Checkout opens securely on grafito.in.
UPIVisaMastercardRuPayAmexNetbankingWallets

// MEASURED PERFORMANCE

Tested, not estimated

PR42HS40-1204AF-02 motor at 24 V, 8 microsteps, SpreadCycle.

~1000 RPMLoaded closed-loop max (800 RPM production default)
0.11°Median settling error (max 0.46°)
478 / 478Settles in a 10-minute soak, with zero faults
31 axesOn one two-wire CAN bus at 1 Mbps

// FEATURES

How CANStepper works

CANStepper mounted on the back of a NEMA 17 motor, with a spare board showing the MT6701 encoder chip on its underside

// 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 diagram: a PC connects by USB-C to board 1; boards 1 to 31 are daisy-chained on one CAN bus with termination ON at boards 1 and 31 and OFF in between, powered from a 24 V DC bus supply

// 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 example: pip install grafito-canstepper, open the bus over USB serial, discover nodes, enable node 1 and move it 360 degrees, then emergency-stop all axes

// 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.
CANStepper pinout photo with labelled connectors: CAN in and CAN out, motor A+ A− B+ B−, micro and NPN switch inputs, USB-C, EN and BOOT buttons and the CAN termination switch

// 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.
CANStepper V2 mechanical drawing showing a 42.28 by 42.28 millimetre board outline, 3.3 millimetre mounting holes, side view and an isometric view

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

Full mechanical drawing (PDF) · STEP files

Good to know: built for robots and multi-axis machines, includes a G-code layer, has no STEP/DIR input, is not a drop-in for 3D-printer firmware, and needs termination at both ends of the bus

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

MCUESP32-C3 (Wi-Fi + BLE)
Motor driverTMC2209, UART, StallGuard4
Motor current2.0 A RMS / 2.8 A peak
EncoderMT6701, 14-bit, 16384 counts/rev
Angle resolution~0.022°
Position loop200 Hz, trapezoidal / S-curve planning
Input voltage5–24 V DC (24 V typical and maximum)
CANTCAN3413, 1 Mbps, up to 31 nodes
ProtocolsGCSP v1 or CANopen CiA 301/402
Other interfacesUSB-C (data), Wi-Fi, Bluetooth
ProtectionOver-temp warning + shutdown, short detection
Operating temp0–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

Datasheet, CAD & code