
PSLab
fossasia/pslab-hardware
PSLab Hardware Design and Schematics https://pslab.io

this script installs all the dependencies of my programs and sets up the RaspberryPi to start all the programs on boot using pm2.
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.
A vector laser projector with an easy to understand UI.
UI includes:
I wrote a whole thesis in czech language about this project. It is available in this repository (direct link to the pdf file).
git clone https://github.com/phuid/laser_projector.git
cd laser_projector
bash install.shthis script installs all the dependencies of my programs and sets up the RaspberryPi to start all the programs on boot using pm2.
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
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.
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 controlled by the RPi creates an analog signal between 0 and 5V.
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
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
| LASER | RPi |
|---|---|
| red | GPIO22 |
| green | GPIO27 |
| blue | GPIO17 |
Any 20x4 LCD with an I2C backpack + any rotary encoder with a button LCD connections:
| LCD | RPi |
|---|---|
| Vcc | 5V |
| GND | GND |
| SCK | GPIO3 |
| SDA | GPIO2 |
| backlight | GPIO18 |
encoder connections:
| encoder | RPi |
|---|---|
| A | GPIO5 |
| common | GND |
| B | GPIO6 |
| button1 | GND |
| button1 | GPIO13 |
2 backend programs (lasershow (c++) + wifi_manager (node.js)) and 3 frontend programs (UI (c++) + web_ui (node.js) + discord_bot (node.js))
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
stealth)wifi) -- RPi wifi on and trying to connect to known nearby networkshotspot) -- RPi wifi on transmitting its own wifi which other devices can connect tolasershow 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
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_ARGSTOP (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 runningRELEASE (no args), only handled if game is runningOPTION args: <mode> <option_name> <value>
mode: any of write/read/resetoption_name: any of the following
progresscurrent_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_delaytarget_frame_timerepeattrapeziod_horizontaltrapeziod_verticalvalue only read when using write parameterlasershow 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 existINVALID_CMD: probably typo in a commandOTHERdetails: if error type supports it, details will be includedINFO: <details>
OPTION <name> <val>
point_delayrepeattarget_frame_timetrapezoid_horizontaltrapezoid_verticalSTOPPAUSE <val>
PROJECT <filename>
POS <pos> OF <max>
DISPLAY: <text>: client shall display text to the user and hide it when a new command comes or when user sees itALERT: <text>: client shall display text to the user and only hide it and process following commands after user sees the alerttakes 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 activemode_raw: <MODE_RAW>: MODE_RAW (0-7) as returned by iwgetid --mode --rawmode: <MODE>: MODE based on MODE_RAW; possible outputs: Auto|Ad-Hoc|Managed|Master|Repeater|Secondary|Monitor|Unknown/bugwrite <stealth|wifi|hotspot>
stealth: wifi offwifi: connect to nearby known networkshotspot: create new network, raspberry pi becomes the access point| Qty | Value | Footprint | References |
|---|---|---|---|
| 4 | 10kR | Resistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolder | R5, R6, R11, R12 |
| 4 | 10kR | Potentiometer_THT:Potentiometer_Alps_RK09K_Single_Vertical | Xgain1, Xoffset1, Ygain1, Yoffset1 |
| 4 | Conn_01x02_Male | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Horizontal | +15supply1, laser_B1, laser_G1, laser_R1 |
| 4 | Conn_01x03_Male | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Horizontal | galPWR1, galX1, galY1, pwrSW1 |
| 4 | R | Resistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolder | R2, R3, R8, R10 |
| 2 | 10u | Capacitor_THT:CP_Radial_D5.0mm_P2.00mm | C2, C3 |
| 2 | 1kR | Resistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolder | R1, R7 |
| 2 | 20u | Inductor_SMD:L_Sumida_CR75 | L1, L2 |
| 2 | 47k | Resistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolder | pwrSW_PU1, R15 |
| 2 | 47kR | Resistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolder | R4, R9 |
| 2 | TL082 | Package_DIP:DIP-8_W7.62mm | U2, U3 |
| 1 | 1u | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C1 |
| 1 | 2k2 | Resistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolder | R14 |
| 1 | 39k | Resistor_SMD:R_1812_4532Metric_Pad1.30x3.40mm_HandSolder | R13 |
| 1 | ADC0831 | Package_DIP:DIP-8_W7.62mm | U5 |
| 1 | AOZ1282CI | Package_TO_SOT_SMD:SOT-23-6 | U6 |
| 1 | Conn_01x01_Male | Connector_PinHeader_2.54mm:PinHeader_1x01_P2.54mm_Horizontal | bat_probe1 |
| 1 | Conn_01x04_Male | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Horizontal | encoder1 |
| 1 | Conn_01x05_Male | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Horizontal | LCD1 |
| 1 | D | Diode_SMD:D_SMC_Handsoldering | D2 |
| 1 | D_Schottky | Diode_SMD:D_SMC_Handsoldering | D1 |
| 1 | LM358 | Package_DIP:DIP-8_W7.62mm | U4 |
| 1 | MCP4822 | Package_DIP:DIP-8_W7.62mm | U1 |
| 1 | Raspberry_Pi_2_3 | Connector_PinSocket_2.54mm:PinSocket_2x20_P2.54mm_Vertical | J1 |
It measures 56.3 × 62.8 mm and has 2 copper layers, 1.6 mm thick.
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.
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.
Its repository states no licence, so its author keeps all rights: ask phuid before reusing the design.

fossasia/pslab-hardware
PSLab Hardware Design and Schematics https://pslab.io

MiguelDeTrool/tarbleming
Arduino Nano based random looping sequencer Eurorack module


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



petermaerki/puenterswis_heizung_2023_git
Puenterswis Heizungsersatz, Steuerung Anlage mit Oekofen Kaskade Pellematic Maxi PESK
