Quick reference for what this firmware accepts. Anything not listed here returns error:20 (unsupported command).
The firmware advertises itself as Grbl 1.1f on connect so standard GRBL senders (UGS, bCNC, OctoPrint + GRBL plugin) recognize it. $I returns [VER:1.1f.Blot:].
| Code | Words | Meaning |
|---|---|---|
G0 |
X Y |
Rapid move at $111 max_rapid (pen-up traversal) |
G1 |
X Y F |
Linear feed move at programmed feedrate |
G2 |
X Y I J or X Y R |
Clockwise arc. I/J = center offset from current; R = radius |
G3 |
X Y I J or X Y R |
Counter-clockwise arc |
G4 |
P<ms> or S<sec> |
Dwell — blocks motion for the specified time |
- Missing
XorYholds the previous value on that axis. R-form arcs: positiveRtakes the short way, negativeRtakes the long way.- Zero-length moves are silently dropped.
- Arc endpoints are exact within ±1 microstep (0.0125 mm) thanks to absolute-target step rounding — drift does not accumulate with segment count.
Origin (0, 0) is the bottom-left corner of the work area. +X is right, +Y is up. Homing is manual — you position the carriage at your desired origin and send G92 X0 Y0.
| Code | Meaning |
|---|---|
G20 |
Coordinates in inches (multiplied by 25.4 internally) |
G21 |
Coordinates in millimeters (default) |
G90 |
Absolute positioning (default) |
G91 |
Relative positioning |
G92 |
X Y — set current position as new work origin (offset) |
G28 |
Rapid to stored origin (the last G92 point, or 0,0 at boot) |
| Code | Meaning |
|---|---|
M3 S<us> |
Pen down. S is the servo pulse width in microseconds (default 1700 µs). Sync-queued: fires in order with motion |
M5 |
Pen up (returns to $150 pulse width, default 1000 µs) |
- There's a ~150 ms dwell after each servo command so the mechanical lift/drop completes before motion resumes.
M3withoutSuses the last-commanded / persisted down value.M3 S<us>persists its pulse width to flash (as$151), so your calibrated down position survives power cycles.
| Code | Meaning |
|---|---|
M17 |
Enable stepper drivers (motors hold position) |
M18 / M84 |
Disable stepper drivers (motors free-wheel) |
M0 / M1 |
Program pause — triggers feed hold, release with ~ |
M2 / M30 |
Program end — no-op (no spindle/coolant to turn off) |
| Command | Returns / does |
|---|---|
$ or $$ |
Dump all settings |
$I |
Build info — [VER:1.1f.Blot:] and [OPT:V,16,128] |
$G |
Parser state — current modal block |
$N=<value> |
Set setting N (see table below) |
$RST=* |
Reset all settings to compile-time defaults (also $RST=$, $RST=#) |
$X |
Clear alarm — no-op ok (we have no alarm state) |
$H |
Not supported (no limit switches on Blot) |
$J=<motion> |
Jog — one-shot move with temporary modal scope (see below) |
$N |
Name | Default | Units |
|---|---|---|---|
$100 |
steps_per_mm |
80.000 |
steps/mm |
$110 |
max_feedrate |
1500 |
mm/min (Cartesian tip cap) |
$111 |
max_rapid_rate |
1500 |
mm/min (G0 rapid cap) |
$112 |
motor_max_rate |
1500 |
mm/min (motor-space physical cap) |
$120 |
max_acceleration |
200 |
mm/s² (Cartesian tip) |
$122 |
motor_max_accel |
500 |
mm/s² (motor-space physical cap) |
$130 |
max_travel_x |
125 |
mm (documentation only; not soft-limit-enforced yet) |
$131 |
max_travel_y |
125 |
mm |
$140 |
junction_deviation |
0.05 |
mm — corner tolerance; smaller ⇒ tighter corners, slower cornering |
$141 |
arc_tolerance |
0.002 |
mm — max chord deviation from true arc |
$150 |
servo_pen_up_us |
1000 |
µs |
$151 |
servo_pen_down_us |
1700 |
µs |
Two tiers for speed and accel. $110/$120 cap the Cartesian tool-path
values; $112/$122 cap motor-space values. The planner takes the minimum
of both per move (load-weighted on diagonals). Tune $112/$122 to your
physical machine limits; use $110/$120 as the "what I actually want to
draw at" cap. See TUNING.md for the procedure.
Settings are persisted to flash (EEPROM emulation). After a $N= command,
the change is held in RAM and written to flash ~500 ms later, once the
stepper is idle — so rapid-fire $N= bursts (from tuning scripts, say)
are coalesced into a single flash write rather than one per command. This
stops flash-erase stalls from locking up the main loop and causing serial
sync issues with senders like UGS.
One-shot move used by senders for arrow-key / step jogging. The text after = is parsed as a motion line; any G90/G91/G20/G21 inside the jog applies only to that jog and does not leak into subsequent lines.
$J=G91X1F300— jog +1 mm in X at 300 mm/min$J=G91X-1Y1F500— diagonal jog$J=G90X50Y50F1000— absolute jog to (50, 50)
Wipes all persisted settings and restores compile-time defaults. Useful when a tuning run has left the stored values in a weird state. The reset propagates through the same debounced save path, so the flash blob updates once the stepper is idle.
$RST=* ; or $RST=$ or $RST=#
These bytes are intercepted before the line parser — they work at any time, even mid-motion.
| Byte | Name | Action |
|---|---|---|
? |
Status | Emit `<State |
! |
Feed hold | Decelerate to zero, hold the planner buffer |
~ |
Cycle start | Resume after hold / release a M0/M1 pause |
0x18 |
Soft reset | Flush planner, clear line buffer, re-emit welcome |
0x85 |
Jog cancel | Abort any in-flight jog and flush the planner |
| State | Meaning |
|---|---|
Idle |
Nothing running, planner empty |
Run |
Motion in progress |
Hold |
Feed hold active (! or M0/M1) |
FS:<feedrate_mm_min>,0 — feedrate is the current Cartesian tip speed. The 0 is the spindle field, always zero since we don't have one.
| Word | Meaning |
|---|---|
X Y |
Axis coordinates |
F |
Feedrate (mm/min, or in/min when in G20). Modal. |
I J |
Arc center offset (from current position). G2/G3 only. |
R |
Arc radius (alternative to I/J). G2/G3 only. |
P |
Dwell milliseconds (G4) |
S |
Seconds for G4 dwell, or servo PWM microseconds for M3 |
Number format: decimal only. Optional -/+ sign, optional fraction. No scientific notation (1e3), no hex (0x10).
GRBL-compatible subset. Returned as error:<N>\r\n.
| Code | Meaning |
|---|---|
1 |
G-code words consist of a letter and a value — letter missing |
2 |
Numeric value format is not valid |
3 |
$ statement is not valid |
4 |
Negative value not allowed |
5 |
Setting disabled |
20 |
Unsupported or invalid G/M code |
21 |
Modal group violation (two codes from the same group on one line) |
31 |
Invalid target |
33 |
Invalid arc radius (R too small, or I/J resolve to zero) |
60 |
Line overflow (exceeded 95-char line buffer) |
G17/G18/G19(plane select) — we're always XYG38.x(probing)G43(tool length offset),G53(machine coord),G54-G59(WCS)G80-G89(canned cycles)G92.1(clear G92 offset)$H(homing — no switches on Blot)$C(check mode),$SLP(sleep)$N0/$N1(startup blocks)- Tool change (
T,M6) - Coolant (
M7,M8,M9) - Variable spindle (
M3 S<rpm>in RPM sense) —Sis repurposed for servo µs - Z axis (
Z) — 2-axis machine, pen is servo-controlled - Units-per-minute-inverse-time (
G93) - Arcs on planes other than XY
If you need any of these, stock GRBL-HAL on a different board covers them.