Updates:
- 2023/07/25: moved content from blog into regular pages
- 2023/03/15: adding more Settings for different resins, different default for different firmware version, added preliminary Review
- 2023/03/09: finally published
- 2023/03/05: first prints made, more info on Lychee Slicer, Prusa Slicer SLA, more on magnetic steel plate use, prints with or without support, closeup photos added
- 2022/11/29: added Drip Hook, still preparing the utilities to make first print
- 2022/11/26: Mono 4K arrived, preparing software pipeline (slicer, converters) and working place
- 2022/11/07: starting write-up
Table of Contents
Introduction
The past years I focused on Filament Deposition Manufacturing (FDM) / extrusion based 3D printing, and the time came to focus on MSLA resin based process as well.
My main use case a small pieces, like custom pulleys and idlers – precise parts, such as:
The Anycubic Photon Mono 4K seemed like a good choice to start with:
- build volume: 132 x 80 x 165 mm (WxDxH)
- resolution: XY 35μm, Z 50μm
- 6.1″ display with 4K resolution (3840×2400) display
- monochromatic LCD (hence “Mono”), faster printer due shorter exposure
- affordable with EUR 170-220 (2022/11)
- no network, only USB drive printing
SLA Stereolithography Apparatus – one beam/point light source | MSLA Mask Stereolithography Apparatus – one light source, masking what does not need to be printed | DLP Digital Light Processing – one image, each pixel controlled by micro mirror |
I ordered 2022/11/22 for EUR 170 and received it 4 days later via Anycubic Store within Amazon, along with a few utilities like water wash resins, gloves, etc – ready to MSLA print.
Update 2023/05: the Mono 4K has been discontinued, and replaced with Mono 2 with slightly larger print volume of 143 (+11mm) x 89 (+9mm) x 165 (+33mm).
FDM/FFF vs Resin
FDM/FFF | Resin MSLA |
---|---|
X, Y precision: 100μm Z precision: 50μm minimal structure: 200-600μm1) minimal post-processing minimal toxicity of filament print duration based on printed volume large scale prints affordable 1kg filament EUR 15-30 mixed materials2) | X, Y precision: 35-75μm Z precision: 30-50μm minimal structure: 30-50μm extensive post-processing severe toxicity of resin print duration based on print Z height only large scale prints require expensive printers 1kg resin EUR 30-803) single material |
- depends on nozzle diameter
- multiple printheads/hotends required, e.g. IDEX, tool changer, material changer
- Anycubic sold water wash resins at 22-27 EUR/kg 2023/03 (black, white, clear, grey and waterblue)
Print Settings
- layer height: 0.05mm / 50μm
- exposure time: 2s
- light-off time: 0.5s
- bottom layer count: 6
- bottom exposure time: 40s
- lifting distance: 6mm
- lifting speed: 4mm/s
- retract speed: 6mm/s
- anti-aliasing level: 1
- file formats: pwma (proprietary)
Photon Workshop on Linux
My development environment is Linux, and as of 2022/11 there is no Linux Photon Workshop, the name of the slicer needed to slice for Mono 4K; but you can run it via Wine (a Windows compatibility wrapper):
% wine AnycubicPhotonWorkshop_V2.2.19_x86.exe
and afterwards it is available direct at:
% wine ~/.wine/drive_c/Program\ Files\ \(x86\)/AnycubicPhotonWorkshop/AnycubicPhotonWorkshop.exe
I tried my xyzHollowCalibrationCubeV2 and used auto hollow feature which defaults to 2mm thickness:
This seems to work but is not ideal. The Photon Workshop reveals that Photon Mono 4K supports only .pmwa format, which as it turns out, is PWS format just with the extension .pmwa to avoid mixing up different PWS files for different machines, as the pixel-based slices are hardware dependent now as resolution of the display is set.
Chitubox for Linux
Chitubox Slicer is available for Linux natively and supports a variety of SLA printers, also the Mono 4K:
I also used the auto hollow feature, which defaulted to 1.2mm wall thickness.
Lychee Slicer for Linux
I ended up with the Lychee Slicer which is available for Linux as well, which contains some annoying advertising to wait for when slicing or exporting various formats, but functionality-wise it it is more intuitive than Chitubox Slicer.
Prusa SLA Slicer
As mentioned, the Photon Mono 4K has its own proprietary file-format PWS file to print with, with a particular file extension to indicate which Anycubic MSLA device it is sliced for:
Machine | File Extension | Layer Image Encoding |
---|---|---|
Mono | PWNO | PWS |
Mono SE | PWMS | PWS |
Mono X | PWMX | PWS |
Mono X2 | PMX2 | PWS |
Mono 4K | PWMA | PWS |
S | PWS | PWS |
Zero | PW0 | PW0 |
X | PWX | PWS |
Ultra | DLP | PWS |
D2 | DLP2 | PWS |
Prusa Slicer slices also for MSLA, it’s own .sl1 format, just a ZIP file with a list of PNG files per slice, in order to convert .sl1
to PWS/.pwma
another tool is required:
- UVtools, it can read and write many SLA image formats, incl. PhotonWorkshop (
.pw*
) file-formats - another approach could be (as of 2022/12 not yet) to just convert sl1 to
.photon
with SL1toPhoton command line tool, and extend functionality to support PWS/.pwma
as well - alternatively uv3dp supports pw0 and pws files, but struggles with new(er) PWS files like
.pwma
.photon/ctb/cbddlp vs .pw*
.photon
(and ctb/cbddlp) is an older file format, whereas newer Photon Workshop (PW) has PWS and PW0 encoded images as layers – so far the format seems reverse engineered and somewhat documented via UVTools: PhotonWorkshopFormat.cs
Manufacturer | File Extension | FIle FOrmat |
---|---|---|
Anycubic Photon Mono | .pw* | PWS/PW0 |
Anycubic Photon | .photon | alike CTB |
Elegoo Mars | .ctb | CTB/CBDDLP1) |
Creality LD002 | .ctb | CTB/CBDLP1) |
Phrozen | .phz | CTB/CBDLP1) |
- possibly encrypted, but the algorithm is available
PWS vs SL1
Some deeper dive into the available metadata of PWS vs SL1 format:
PWS (header) | SL1 (prusaslicer.ini) |
“xy_pixel”: 35.0, “z_thickness”: 0.05000000074505806, “exposure_time”: 2.0, “off_time”: 0.5, “bottom_layers_exposure_time”: 40.0, “bottom_layers”: 6.0, “z_lift_height”: 6.0, “z_lift_speed”: 4.0, “z_drop_speed”: 6.0, “total_volume”: 4.853200912475586, “antialiasing_grade”: 1, “x_resolution”: 3840, “y_resolution”: 2400, “weight”: 0.0, “price”: 1.067704200744629, “resin_type”: 36, “layers_count”: 400 | “absolute_correction”: “0”, “area_fill”: “50”, “bed_shape”: “0x0,120×0,120×68,0x68”, “bottle_cost”: “0”, “bottle_volume”: “1000”, “bottle_weight”: “1”, “display_height”: “68”, “display_mirror_x”: “1”, “display_mirror_y”: “0”, “display_orientation”: “portrait”, “display_pixels_x”: “2560”, “display_pixels_y”: “1440”, “display_width”: “120”, “elefant_foot_compensation”: “0”, “elefant_foot_min_width”: “0.2”, “exposure_time”: “10”, “faded_layers”: “10”, “fast_tilt_time”: “5”, “gamma_correction”: “1”, “hollowing_closing_distance”: “2”, “hollowing_enable”: “0”, “hollowing_min_thickness”: “3”, “hollowing_quality”: “0.5”, “initial_exposure_time”: “15”, “initial_layer_height”: “0.3”, “layer_height”: “0.3”, “material_correction”: “1,1,1”, “material_correction_x”: “1”, “material_correction_y”: “1”, “material_correction_z”: “1”, “material_density”: “1”, “material_print_speed”: “fast”, “max_exposure_time”: “100”, “max_initial_exposure_time”: “150”, “max_print_height”: “200”, “min_exposure_time”: “0”, “min_initial_exposure_time”: “0”, “output_filename_format”: “[input_filename_base].sl1”, “pad_around_object”: “0”, “pad_around_object_everywhere”: “0”, “pad_brim_size”: “1.6”, “pad_enable”: “1”, “pad_max_merge_distance”: “50”, “pad_object_connector_penetration”: “0.3”, “pad_object_connector_stride”: “10”, “pad_object_connector_width”: “0.5”, “pad_object_gap”: “1”, “pad_wall_height”: “0”, “pad_wall_slope”: “90”, “pad_wall_thickness”: “2”, “printer_technology”: “SLA”, “relative_correction”: “1,1”, “relative_correction_x”: “1”, “relative_correction_y”: “1”, “relative_correction_z”: “1”, “slice_closing_radius”: “0.049”, “slicing_mode”: “regular”, “slow_tilt_time”: “8”, “support_base_diameter”: “4”, “support_base_height”: “1”, “support_base_safety_distance”: “1”, “support_buildplate_only”: “0”, “support_critical_angle”: “45”, “support_head_front_diameter”: “0.4”, “support_head_penetration”: “0.2”, “support_head_width”: “1”, “support_max_bridge_length”: “15”, “support_max_bridges_on_pillar”: “3”, “support_max_pillar_link_distance”: “10”, “support_object_elevation”: “5”, “support_pillar_connection_mode”: “dynamic”, “support_pillar_diameter”: “1”, “support_pillar_widening_factor”: “0”, “support_points_density_relative”: “100”, “support_points_minimal_distance”: “1”, “support_small_pillar_diameter_percent”: “50%”, “supports_enable”: “1” |
Notes:
- PWS:
xy_pixel
dictates square pixelsx_resolution
&y_resolution
withxy_pixel
give actual build area- build height (Z) determined via
layers_count
*z_thickness
, assuming equal layer heights
- SL1:
- does not report layer counts, but be determined from the amount of enclosed .png files
- does not support multi-exposure printing
- does not report layer counts, but be determined from the amount of enclosed .png files
PWS | SL1 |
---|---|
x_resolution [px] | display_pixels_x [px] |
y_resolution [px] | display_pixels_y [px] |
xy_pixel [μm] | display_pixels_x / bedshape[x] * 1000 [μm] |
layers_count | len(<*.png>) |
Replacing Firmware
MSLA resin printers are quite closed systems without much information of the hardware, firmware, and additional having their own proprietary file formats which contain the layer images.
For the Anycubic Photon Mono 4K is an open source firmware available, Turbo Resin – which gave me a good reason to get this 3D printer (2023/07: the firmware isn’t complete yet). Along with it, the hardware has been pretty much reversed engineered.
Anycubic Firmware | Turbo Resin (2022/12) |
---|---|
– PW0/PWMA format | – PW0/PWMA & CTB format |
Custom MSLA Slicer
Pondering on a custom MSLA slicer:
- automatic hollowing of solids at certain wall thickness
- automatic support generation, outside and inside (after hollowing)
- drain hole generation
- command line interface (CLI)
- external preview of sliced part
- supporting sl1 and pws/pw0 as a start
Feature | Prusa Slicer | Lychee Slicer | ChituBox Slicer |
---|---|---|---|
command line interface (CLI) | Y | – | – |
automatic hollowing | Y | Y | Y |
drain holes | Y | Y | Y |
automatic support | Y | Y | Y |
Linux support | Y | – | – |
PWS support | – | Y | Y |
Open MSLA Format
Unfortunately there is no open (M)SLA format, each manufacturer kind of does its own, whereas G-code .gcode
has some conformity, although G-code in general is also machine specific has it has absolute positioning, which differ from machine to machine, but at least G-code is easy to compose unlike proprietary (M)SLA file formats.
SL1 format by Prusa Engineering is a simple ZIP file which contains:
config.ini
: irrelevant infoprusaslicer.ini
: info about printer (bed size), pixel density, and many slicer settings*.png
: enumerated image files per slice in PNG format
and thereby is open enough for my taste.
Requirements of Open MSLA Format
- simple format for controller to decode
- simple pixel data1)
- simple preview image format1)
- this is why PWS/PW0 or CTB fileformat use some simple RLE algorithm to compress pixel data
First Print
After many weeks postponing, as I wasn’t eager deal with the inherent messiness of resin printing, I gave it a shot with some of the Triply Periodic Minimal Surfaces (TPMS) (2023/03/05):
The Lychee Slicer gave 1h 15m print time, the printer itself showed 2h 15m; I used Anycubic White Water Wash Resin. I used automatic supports, and it printed 5 pieces successful, 3 pieces failed and only apprx. 4mm Z height were printed, interestingly all 3 failed pieces failed at the same Z height and broke off and stuck at the print plate.
I reprinted the 3 failed pieces at the same place, and this time they succeeded – which is strange as I suspected perhaps uneven light or some other positional inconsistency, but obviously the position did not matter, which is bad as I don’t know what caused the first failed print.
The curved bottoms (not directly printed but with diverse support pipes) already showing severe distortion while printing.
Update: It seems my office rooms aren’t warm enough, so the bed adhesion isn’t optimal as I read up in some forum posts. I tried to print a few other pieces, all failed the next day in the room with 15-19C° – the prints detached after 2-3mm height from the build plate. I moved it to another warmer room, warmed the resin on the radiator which helped.
The overall quality of the pieces is astonishing, no visible voxels or layers are seen, incredible quality for those prints which didn’t fail.
Yet the failure rate is still significant for my taste, so I need to pay close attention to room temperature, and other aspects:
The cause of the “delimination” isn’t clear yet to me, it seems the prints with proper support and elevated bottom printed better, but I need to confirm with more prints.
More photos you find at MSLA printing Triply Periodic Minimal Surfaces (TPMS).
Curing Station
As a start I assembled a simple DIY curing station with a 5m UV LED strip and placed it inside a plastic cup, with some aluminium foil at the bottom and top lid:
I only cure for 4-5mins, longer exposure changes the white resin into yellowish tint, and indicates over curing.
Keeping Resin in the Vat
After a print, the resins needs to be filtered for impurities, such as partial cured pieces not attached to the part, with a funnel and filter into a cup or bottle, and then it can be poured back into the vat ready to print again.
One can leave the resin in the vat for weeks, if you stir the resin short before you print again – stirring the resin within the vat is not ideal, as one has to avoid to scratch or FEP film; yet there is no need to pour resin back into the bottle unless one changes the resin, like the brand or color.
Drip Hook
I remixed an existing drip hook for Photon Mono to fit Photon Mono 4K, and make it easier to slide the bed on and off.
Download
- Printables: Photon Mono 4K Drip Hook (STL)
Spring Steel Build Plate
Additionally I’ve got a spring steel build plate 135x80mm with a magnetic base for EUR 10 (2022/12).
This turned out to be a good choice, the removal of the pieces is easy without additional tool.
Caution:
- the thickness of the adhesive magnet holding the plate required the optical Z endswitch to recalibrate, instead to move the sensor, I extended the light breaking piece with just a small piece of paper with a drop of glue – it was easier than 3d printing an extender for the entire sensor.
- in my case the small handle of the plate scratches on the original vat at the last 3-4mm height, therefore the entire plate needs to be slightly misaligned (just pushing one side while fastening the build plate) so the handle doesn’t touch the vat.
- third party Anycubic Mono 4K vat like from Mega/Kingroon have a larger space, and don’t need any fiddling around therefore
- the spring steel is sharp, it happened several times the single-use gloves being torn/cut while handling the plate
(One of) My Use Case
After a few days I aimed for the main use case of mine: printing custom pulleys.
As I printed them with Anycubic Water Wash White Resin without support, the “elephant foot” comes from the first 6 layers being cured for 40s as in my case, and the UV light refracting and curing more than meant to be, but I can neglect this.
MSLA | FDM/FFF | |
geometrical accuracy | ★★★★☆1) | ★★★☆☆ |
surface quality | ★★★★☆ | ★★☆☆☆ |
mechanical sturdiness | (not yet tested) | ★★★☆☆ (PLA) |
print time per piece | 5m 30s2) | 15m |
print time for 1 piece | 1h 30m | 15m |
print time for 16 pieces | 1h 30m | 4h |
- due the “elephant foot” the Z accuracy was off by 0.8mm, instead of 15.0mm it’s 14.2mm
- when printing 16 pieces, it took 1h 30m for printing 15mm in Z, I could have printed ~28 pulleys on 132 x 80mm build plate, bringing print time for a piece down to 3m 10s
Settings
My own experience with different resins (to be extended):
Defaults V0.0.11 Firmware V0.11 | Defaults V2.0.2 Firmware V0.16 | White WATER WASH RESIN (Anycubic) | Clear Water Wash Resin (Resione) | |
---|---|---|---|---|
Layer Thickness [μm] | 50 | 50 | 50 | 50 |
Exposure Time [s] | 3 | 2.5 | 3 | 2 .. 3 |
Exposure Off Time [s] | 2.5 | 1 | 0.5 | 0.5 |
Bottom Exposure [s] | 50 | 30 | 40 | 40 |
Bottom Layers | 6 | 6 | 6 | 6 |
Anti-alias | 1 | 1 | 1 | 1 |
Z Lift Distance [mm] | 3.0 | 4.0 | 6.0 | 6.0 |
Z Lift Speed [mm/s] | 1.0 | 1.0 | 2.0 | 1.0 |
Z Retract Speed [mm/s] | 1.0 | 1.0 | 4.0 | 1.0 |
UV Power [%] | 100 | 100 | 100 | 50 .. 100 |
Notes | Distance, Speed & Retract Speed for – [BL] Bottom Layers – [NL] Normal Layers individually definable | – geometrical precise | – soft with 3s exposure – stiffer & brittle with 5s exposure – geometrical not precise (+0.2 .. 0.8mm in XYZ) |
Preliminary Review
Pros:
- good prints for the price
- cost effective
- power loss recovery actually works
- lot’s of third party replacements (vat, FEP, etc)1)
- alternatively Open Source firmware
- nearly full reverse engineered hardware
- this actually is quite important: popular machine raise a secondary market for replacements: future replacement of parts even when Anycubic ends support
Cons:
- newly bought machine had outdated firmware
- updated firmware calculates wrong total print time, this is just sloppy
- touchscreen unreliable (wrong position) ‘print’ vs ‘delete’, use a soft pencil
- slow prints with default settings (1mm/s Z motion), not nearly at 50mm/h height as advertised
Confusing:
- slicer print settings are ignored, only settings on the machine matter
- advantage: once sliced the .pwma can be printed with different resins and settings changed on the machine only
- disadvantage: one has to memorize or document settings for different resins, as it not stored in the .pwma file
Verdict
It’s a low-cost entry level MSLA machine, Anycubic seems to care little about the software (2023/03) as the slicer as well the firmware are Minimal Viable Product (MVP) level, but aren’t mature or reliable at all. Given they sell 500K+ machines per year at least, investing to improve in the firmware would help 500,000 users.
Small anecdote: I bought a pre-owned Mono 4K, becoming “Photon 2”, from official Anycubic store at Ebay directly – the listing said the machine likely would miss some parts – but I felt to get some more in-depth experience, and I’ve got what I asked for: the machine came dirty with resin all over, no power-supply, no build-plate, no vat, and cured resin between LCD and underlying (acryl-)glass, spent EUR 120+ for replacement parts, and 10+ hrs cleaning it to get it in working condition again. From a cost saving point of view not worth it, but experience wise it was good to get to know the machine more thoroughly.
(M)SLA Value Comparison
A numeric value summarization for features I care about, the rough & simple formula:
XY Area [mm2] / Price [EUR] / XY Resolution [μm]
The bigger the XY area, the smaller the price and the smaller the resolution, the higher the value:
State 2024/11
PRINTER | year | XY RESOLUTION | Type | BUILD VOLUME XYZ | PRICE | Value |
---|---|---|---|---|---|---|
Elegoo Saturn 4 | 2024- | 19μm x 24μm2) | MSLA | 218x122x220 | 300 EUR | 3.74 |
Elegoo Saturn 4 Ultra | 2024- | 19μm x 24μm2) | MSLA | 218x122x220 | 400 EUR | 2.81 |
Anycubic Photon Mono M5 | 2023- | 19μm x 24μm2) | MSLA | 218x123x200 | 410 EUR | 2.72 |
Elegoo Mars 5 Ultra | 2024- | 18μm | MSLA | 153x78x165 | 270 EUR | 2.54 |
Anycubic Photon Mono X 6Ks | 2023- | 34μm | MSLA | 196x122x200 | 280 EUR | 2.51 |
Anycubic Photon Mono M7 | 2024- | 17μm x 25μm2) | MSLA | 223x126x230 | 450 EUR | 2.49 |
Elegoo Saturn 3 Ultra | 2023- | 19μm x 24μm2) | MSLA | 218x123x260 | 480 EUR | 2.32 |
Anycubic Photon Mono 4K | 2021-2022 | 35μm | MSLA | 132x80x165 | 150 EUR | 2.01 |
Anycubic Photon Mono X2 | 2023- | 48μm | MSLA | 196x122x200 | 260 EUR | 1.91 |
Anycubic Photon Mono 2 | 2023- | 35μm | MSLA | 143x89x165 | 210 EUR | 1.73 |
Elegoo Jupiter SE | 2023- | 51μm | MSLA | 277x156x300 | 700 EUR | 1.21 |
Anycubic Photon M7 Max | 2025- | 46μm | MSLA | 298x164x300 | 900 EUR | 1.18 |
EMake Galaxy 1 | 2023 | 25μm / 100μm1) | SLA | 400x200x400 | 2,700 EUR | 1.18 |
Anycubic Photon M3 Max | 2022-2024 | 45μm | MSLA | 298x164x300 | 980 EUR | 1.10 |
UltraCraft Reflex RS | 2024- | 30μm | MSLA | 222x122x200 | 1,200 EUR | 0.75 |
EMake LCD 16″ 8K | 2024- | 46μm | MSLA | 353x198x400 | 2,700 EUR | 0.56 |
Formlabs 3L | 2020-2024 | 25μm / 100μm1) | SLA | 335x200x300 | 9,000 EUR | 0.29 |
Formlabs 3+ | 2020-2024 | 25μm / 100μm1) | SLA | 146x145x185 | 3,500 EUR | 0.24 |
Formlabs 4L | 2024- | 46μm | MSLA | 353x196x350 | 11,000 EUR | 0.14 |
Prusa SL1S | 2021- | 49μm | MSLA | 127x80x180 | 1,700 EUR | 0.12 |
Formlabs 4 | 2024- | 50μm | MSLA | 200x125x210 | 5,175 EUR | 0.09 |
- Formlabs 3’s & EMake SLA printers use a laser beam which has 100μm in diameter, but it can be positioned 25μm exact, the latter was used to calculate the value
- The UV pixels are non-square, the longer side was used to calculate the value
The XY area in SLA scales not as good as with MSLA, as the laser beam takes longer the more XY area (e.g. more pieces) need to be rendered per layer – so, MSLA is recommended for aiming fast parallel printing. Interestingly Formlabs 4 is now a MSLA as well (2024/04), they seem to have abandoned the SLA laser-based approach.
References
Anycubic Photon Mono 4K specific:
- github: Reverse Engineering Photon Mono 4K
- github: Turbo Resin, alternative Firmware for Photon Mono 4K (2023/07: not yet complete)
General Photon Series MSLA:
- github: SL1toPhoton, only supports .photon format, not .pw*
- github: sl1toctb, sl1 to Chitubox file format
- Photonsters.org: older Photon printers, not Photon S (pws) or Mono (pw0) yet
- github: Catibo: read/write/analyze CTB, CBDDLP, and PHZ files
MSLA Slicers:
Miscellaneous
- Jan Mrázek 3D Printing Blog: Resin: excellent information about resin printing