Problem Definition
A vintage (early-1990s) galvanometer laser marking system — a GSI Lumonics Lightwriter-class head driven from a 386-class PC running DOS — is lasing correctly after interlock repair and replacement of a failed G325 galvanometer. The blocking issue is not hardware; it is the vector generator in the bundled marking software.
The shipped software exposes only two text placement modes:
- Linear text at an X/Y offset from field center
- Linear text rotated at an angle about field center
The application is marking bearing rings — text must follow the circumference of the outer and inner race, i.e. each character sits on a circle of radius R and is individually rotated tangentially. Additional requirements, in priority order:
- Mandatory: arc/radial text on a defined radius
- Highly desirable: arbitrary X/Y offset of the arc center, so one V-block fixture serves every bearing size
- Desirable: automatic serialization (incrementing part numbers/date codes)
Why the Legacy Software Cannot Produce Arc Text
DOS-era marking packages of this generation typically store a job as a short list of primitive records (text string, height, pitch, angle, offset) and expand them to vectors at mark time using a stroke font table. The transform applied is a single rigid-body operation on the whole string:
[x'] [ cos a -sin a ][x] [Xoff]
[y'] = [ sin a cos a ][y] + [Yoff]
Arc text requires a per-character transform — each glyph gets its own rotation angle and its own translation onto the circle. That capability is not exposed and cannot be coaxed out of the primitive record set. Two routes exist: generate the per-character vectors outside the software and feed them in, or replace the vector generator (software, and possibly the scan controller board) entirely.
Arc Text Geometry You Must Generate
Whatever route you take, the underlying layout math is the same. Define:
| Symbol | Meaning |
|---|---|
Xc, Yc |
Arc center in scan-field coordinates (V-block fixture offset) |
R |
Marking radius (to character baseline) |
h |
Character height |
w_i |
Advance width of character i (glyph width + inter-character gap) |
θ_0 |
Start angle, measured CCW from +X axis |
Angular advance for each character, in radians:
d_theta_i = w_i / R // arc length / radius
theta_i = theta_0 + sum(d_theta_0 .. d_theta_i-1) + d_theta_i/2
Glyph origin on the circle, and the rotation applied to that glyph's local stroke coordinates:
X_i = Xc + R * cos(theta_i)
Y_i = Yc + R * sin(theta_i)
phi_i = theta_i - pi/2 // text reads upright, outward-facing
phi_i = theta_i + pi/2 // inverted, for text on the inside of a bore
// per-stroke point (u,v) in glyph space -> field coordinates
x = X_i + u*cos(phi_i) - v*sin(phi_i)
y = Y_i + u*sin(phi_i) + v*cos(phi_i)
Practical consequences:
-
Total subtended angle =
(sum of w_i) / Rradians. On a small inner ring this grows fast — check it against the available flat land before committing the fixture. -
Character distortion: at small
R/hratios the top of the glyph is stretched relative to the baseline. Below roughlyR < 5hthe visual result degrades noticeably; reduce height or accept a shorter string. -
Centering: for text centered on a nominal angle
θ_c, setθ_0 = θ_c - (sum w_i)/(2R). - Inner-ring text is usually mirrored in rotation only (
phi = theta + pi/2), not in glyph geometry — do not mirror the strokes or the text reads backwards.
Upgrade Paths, Ranked
| Path | What changes | Effort | Risk / caveats |
|---|---|---|---|
| 1. Off-line vector generation, existing software | Compute arc-text polylines externally, import as a geometry/vector file the legacy package already accepts | Low–medium | Only works if the package imports a documented vector format. No serialization; every serial number is a new file. File transfer to a 386/DOS box needs floppy, DOS-readable media, or a serial link. |
| 2. Replace marking software, keep head and scan controller | Modern vector marking package (e.g. a ProLase-class product supporting circular text and Illustrator/DXF import) on a newer PC | Medium | Only viable if the package has a driver for that specific scan controller card, and if the card is ISA — check that the replacement PC has ISA slots or accept keeping the old chassis. Verify the software licence is transferable and the dongle/key is present. |
| 3. Replace the scan controller card + software | New digital or analog scan controller driving the existing galvo servo amplifiers and laser | Medium–high | Must match the galvo command interface (analog ±V position command vs. digital protocol), laser gate/modulation signalling, and status/interlock I/O. Re-tune and re-calibrate the field. |
| 4. Full head retrofit | New galvo set, driver amplifiers, scan controller, software | High | Cleanest long-term result; obsoletes the existing G325 spares and the original calibration data. Mounting, aperture and f-theta lens compatibility must be confirmed. |
| 5. General-motion CNC control (e.g. LinuxCNC) | Repurpose an open motion controller to drive the galvos | High | Galvo scanning is not step/direction machine motion — there is no trajectory look-ahead model that maps cleanly to jump/mark delays, laser-on delay and polygon delay. Expect to build the vector-to-command layer yourself. Treat as a research project, not a production path. |
For a production bearing-marking cell, Path 2 gives the best return: circular text, arbitrary X/Y offsets and automatic serialization are standard features of vector marking packages, and the optical head and galvos are retained.
Fixture, Offset and Field Calibration
The "one V-block for all bearings" goal is achievable only if the software offset origin and the fixture datum are tied together deterministically.
-
Establish the mechanical datum. A V-block locates a cylinder on its OD, so the part axis sits at a fixed height above the block seat but the axis height changes with OD: for a V-block of included angle
2α, the axis rises byr / sin(α)above the vertex, whereris the part radius. For a 90° block (α=45°), that is1.414 × r. Build this into your offset table — it is the dominant source of the Y offset varying by part number. - Verify the horizontal datum. The V-block centers the part in X automatically; X offset should then be constant across part sizes. Confirm this with a marked test ring rather than assuming it.
- Prove the field scale. Mark a known square or a pair of crosses at a fixed spacing on anodized coupon stock, measure with calipers or an optical comparator, and correct the software's field-size/scale factor. Scale error shows up as radius error, so an uncorrected field makes arc text miss the land.
- Check pincushion/barrel correction. Galvo fields are inherently distorted; the correction is usually a lookup table or coefficient in the controller. Mark a full-field grid and measure corner-to-center deviation. Arc text placed off-center is far more sensitive to this than centered linear text.
- Re-verify after the galvo swap. A replacement G325 will not have identical gain, offset and scale to the failed unit. Confirm zero position and full-scale deflection on both axes before trusting any stored calibration — an axis scale mismatch turns a circle into an ellipse and is the classic post-repair symptom.
-
Build a part-number offset table (part no.,
Xc,Yc,R,θ_0, character height) and recall it by job file. Do not let operators type offsets from memory.
Serialization
Automatic serialization is a software feature, not a hardware one. When evaluating a replacement package, confirm specifically:
- Persistent counter storage that survives power loss and job reload — a counter held only in RAM will repeat serials after a crash.
- Configurable increment, start value, roll-over limit and zero padding.
- Date/shift code fields with a defined roll-over time.
- Whether the serial field can live on the arc path (some packages support counters only in linear text objects). Test this before purchase.
- An external trigger or host-command interface if the counter must advance from a PLC or part-present sensor rather than a keystroke.
Commissioning Verification
| Check | Method | Pass criterion |
|---|---|---|
| Interlock chain | Open each door/shutter switch in turn with beam blocked | Laser-enable drops on every channel |
| Axis scale & orthogonality | Mark 50 mm test square on coupon, measure both diagonals | Diagonals equal within your tolerance; sides equal |
| Arc radius accuracy | Mark full 360° ring at commanded R, measure diameter | Measured R matches commanded R |
| Fixture repeatability | Load/unload same ring 10×, mark witness line | Scatter within land width margin |
| Jump/mark delays | Inspect stroke ends at 10× | No burn-in dots at segment starts, no tail-off at ends |
| Serial counter | Run 20 parts, power-cycle mid-run, resume | No repeats, no skips |
FAQ
How do I calculate character spacing for text on a radius?
Convert linear advance width to angle: d_theta = w / R radians, where w is the glyph advance width and R the baseline radius. Each character is then placed at (Xc + R·cosθ, Yc + R·sinθ) and rotated by θ - 90° for outward-reading text.
Can I keep the original galvo head and just change the marking software?
Usually yes, provided the replacement package ships a driver for your existing scan controller card. Confirm the card model, its bus type (ISA cards limit your PC options), and that the laser gate/modulation and interlock I/O are wired to signals the new software can assert.
Why is my circle marking as an ellipse after replacing a galvanometer?
The replacement galvo does not share the failed unit's gain and scale. Re-calibrate per-axis scale factor and zero offset; an X/Y scale mismatch is the standard cause of circular geometry marking elliptical.
Does a V-block need a different Y offset for each bearing size?
Yes. The part axis height above the V vertex is r / sin(α) for a block of included angle 2α — 1.414·r for a 90° block. Store Yc per part number in a recall table rather than re-teaching it each changeover.
Is LinuxCNC a practical controller for galvo laser marking?
Not as a drop-in. Galvo scanning needs jump delay, mark delay, laser-on/off delay and polygon delay handling that a general machine-tool trajectory planner does not provide, so you would be writing the vector-to-scanner layer yourself. Treat it as a development effort, not a production upgrade path.