ENGINEERING WORKUPrequested by Hank Written 2026-09-27 (Arizona time) · prices checked 2026-09-27

ComMarker B4 upgrade: motorized Z, fixed overhead camera, Raspberry Pi + Pico control

Machine: ComMarker B4 60 W JPT MOPA fiber laser. It has a JCZ/EZCAD-style galvo controller on USB, a 110 × 110 mm lens, a manual Z column with a crank, and dual red focus pointers. Today LightBurn 1.7.08 runs on an Ubuntu ThinkPad, and the laptop webcam streams to this page through MediaMTX.

Recommendation in one paragraph

Split the jobs. A Raspberry Pi 5 becomes the always-on “laser-io” box. It runs the overhead Camera Module 3 (MediaMTX, streaming to laserview), a small Z/relay/status API, and the tunnel to laserview. A Raspberry Pi Pico (one of the ones you already have) handles the real-time side: a TMC2209 drives a NEMA17 on the Z crank, and the Pico reads the home/limit switches, probe, E-stop, door and ARM-key contacts and switches the fume-extractor relay. The Pi talks to it over USB serial. LightBurn has to stay on x86. There is no ARM build, and 1.7.08 is the last Linux release. Keep it on the ThinkPad for now, and later move it to a small x86 mini PC. Once everything else works, you can try MeerK40t + balor (open source, has Pi64 builds, supports BJJCZ boards and MOPA pulse width) as a headless galvo driver on the Pi. A hardwired E-stop + ARM key chain powers the laser and the Z motor, and no software can close it. The web can never fire the laser unless someone at the machine has armed it.

Phase 1 cost≈ $400 – $495 Pi 5, camera, Pico side, Z drive, PSU, E-stop, relay, plus marked estimates for small parts and shipping. ThinkPad stays the LightBurn host. Everything≈ $720 – $820 Adds the belt reduction, geared motor, touch probe and an x86 mini PC ($249.99). An industrial E-stop adds about $45. First stepTake the measurements in §10 (crank shaft, mm per turn, crank torque, clearances) before you order the coupler, pulley or bracket.
Check this first: ComMarker’s current B4 product page lists an “advanced, concealed lifting motor” (electric lifting) on some B4 builds, with up/down buttons. If your column has up/down buttons, a DC lift motor is already inside. You could drive it from the Pico (H-bridge or relays plus limit switches) instead of adding a stepper. It has no position feedback, though, so for repeatable focus heights the stepper in this workup is still the better design. Your unit was described as crank-only, so the rest of this document assumes that. M9

1. Goals & constraints

2. Can a Raspberry Pi drive the galvo controller?

Short answer: not with LightBurn. With open-source software, yes, experimentally.

OptionStatus (checked 2026-09-27)Verdict
LightBurn native on Pi (ARM64 Linux)Doesn't exist. LightBurn’s install docs say 1.7 is the last version compatible with Linux (1.7.08 is the final Linux download), and 2.x supports only Windows 10/11 and macOS. LightBurn’s Linux developer said on their forum that an ARM build is blocked because they depend on libraries that have no ARM builds.❌ Not possible
LightBurn x86 under Box64 emulation on a PiCommunity proofs of concept on the LightBurn forum. Unsupported and fragile, and it would also have to pass the galvo's libusb traffic through emulation.❌ Don't build a machine on it
Windows 11 on ARM on a Pi, running LightBurn x64LightBurn supports Windows-on-ARM, but its USB laser drivers have to be installed manually. Windows on a Pi itself is unofficial. Slow and brittle.❌ Not recommended
MeerK40t + balor driver on the PiOpen source (Python). Balor reverse-engineers the BJJCZ “LMC” boards that EZCAD2 drives (USB 9588:9899). MeerK40t ships MeerK40t_Pi64.tar in release 0.9.8100 (Aug 2025), and PyPI has 0.9.9100. It has galvo ops with MOPA pulse width (1–250 ns), frequency, delays, .cor correction files and red-light framing. It does not have LightBurn’s material library, workflow or camera tools.⚠️ Viable Phase 3 experiment for headless “run this saved job”. Keep LightBurn for design.
LightBurn on a small x86 box (ThinkPad now, mini PC later)Works today. Ubuntu + 1.7.08 keeps your current license and workflow. Windows 11 + LightBurn 2.x gets updates (if your license’s update window allows it) and the 2.1 camera system with IP/network camera support.✅ Recommended for the galvo USB

Only one program can own the galvo USB at a time. If you try MeerK40t on the Pi, move the USB cable (or use a manual USB 2.0 switch) and never have both connected.

3. Recommended architecture

System architecture block diagram: VPS and browsers, Raspberry Pi 5 laser-io box, camera, Pico, TMC2209, NEMA17, LightBurn host, ComMarker B4, and the red hardwired safety chain
architecture.svg: data and control in blue, hardwired safety in red.

Raspberry Pi 5 (“laser-io”)

  • Raspberry Pi OS Lite 64-bit (Bookworm or Trixie), headless, wired Ethernet.
  • MediaMTX with source: rpiCamera. Primary H.264 stream for laserview, plus a secondary MJPEG stream for snapshots and vision.
  • laser-io: a small Python service (FastAPI + pyserial) that owns /dev/laser-pico and exposes Z, relay and status endpoints.
  • laserview agent + outbound SSH tunnel (same pattern as the laptop today). No inbound ports.
  • Pi 5 has no hardware H.264 encoder. MediaMTX falls back to softwareH264, and 1280×720 at 15 fps is light work for a Pi 5. A Pi 4 has the hardware encoder if you already own one.

Pico (real-time I/O)

  • Step pulses with acceleration ramps, homing, soft limits and a motion watchdog.
  • Configures the TMC2209 over single-wire UART (current, microsteps, StealthChop).
  • Reads home/bottom limit, probe, E-stop, door and ARM contacts (NC wiring = fail-safe).
  • Drives the exhaust relay, an optional air valve and a status LED, and monitors 24 V.
  • Read-only on safety. It can report an E-stop but can never enable the laser.

Phases

  1. Phase 1: Pi 5 + camera replaces the laptop webcam. Pico + Z drive + switches + E-stop/ARM chain go in. LightBurn stays on the ThinkPad, and laserview gets Hank-only Z controls.
  2. Phase 2: Camera calibration (lens + homography) and a targeting overlay on laserview. Camera-based height check with the red pointers. Optional touch probe.
  3. Phase 3 (optional): An x86 mini PC replaces the ThinkPad as LightBurn host, or you try MeerK40t/balor on the Pi for headless saved jobs. Keep LightBurn for design either way.

4. Motorized Z axis & auto-focus

Motor sizing (fill in with your measurements)

Required motor torque: T_motor = (F_crank × r_handle) / reduction × 2, which includes a 2× safety factor. Measure the pull force F with a luggage scale at the handle radius r while cranking up M4. Example: 15 N at 40 mm = 0.6 N·m, which is too much for a direct-drive NEMA17 (about 0.59 N·m holding and well under half that usable at speed). Use a 3:1 belt (0.4 N·m at the motor, still marginal) or a 5:1 planetary NEMA17 (17HS19-1684S-PG5, ~$29). If the crank turns easily (≤ 0.15 N·m), direct-drive a plain 17HS19-2004S1.

QuantityFormulaExample
Travel per crank turnmeasure over 10 turns M3assume 2 mm/rev (unknown until measured)
Steps per mm200 × µsteps × reduction / (mm per crank rev)200 × 16 × 1 / 2 = 1600 steps/mm (0.6 µm/step)
Speedmotor rps × mm/rev / reduction3 rps × 2 / 1 = 6 mm/s. Full travel in seconds.
Required accuracydepth of focus of the 110 mm lens (roughly ±0.5 mm; confirm with a focus test)resolution and repeatability are 100× better than needed. Backlash is the real error, so always approach the target from the same direction.

Auto-focus: three levels

  1. Enter thickness (no hardware): type or pick the material thickness and the Pi moves Z. Covers 90 % of jobs.
  2. Camera + red pointers (no extra hardware): the B4’s two red pointers cross at focus. The overhead camera finds both red dots (red-channel blob detection on the MJPEG snapshot), and their separation is proportional to the height error. Calibrate once by stepping Z through ±5 mm and fitting separation against ΔZ. Then “Auto-focus” means measure, move, and verify the dots coincide. Check whether the pointers can be switched on without firing M12.
  3. Touch probe (optional): a pin probe (e.g. BIQU MicroProbe, $25.99) or a microswitch on a spring plunger beside the lens. Z moves down slowly until it triggers, then Z = trigger + offset. Probe with the laser disarmed, and retract before a job.

5. Overhead camera

6. Wiring diagram & schematic

Wiring diagram: mains inlet, E-stop, door switch, ARM key, ComMarker B4, LightBurn host USB, Mean Well 24 V PSU, Raspberry Pi 5 with camera, Pico, TMC2209, NEMA17, switches, IoT relay
wiring.svg: physical wiring. Mains goes through S1 (E-stop) and S3 (door) to the 24 V PSU, and additionally through S2 (ARM key) to the B4. The Pi and IoT relay use an unswitched outlet so the Pi can report an E-stop.
Schematic of the Pico carrier board: Pico pinout, TMC2209 with UART, fuse and bulk capacitors, input conditioning, 24 V sense divider, relay and MOSFET outputs, mains safety chain
schematic.svg: Pico carrier board at pin level. Net flags with the same name connect.

Pico pin map

Pico pinGPIONetConnects toNotes
4GP2STEPTMC2209 STEPPIO or hardware-timed pulses
5GP3DIRTMC2209 DIR
6GP4EN_NTMC2209 EN10 kΩ pull-up to 3V3 = driver off at boot
7GP5DIAGTMC2209 DIAGoptional StallGuard sanity check
11 / 12GP8 / GP9PDN_UARTTMC2209 PDN_UARTUART1 TX via 1 kΩ, RX direct; MS1 = MS2 = GND → address 0
14GP10HOMEZ top switch (NC)all inputs: 1 kΩ series, 10 kΩ pull-up, 100 nF
15GP11ZMINZ bottom switch (NC)hard limit
16GP12PROBEtouch probeoptional
17GP13ESTOPE-stop 2nd NC blockHIGH = pressed or wire cut
19GP14DOORdoor switch 2nd NC blockjumper to GND if no enclosure
20GP15ARMARM key 2nd NO blockLOW = armed
21GP16RELAY_EXHIoT Power Relay +fume extractor
22GP17VALVEMOSFET gate (optional)24 V air-assist solenoid, with flyback diode
24GP18LEDstatus LED via 330 Ω
31GP26/ADC0V24_SENSE100 k / 12 k divider from +24 V24 V → 2.57 V
363V3(OUT)3V3TMC2209 VIO, pull-ups≤ 300 mA total
40VBUS—Pi USBPico powered and connected over one USB cable

Grounding: PSU −V, TMC2209 GND and Pico GND are common (through the driver board). Earth the PSU case and the B4 chassis. Use shielded 4-core motor cable with the shield grounded at the driver end only. Put a 100 µF/50 V electrolytic at the driver’s VM pin. Never unplug the motor while the driver is powered.

7. Pico firmware outline

Recommended: Arduino-Pico core (earlephilhower) + TMCStepper (UART config) + AccelStepper or a PIO step generator. These are mature libraries and keep the code small. Alternative: flash Klipper on the Pico and run Klipper + Moonraker on the Pi (manual_stepper, endstops, output_pin, TMC2209 UART are all built in). That's well-proven stepping with almost no firmware to write, but it's more stack than a single Z axis needs.

