Buy the board: CANStepper Adapter Board on the Grafito shop.
Board anatomy
| Component | Role |
|---|---|
| ESP32-C3 | Application MCU: motion planning, closed loop, CAN, USB |
| TMC2209 | Stepper driver, configured over UART; StallGuard4 for sensorless homing |
| MT6701 | 14-bit magnetic encoder (16384 counts/rev), read over SSI at 1 MHz |
| TCAN3413 | CAN transceiver, 1 Mbps |
The board mounts on the back of a NEMA17. The diametric magnet must sit centered over the MT6701 with roughly 1–2 mm air gap; poor magnet placement is the number-one cause of noisy angles.
Characterization motor (docs reference)
Speed tables in Closed-loop speed tuning were measured with a PR42HS40-1204AF-02 NEMA 17 (1.8°, 1.2 A rated, 3.2 mH, 4.2 kg·cm holding, D-shaft Ø4.5×19 mm, frame 42×42×40 mm) on 24 V. Your ceiling will differ with load, supply, and motor inductance.
Pin map
| Signal | GPIO | Notes |
|---|---|---|
| CAN TX / RX | IO21 / IO20 | to TCAN3413 |
| TMC EN | IO3 | LOW = driver energized |
| STEP / DIR | IO10 / IO1 | driven by hardware pulse generator |
| TMC DIAG | IO0 | StallGuard trigger, rising edge |
| TMC UART | IO7 (TX via 1 k) / IO6 (RX) | single-wire PDN_UART |
| Encoder CLK / DO / CS | IO4 / IO5 / IO2 | MT6701 SSI |
| Endstop (HOME) | IO8 | internal pull-up, active-low by default |
Power
- Motor rail: 24 V. Logic is generated on-board.
- USB can power the logic for flashing and configuration, but the motor will not hold or move without the 24 V rail.
- Under very high continuous run current, motor load can stress the shared system enough that USB CDC disconnects. Prefer ~70% current for long high-speed closed-loop duty; keep bulk capacitance on 24 V healthy.
CAN bus rules
- Linear daisy-chain, 120 Ω termination at both physical ends.
- Keep stubs short; twisted pair for CANH/CANL.
- All nodes run 1 Mbps — no configuration needed.
- A node powered alone (nobody to acknowledge its frames) enters bus-off and
recovers automatically once a second node appears; see
get_can_health()if a bus looks quiet.
Endstop wiring on IO8 — read this twice
IO8 is an ESP32-C3 strapping pin: it must be HIGH at reset or the chip may fail to boot.
- Use a normally-open switch to GND. Open at rest = pin HIGH = boots fine.
- A normally-closed switch that shorts IO8 to GND at power-on can brick the boot until the switch is released. If you must use NC, wire it through a series diode/OR gate so the pin is not held low at reset.
- Polarity and behavior are configurable:
endstop_active_high,endstop_enable,endstop_action(report / stop / stop + zero).
IO2 (encoder CS) and IO9 (BOOT button) are also strapping pins; the board pulls them correctly — just don't add external loads to them.
The other strapping consequence
Because IO9 is the BOOT button, "hold a button at power-on" schemes are unreliable on the C3 (holding it enters the serial bootloader instead). Node addressing is therefore done over USB — see the quickstart.