Skip to the content
PCBKitNew board
2 layers56.3 × 62.8 mmLaser projector, the printed circuit board in 3D

Laser projector

phuid/laser_projector3

this script installs all the dependencies of my programs and sets up the RaspberryPi to start all the programs on boot using pm2.

Size
56.3 × 62.8 mm
Copper layers
2
Thickness
1.6 mm
Parts
45
Nets
62
Pads
174
Tracks, vias
381, 23
Pours
1
Routed
Yes
KiCad
KiCad 7 (file 20221018)
Created
13 Dec 2021
Updated
19 Jan 2026

Overview

Laser projector is an open-source printed circuit board by phuid, from the phuid/laser_projector repository on GitHub. It is a 2-layer board of 56.3 × 62.8 mm with 45 parts on 62 nets, routed with 381 tracks and 23 vias.

It is built around the TL082, ADC0831BCN and AOZ1282CI, with the LM358 and MCP4822-E/P among its other parts. Its parts include 14 resistors, 6 ICs, 3 capacitors, 2 diodes and 2 inductors.

Main components

5

README

README.md

Raspberry Pi RGB laser projector

A vector laser projector with an easy to understand UI.
UI includes:

  • integrated display control with a rotary encoder,
  • web server on the local network
  • discord bot accesible when the RPi is online

table of contents

thesis

I wrote a whole thesis in czech language about this project. It is available in this repository (direct link to the pdf file).

how to install

bash
git clone https://github.com/phuid/laser_projector.git
cd laser_projector
bash install.sh

this script installs all the dependencies of my programs and sets up the RaspberryPi to start all the programs on boot using pm2.

supported projection file formats

The projector can read and project .ild and (much more popular) .svg file formats. .ild files can be generated using specialised software like laserworld showeditor. .svg files from any editor are internally converted to .ild using this svg2ild.py script from gh/marcan/openlase

hw

My plans include battery power, usually galvos come with a power supply and powering the laser isn't that hard using a step-up. My module takes around 0.45A @ 9V. Make sure you dont brick your pi by taking its power. Raspberry Pis often don't take it well when an undervoltage occurs on their 5V line and they certainly aren't made to power anything more than an LED from their 3.3V PS.

galvos

take -10 to +10V differential signal between to lines (base and inverted), The DAC + opamps circuit which generates this signal is nicely described in this article. My implemetation of it in kicad files can be found in pcb/kicad.

DAC - mcp4822

DAC controlled by the RPi creates an analog signal between 0 and 5V.

amps - TL082

TL082 from texas instruments, each channel has one chip, each chip has two op amps. One opamp inverts and modifies the signal based on the potenciometers (getting the inverted ILDA signal), Second opamp inverts it again for the base ILDA signal

laser

rgb laser module from https://www.laserlands.net/diode-laser-module/rgb-combined-white-laser-module/11010003.html requires 8.5-12V power takes 35kHz TTL / PWM on 3 pins, these pins are connected directly to the raspberry pi

pin connections between the laser module and RPi

LASERRPi
redGPIO22
greenGPIO27
blueGPIO17

LCD + encoder

Any 20x4 LCD with an I2C backpack + any rotary encoder with a button LCD connections:

LCDRPi
Vcc5V
GNDGND
SCKGPIO3
SDAGPIO2
backlightGPIO18

encoder connections:

encoderRPi
AGPIO5
commonGND
BGPIO6
button1GND
button1GPIO13

sw

2 backend programs (lasershow (c++) + wifi_manager (node.js)) and 3 frontend programs (UI (c++) + web_ui (node.js) + discord_bot (node.js))

communication

each backend has its pub/sub sockets lasershow publishes to tcp://localhost:5556 and receives commands from tcp://localhost:5556 wifi_manager publishes to tcp://localhost:5558 and receives commands from tcp://localhost:5559

lasershow

  • backend program that takes care of the actual projecting through controlling the galvos and the laser module

UI

  • allows control of backend programs through the built-in LCD and encoder

web_ui

  • allows control of backend programs through a web interface available on the local network

discord_bot

  • allows control of backend programs through a discord bot

wifi_manager

  • allows switching between three modes of wifi:
    • wifi off (stealth)
    • wifi on (wifi) -- RPi wifi on and trying to connect to known nearby networks
    • access point (hotspot) -- RPi wifi on transmitting its own wifi which other devices can connect to

comms format

lasershow comms

lasershow executable takes commands from all UI processes through a ZeroMQ TCP socket command format COMMAND + + ARG1 + + ARG2 + + + ARG4 -> parse with a simple while loop lol no need for fancy functions

basic commands:

any process can send a command into the socket and all processes will read responses from lasershow executable

  • PROJECT args: <filename>
    • <filename> must have extension .ild otherwise error INVALID_ARG
  • STOP (no args)
  • PAUSE (no args)
  • GAME args: <game_name>
    • game_name is any of the following ``//TODO: game names (not yes implemented)
  • PRESS (no args), only handled if game is running
  • RELEASE (no args), only handled if game is running
  • OPTION args: <mode> <option_name> <value>
    • mode: any of write/read/reset
    • option_name: any of the following
      • progress
      • current_frame - if a projection is active, this will seek to the defined frame of the projection, must not exceed number_of_frames (every pos info gives this argument)
      • point_delay
      • target_frame_time
      • repeat
      • trapeziod_horizontal
      • trapeziod_vertical
    • value only read when using write parameter
responses:

lasershow exec can write to the socket at any time

  • ERROR: <e> <details>:
    • e: any of the following; returned if received command couldn't be parsed correctly
      • E2BIG: too many arguments (option read/reset command probably includes value argument)
      • EINVAL: invalid argument (typo in argument or project filename probably has wrong extension)
      • ENOENT: file doesn't exist
      • INVALID_CMD: probably typo in a command
      • OTHER
    • details: if error type supports it, details will be included
  • there is no success message
  • INFO: <details>
    • details - one of following:
      • OPTION <name> <val>
        • name: name of option being changed; any of:
          • point_delay
          • repeat
          • target_frame_time
          • trapezoid_horizontal
          • trapezoid_vertical
        • val: numeric (float) value of the option
      • STOP
      • PAUSE <val>
        • val: 1 - paused, 0 - not paused
      • PROJECT <filename>
        • filename: filename of the file being projected
      • POS <pos> OF <max>
        • pos: position of coursor in projected file
        • max: size of projected file
  • DISPLAY: <text>: client shall display text to the user and hide it when a new command comes or when user sees it
  • ALERT: <text>: client shall display text to the user and only hide it and process following commands after user sees the alert
wifi_manager comms

takes following commands

  • read: prints out following parameters:

    • wifi_setting: <stealth|wifi|hotspot>
    • wifi_ssid: <SSID>: SSID as returned by iwgetid --raw or iw dev in case hotspot is active
    • mode_raw: <MODE_RAW>: MODE_RAW (0-7) as returned by iwgetid --mode --raw
    • mode: <MODE>: MODE based on MODE_RAW; possible outputs: Auto|Ad-Hoc|Managed|Master|Repeater|Secondary|Monitor|Unknown/bug
  • write <stealth|wifi|hotspot>

    • stealth: wifi off
    • wifi: connect to nearby known networks
    • hotspot: create new network, raspberry pi becomes the access point

Parts

45
QtyValueFootprintReferences
410kRResistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolderR5, R6, R11, R12
410kRPotentiometer_THT:Potentiometer_Alps_RK09K_Single_VerticalXgain1, Xoffset1, Ygain1, Yoffset1
4Conn_01x02_MaleConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Horizontal+15supply1, laser_B1, laser_G1, laser_R1
4Conn_01x03_MaleConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_HorizontalgalPWR1, galX1, galY1, pwrSW1
4RResistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolderR2, R3, R8, R10
210uCapacitor_THT:CP_Radial_D5.0mm_P2.00mmC2, C3
21kRResistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolderR1, R7
220uInductor_SMD:L_Sumida_CR75L1, L2
247kResistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolderpwrSW_PU1, R15
247kRResistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolderR4, R9
2TL082Package_DIP:DIP-8_W7.62mmU2, U3
11uCapacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mmC1
12k2Resistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolderR14
139kResistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolderR13
1ADC0831Package_DIP:DIP-8_W7.62mmU5
1AOZ1282CIPackage_TO_SOT_SMD:SOT-23-6U6
1Conn_01x01_MaleConnector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Horizontalbat_probe1
1Conn_01x04_MaleConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Horizontalencoder1
1Conn_01x05_MaleConnector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_HorizontalLCD1
1DDiode_SMD:D_SMC_HandsolderingD2
1D_SchottkyDiode_SMD:D_SMC_HandsolderingD1
1LM358Package_DIP:DIP-8_W7.62mmU4
1MCP4822Package_DIP:DIP-8_W7.62mmU1
1Raspberry_Pi_2_3Connector_PinSocket_2.54mm:PinSocket_2x20_P2.54mm_VerticalJ1

Questions

How big is the Laser projector PCB?

It measures 56.3 × 62.8 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Laser projector use?

45 parts, built around the TL082, ADC0831BCN, AOZ1282CI and LM358. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Laser projector KiCad files?

From the phuid/laser_projector repository on GitHub, at the commit this page was made from: the board is pcb/kicad/pcb.kicad_pcb and its schematic pcb/kicad/pcb.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Laser projector design in my own project?

Its repository states no licence, so its author keeps all rights: ask phuid before reusing the design.

Similar boards

  • 4 layers99 × 53.3 mmPSLab, the printed circuit board in 3D

    PSLab

    fossasia/pslab-hardware

    PSLab Hardware Design and Schematics https://pslab.io

    199 parts1.7kApache-2.0
  • 2 layers220.9 × 128.5 mmArduino TarbleMing, the printed circuit board in 3D

    Arduino TarbleMing

    MiguelDeTrool/tarbleming

    Arduino Nano based random looping sequencer Eurorack module

    118 parts14
  • 4 layers56.5 × 61.7 mmGalvoDriver, the printed circuit board in 3D

    GalvoDriver

    ManiacalLabs/GalvoDriver

    Galvanometer Controller, DAC and Audio In

    33 parts13
  • 4 layers115.5 × 78 mmDeflection controller, the printed circuit board in 3D

    Deflection controller

    wezelball/crt_esp

    A hardware and software build of a CRT controlled by an ESP32

    35 partsMIT
  • 2 layers58.4 × 50 mmPinpoint core, the printed circuit board in 3D

    Pinpoint core

    lab11/polypoint

    Indoor localization based on the DecaWave DW1000.

    111 parts143Apache-2.0
  • 2 layers55 × 73.5 mmPcb dezentral, the printed circuit board in 3D

    Pcb dezentral

    petermaerki/puenterswis_heizung_2023_git

    Puenterswis Heizungsersatz, Steuerung Anlage mit Oekofen Kaskade Pellematic Maxi PESK

    98 parts1
  • 2 layers99.1 × 99.1 mmCnc, the printed circuit board in 3D

    Cnc

    romanchom/cnc-pcb

    PCB designed for use with GRBL ESP32 as a CNC controller.

    54 parts1