// laser-io Pico firmware (outline)
setup():
  pinMode(EN_N, OUTPUT); digitalWrite(EN_N, HIGH);   // driver OFF first
  inputs with pull-ups; 5 ms debounce
  Serial (USB CDC) 115200; Serial2 (UART1 GP8/GP9) 115200 → TMCStepper
  tmc.begin(); tmc.rms_current(CFG.run_ma); tmc.microsteps(16);
  tmc.en_spreadCycle(false); tmc.pwm_autoscale(true); tmc.ihold(CFG.hold_pct)
  watchdog_enable(500 ms)
  state = UNHOMED

loop():                           // never blocks
  watchdog_update()
  read_inputs()                   // HOME ZMIN PROBE ESTOP DOOR ARM, V24
  if ESTOP or V24 < 20 V:  stop_now(); EN_N=HIGH; state=ESTOP   // latched until E-stop released AND host sends RESET
  if moving and (ZMIN or (HOME and dir==up)): stop_now(); fault("limit")
  if moving and host_heartbeat_age > 2 s:  stop_now(); fault("host lost")
  stepper.run()                   // accel ramps
  handle_serial_line()
  every 200 ms: emit STATUS if changed

commands (one line in → one JSON line out):
  HELLO                    → {"ok":true,"fw":"lz-1.0","steps_mm":1600}
  STATUS                   → {"z":42.315,"homed":true,"moving":false,"estop":false,
                              "door":true,"armed":false,"probe":false,"lim":[0,0],"v24":24.1,"fault":null}
  HOME                     → up at low speed to HOME, back off 1 mm, re-approach slowly, z := Z_TOP
  MOVE <z_mm> [mm_s]       → absolute; refused unless homed, not ESTOP, inside soft limits;
                              final approach always from above (backlash), then report
  JOG <dz_mm>              → relative, max 10 mm per command
  PROBE [max_mm]           → slow down until PROBE, report z, back off 2 mm
  STOP                     → controlled decel
  FREE / HOLD              → disable / enable driver (manual crank)
  RELAY exh|valve 0|1      → outputs (exhaust stays controllable during E-stop)
  CFG key=value …          → run_ma, hold_pct, steps_mm, soft_min, soft_max, z_top (saved to flash)
  PING                     → heartbeat (host sends every 500 ms while a move is active)
  RESET                    → clear latched fault (only if ESTOP released)

never:  anything that touches laser emission. The Pico reports ARM/ESTOP/DOOR only.

udev (on the Pi) gives it a stable name: SUBSYSTEM=="tty", ATTRS{idVendor}=="2e8a", ATTRS{serial}=="<your-pico-serial>", SYMLINK+="laser-pico".

8. Pi software stack & laserview integration

Camera: MediaMTX with rpiCamera

# /etc/mediamtx/mediamtx.yml (Pi) — excerpt; MediaMTX arm64 release (v1.21.x at time of writing)
rtspAddress: 127.0.0.1:8554        # local only; the tunnel carries the stream
hls: no
webrtc: no
paths:
  cam:
    source: rpiCamera
    rpiCameraWidth: 1280
    rpiCameraHeight: 720
    rpiCameraFPS: 15
    rpiCameraBitrate: 2500000
    rpiCameraAfMode: manual          # lock focus after setup
    rpiCameraLensPosition: 4.5       # dioptres — set from your setup (measure)
    # publish to the laserview server over the tunnel (same as the laptop does today)
    runOnAvailable: ffmpeg -rtsp_transport tcp -i rtsp://127.0.0.1:8554/cam -c copy -f rtsp rtsp://…publisher…@127.0.0.1:<tunnel-port>/laser
    runOnAvailableRestart: yes
  snap:
    source: rpiCamera
    rpiCameraSecondary: true         # MJPEG by default for secondary streams
    rpiCameraWidth: 1536
    rpiCameraHeight: 864
    rpiCameraFPS: 5
    rpiCameraMJPEGQuality: 85

