Skip to content

Possible unsafe output range / DC offset when using EtherDream (hardware issue observed) #106

Description

@yurigo

Hello,

First of all, thank you for this library — I've been using it with the simulator and EtherDream and it works really well.
I've adquired a Laserworld DS-1000RGB MK5 + EtherDream (mostly recomended by this post: https://modulaser.app/guides/buy-a-laser). Thank you.

I’m reporting a potentially serious issue or at least asking for clarification about signal ranges and safety when using real hardware.

Setup

  • Laser: Laserworld DS-1000RGB MK5
  • DAC: EtherDream
  • Library: @laser-dac/core, @laser-dac/ether-dream, @laser-dac/draw
  • Mode tested:
    • Simulator → works as expected
    • EtherDream → caused hardware failure (details below)

Code

import dotenv from "dotenv";

import { DAC } from "@laser-dac/core";
import { Simulator } from "@laser-dac/simulator";
import { EtherDream } from "@laser-dac/ether-dream";
import { Scene, Line } from "@laser-dac/draw";

dotenv.config();

// wave.js – animated sine wave using Scene Line segments.
// A colour gradient sweeps along the wave as it scrolls in phase over time.

const dac = new DAC();

if (process.env.DEVICE === "EtherDream") {
  dac.use(new EtherDream());
}
else{
  dac.use(new Simulator());
}

const started = await dac.start();

if (!started) {
  console.error("Failed to start DAC");
  process.exit(1);
}

const scene = new Scene({ resolution: 70 });
const SEGMENTS = 50;
let phase = 0;

function renderFrame() {
  phase += 0.1;
  const stepX = 0.9 / SEGMENTS;

  for (let i = 0; i < SEGMENTS; i++) {
    const x1 = 0.05 + i * stepX;
    const x2 = x1 + stepX;
    const y1 = 0.5 + 0.4 * Math.sin(i * 0.4 + phase);
    const y2 = 0.5 + 0.4 * Math.sin((i + 1) * 0.4 + phase);
    const hue = (i / SEGMENTS + phase * 0.05) % 1;

    scene.add(
      new Line({
        from: { x: x1, y: y1 },
        to: { x: x2, y: y2 },
        color: [
          Math.abs(Math.sin(hue * Math.PI)),
          Math.abs(Math.sin(hue * Math.PI + (2 * Math.PI) / 3)),
          Math.abs(Math.sin(hue * Math.PI + (4 * Math.PI) / 3)),
        ],
      }),
    );
  }
}

scene.start(renderFrame);
dac.stream(scene);

Observed behavior (simulator)

This works fine on the simulator (.env -> DEVICE = Simulator).

Image

Observed behavior (real hardware)

(.env -> DEVICE = EtherDream)

  • Initially, the wave renders correctly
  • After ~5 seconds:
    • the output starts drifting upwards (Y axis)
    • the beam moves towards the top edge
  • Then:
    • the laser shuts down

After this event, the projector no longer starts correctly:

  • X galvo moves during startup
  • Y galvo remains unresponsive
  • the system enters a restart loop (likely protection / "hiccup mode")

Important notes

  • The same code behaves perfectly in the Simulator
  • All coordinates are within [0, 1] as per documentation
  • No obvious out-of-range values are being sent
  • The issue appeared after only a few seconds of normal rendering

Why I'm reporting this

I'm not sure about the root cause. It could be:

  • misuse or incorrect assumptions on my side (e.g. coordinate space or signal expectations)
  • a hardware fault in the laser projector
  • a limitation or behavior of the EtherDream DAC
  • or a missing safeguard / validation in the library when targeting real hardware

However, since the simulator behaves correctly while the real hardware failed, I think it's worth clarifying expected signal ranges and safe usage patterns.

Thanks in advance, any guidance would be really helpful to avoid damaging hardware.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions