Skip to content

Latest commit

 

History

History
210 lines (158 loc) · 10.2 KB

File metadata and controls

210 lines (158 loc) · 10.2 KB

Blot Firmware — Supported Commands

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:].


Motion (G-codes)

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

Motion notes

  • Missing X or Y holds the previous value on that axis.
  • R-form arcs: positive R takes the short way, negative R takes 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.

Coordinates & units (modal)

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)

Pen / servo (repurposed spindle commands)

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)

Pen notes

  • There's a ~150 ms dwell after each servo command so the mechanical lift/drop completes before motion resumes.
  • M3 without S uses 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.

Machine control (M-codes)

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)

Settings ($ commands)

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)

Tunable settings

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

Persistence

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.

$J= jog

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)

$RST=* — reset to defaults

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=#

Realtime bytes (single byte, not line-buffered)

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

Status states

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 parameters (after a letter)

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


Error codes

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)

Not supported (by design)

  • G17/G18/G19 (plane select) — we're always XY
  • G38.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) — S is 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.