(Older MediaMTX releases call the hook runOnReady. The publisher credential stays in the Pi's env file and never goes into the page or a repo.) Nothing changes on the laserview server: the Pi simply takes over as the publisher of the laser path. The existing on/off toggle keeps working, with the Pi's agent starting and stopping the camera path instead of the laptop's.

laser-io API (FastAPI on the Pi, loopback + LAN only)

MethodPathDoesGuards
GET/statusPico status + camera + service healthread-only
POST/z/homehome Znot ESTOP, no job active
POST/z/move {"z_mm":…}absolute movehomed, soft limits, no job active
POST/z/jog {"dz_mm":…}relative (≤ 10 mm)same
POST/z/focus {"lens":"110","material_mm":3.2,"offset_mm":0}compute and move to focus heightsame
POST/z/autofocusred-dot camera method, or probe if fittedlaser disarmed
POST/z/stop, /z/freestop / release motoralways allowed
POST/relay/exhaust {"on":true}fume extractoralways allowed
GET/camera/snapshot.jpgstill from the MJPEG secondaryread-only

9. Mechanical notes

Mechanical concepts: direct-drive coaxial NEMA17 with flexible coupler, GT2 belt reduction with side-mounted motor, and camera post geometry
mechanical.svg: concept sketches, not to scale. The orange tags match the measurement list below.

10. Measurements Hank must take

#MeasureHowDecides
M1Crank shaft diameter, flats/keyway, materialcalipers, handwheel removedcoupler / pulley bore
M2Shaft protrusion length; tapped holes on the column top cap (size, spacing)calipers, thread gaugebracket design
M3Travel per crank turnmark the handle, 10 turns, measure head travelsteps/mm, speed
M4Torque to crank UP (top and bottom of travel)luggage scale at the handle, × handle radiusdirect vs 3:1 belt vs 5:1 geared
M5Focus distance per lens (lens bottom → work surface) and total Z travelComMarker’s handwritten value + your own focus testZ calibration, soft limits
M6Backlashdial indicator on the head, reverse direction, note dead angleapproach-direction strategy
M7Does the head drift down when the crank is released?observe with the crank freehold current / brake
M8Clear space around the crankmeasure the envelope (NEMA17 = 42 × 42 × 48 mm + bracket)Option A vs B
M9Up/down buttons present (electric lift)?look at the column and control panelstepper vs reuse the DC motor
M10Camera post location: free spot on the base, distance to field center, lens-bottom height at focusrulercamera tilt / lens choice
M11Galvo board USB IDlsusb on the ThinkPad (expect 9588:9899 for BJJCZ LMC)MeerK40t / balor compatibility
M12Red pointers: always on, or switchable? Where are they powered from?observe, trace the wirescamera auto-focus method
M13B4 mains current (rating label)read the label / inlet fuseE-stop and key contact rating, fuse
M14Spare galvo-board output for a “marking” signal (optional)board silkscreen / LightBurn galvo port settingshardware job-active interlock

11. Bill of materials

PartQtyPurposeExample part / link
Compute & camera
Raspberry Pi 5, 4 GB1laser-io box: camera, API, tunnelPiShop SC1111 (Pi 4 4 GB OK: SC0194)
Raspberry Pi 27 W USB-C PSU1Pi power (unswitched outlet)PiShop SC1158
Official Pi 5 case + fan1cooling (software H.264 encode)Adafruit 5816
microSD 64 GB A21OSOfficial Raspberry Pi microSD (PiShop)
Camera Module 3 (standard)1fixed overhead cameraAdafruit 5657 (Wide: 5658)
Pi 5 camera FFC 22→15-pin, 500 mm1camera cableAdafruit 5820
Motion & I/O
Raspberry Pi Pico1real-time I/Oowned (spare: Pico 2, PiShop)
TMC2209 StepStick driver1quiet stepper driver, UART configBTT TMC2209 or Adafruit 6121
NEMA17 stepper 2 A / 59 N·cm1Z drive (direct / belt)StepperOnline 17HS19-2004S1
(alt) NEMA17 with 5:1 planetary(1)if the crank is stiff (M4)17HS19-1684S-PG5
NEMA17 mount1starting point for the motor bracketAdafruit 1297 (or printed)
Flexible coupler 5 mm → crank Ø1Option AAdafruit 1176 (5→8 mm); pick the bore after M1
GT2 20T pulley + 40/60T pulley + closed belt1 setOption BUltiMachine 20T; large pulley bored to M1
Roller-lever microswitch2Z home + bottom limitAdafruit 819
Touch probe (optional)(1)measured heightBIQU MicroProbe V2
Pico carrier: perfboard + passives (or terminal-block board)1board in schematic.svgDIY, or Adafruit 5095 Pico terminal block
Power & safety
Mean Well LRS-100-24124 V motor supply (E-stop switched)TRC Electronics
E-stop 22 mm latching, NC ≥10 A (+ 2nd NC block)1kills laser + motor powerLAY37-01ZS (Newegg); industrial: Siemens 3SU1000-1HB20-0AA0 (RS)
ARM key switch 22 mm (NO, key out in OFF) + 2nd contact1local arming, gates B4 mainsany 22 mm key selector, ZB2-style contact blocks
Fused IEC inlet, outlets, enclosure1E-stop / electronics boxgeneric
Adafruit Controllable Four Outlet Power Relay v21fume extractor on/off, no mains solderingAdafruit 2935
Mechanical
2020 extrusion 610 mm1camera postAdafruit 1221
2020 double corner brace2post to base / armAdafruit 1259
Brackets, M3/M4 screws, T-nuts, filament—motor, switch, camera mountsprinted or aluminum plate
Optional
x86 mini PC(1)Phase 3 LightBurn host (frees the ThinkPad)GMKtec NucBox G3S N95 8/256

12. Price list (real prices, cited)

All prices are USD, listed on the vendor's own product page and checked 2026-09-27. Prices exclude tax and shipping. Stock was “in stock” on the product page unless noted. Rows marked ESTIMATE are my estimates, not quotes. Prices move: Raspberry Pi boards and mini PCs are noticeably more expensive in 2026 than at launch.

ItemQtyVendor (checked 2026-09-27)UnitLine
Phase 1 core — looked-up prices
Raspberry Pi 5 4 GB (SC1111)1PiShop.us$110.00$110.00
Raspberry Pi 27 W USB-C PSU (SC1158)1PiShop.us$12.95$12.95
Official Raspberry Pi 5 Case + Fan1Adafruit #5816$12.00$12.00
Official Raspberry Pi microSD 64 GB A21PiShop.us$39.95$39.95
Camera Module 3 standard1Adafruit #5657 (PiShop also $29.25)$29.25$29.25
Pi 5 FPC camera cable 500 mm1Adafruit #5820$2.50$2.50
Raspberry Pi Pico1already owned$0.00$0.00
BTT TMC2209 driver (1 pc)1biqu.equipment$7.89$7.89
NEMA17 17HS19-2004S11StepperOnline (omc-stepperonline.com)$9.62$9.62
NEMA-17 stepper mount w/ hardware1Adafruit #1297$8.95$8.95
Aluminum flex shaft coupler 5→8 mm1Adafruit #1176$4.95$4.95
Mean Well LRS-100-241TRC Electronics$16.48$16.48
Micro switch w/ roller lever2Adafruit #819$1.95$3.90
22 mm latching E-stop 1NC (LAY37-01ZS)1Newegg (listing 297-004Y-01482)$7.99$7.99
Controllable Four Outlet Power Relay v21Adafruit #2935$39.95$39.95
Slotted aluminum extrusion 2020 × 610 mm1Adafruit #1221$7.50$7.50
2020 double corner brace2Adafruit #1259$1.95$3.90
Subtotal — looked-up prices$317.78
Phase 1 core — ESTIMATES (not quotes)
22 mm key selector switch + extra contact blocks (E-stop/key signal)1ESTIMATE$10–25
Passives/connectors: 100 µF 50 V, 100 nF, resistors, JST/screw terminals, 2 A fuse + holder, perfboard1ESTIMATE$15–25
Wire: mains-rated 18 AWG, 22 AWG signal, 4-core shielded motor cable, ferrules, heat-shrink1ESTIMATE$10–20
Enclosure + fused IEC C14 inlet + C13 outlets for the safety box1ESTIMATE$20–35
Bracket material (filament / Al plate), M3/M4 screws, T-nuts1ESTIMATE$5–20
Shipping across ~6 vendors—ESTIMATE$25–50
Subtotal — estimates$85–175
Phase 1 total (ThinkPad stays LightBurn host)≈ $403–493
Options — looked-up prices unless marked
NEMA17 5:1 planetary 17HS19-1684S-PG5 (replaces the plain motor: +$19.24)1StepperOnline$28.86+$19.24
GT2 20T pulley, 5 mm bore1UltiMachine$11.00$11.00
GT2 40/60T pulley bored to crank Ø + closed-loop 6 mm belt1ESTIMATE$12–23
BIQU MicroProbe V2 (touch probe)1biqu.equipment$25.99$25.99
Adafruit Terminal Block Breakout for Pico (no-solder carrier)1Adafruit #5095$24.95$24.95
Camera Module 3 Wide instead of standard1Adafruit #5658$38.50+$9.25
Industrial E-stop Siemens 3SU1000-1HB20-0AA0 instead of budget one1RS Americas (us.rs-online.com listing)$52.67+$44.68
Raspberry Pi 4 4 GB instead of Pi 5 (has HW H.264 encoder)1PiShop.us$100.00−$10.00
Spare Pico 21PiShop.us$5.00$5.00
x86 mini PC: GMKtec NucBox G3S (N95, 8 GB / 256 GB)1gmktec.com$249.99$249.99
(comparison) Beelink EQ14 N150 16 GB / 500 GB (pre-order)—bee-link.com$385.00—
Everything (Phase 1 + geared motor + belt set + probe + mini PC)≈ $721–822

Arithmetic: $317.78 + $85–175 = $402.78–$492.78. Adding $19.24 + $11.00 + $12–23 + $25.99 + $249.99 gives $720.99–$821.99.

13. Safety

This is a Class 4 laser

14. Build & test plan

  1. Take M1–M14. Choose Option A or B and direct-drive vs geared. Order parts.
  2. Bench-build the Pico board. Flash the firmware. With the motor on the bench, test UART config, current, direction and microsteps, and confirm the driver stays disabled at boot.
  3. Build the safety box (E-stop, ARM key, door jumper). Verify with a meter that pressing E-stop removes 24 V and B4 mains, that the key gates only the B4, and that the Pico sees each contact.
  4. Set up the Pi: OS, MediaMTX with the camera, then laser-io. Test /status, home, and moves from the Pi shell.
  5. Mount the motor and limit switches on the column. Home repeatedly and measure repeatability with a dial indicator (target ≤ 0.02 mm). Calibrate Z_TOP and focus per lens with a focus-ladder test.
  6. Mount the camera. Lock focus. Do lens calibration and homography, then add the red-dot auto-focus calibration.
  7. Switch laserview's publisher from the laptop to the Pi. Add the Hank-only Z panel to laserview.
  8. Optional: set up the mini PC as LightBurn host, and/or run a MeerK40t trial with the galvo USB moved to the Pi (one host at a time).

15. Sources (checked 2026-09-27)

Engineering workup for Hank · laserview.hankelsner.tech/workup/index.html · 2026-09-27. Diagrams: architecture.svg · wiring.svg · schematic.svg · mechanical.svg. Treat values marked “measure” or ESTIMATE as unconfirmed until checked on the machine or quoted.