Dominik Honnef

Our Elegoo Neptune 3 Pro

Last modified:
by

History

Klipper

We based our original config on [1]. We removed the virtual_sdcard section, adjusted the path to the serial device in the mcu section, and converted the configuration to Nix syntax to be used with the klipper NixOS service. We also made minor adjustments to the descriptions of the gcode macros.

After writing the initial config, we ran all of the steps in https://www.klipper3d.org/Config_checks.html and updated the config with more accurate values.

We used the CAD model of the printer to slightly adjust the probe offset, and our eyes to adjust the X endstop. The Y endstop was already perfect.

We also lowered the move speed at the start of bed mesh calibration.

We then added virtual_sdcard back because fluidd depends on it.

NixOS

We use NixOS’s klipper service for building the firmware as well as running the host. Running the klipper-flash-mcu script doesn’t work on this printer, so we instead manually copy the klipper.bin file (the path of which we find in the aforementioned script) to an SD card and boot the printer from it.

We had problems getting Fluidd to connect to Moonraker. Ultimately it turned out that the NixOS moonraker service didn’t restart the sytemd moonraker service on configuration changes. The same applies to klipper. Another problem was that the NixOS klipper service doesn’t validate the configuration, and the systemd klipper service doesn’t fail to start with invalid configurations.

When using NixOS ’’ strings for gcode, make sure the first line is indented less than the others. Otherwise, None of the lines will have indentation and the config will not parse correctly.

Next, Moonraker wasn’t able to connect to Klipper, emitting “JSON-RPC Request Error: -32601” and “Method not found” to its log. This was caused by Moonraker not being able to connect to Klipper because the process, running under the user “moonraker”, didn’t have the permissions required to use the UNIX domain socket at /run/klipper/api. We solve this by adding the moonraker user to the klipper group.

Stuff

When printing grid infill, the nozzle would scrape the surface. But not on most of the grid, but instead on the grid’s “perimeter”, because of small blobs whenever the nozzle moved to the next line to print.

We turned on z hop because the nozzle was scraping print surfaces, despite accurate e-step, z-step, and extrusion multiplier.

Snug supports are buggy: https://github.com/supermerill/SuperSlicer/issues/3256

We use firmware retractions.

We switched from SuperSlicer to PrusaSlicer

Speed and acceleration

Using https://ellis3dp.com/Print-Tuning-Guide/articles/determining_max_speeds_accels.html#determining-if-skipping-occured we’ve tested the max acceleration.

10000 mm/s² failed at 1 iteration. 9000 mm/s² failed the 50 iteration test after approximately 10 iterations. 5000 mm/s² passed 10 iterations and we didn’t try harder. We didn’t test values between 5000 mm/s² and 9000 mm/s² because they’re not realistically useful, anyway.

We tested speed at 500 mm/s for 1 iteration and didn’t care to test much more. We’ll never use these speeds in practice.

For Z velocity, 15 mm/s is the highest that doesn’t sound like it is abusing the motors.

TODO

Calibration prints

Default settings

Setting Value
Extruder temperature 225 C
Bed temperature 60 C
Nozzle 0.4 mm
Initial layer height 0.25 mm
Layer height 0.20 mm
Speed Autospeed, 3.6 mm³/s
Part fan speed 100%
Pressure advance 0.5
Filament ecoPLA Black

20mm * 20mm * 20mm calibration cube, 2023-05-06

Summary

All-in-one test, 2023-05-06

Settings

Setting Value
Supports None
Z-hop 0

Summary

Clearance tolerance test, 2023-05-06

Settings

Setting Value
Supports None

Summary

Skew correction

We’ve used both https://www.thingiverse.com/thing:2972743 and https://www.printables.com/model/70792-easy-3-axis-skew-calibration-tower-with-spreadshee to measure skew. In both cases, the amount of skew was insignificant (0.05-0.1 degrees). The two models did not agree on the amount of skew, and using either one’s values for correcting in the XZ and YZ planes did not eliminate skew. It is therefore likely that other issues (measurement errors, backlash, …) affect the dimensions, and not skew. Correcting for XY skew did work, but since the amount of skew was tiny to begin with it doesn’t seem worth the trouble of setting up skew correction for.

References

[1]
TheFeralEngineer, “TheFeralEngineer/Klipper-for-Elegoo-Neptune-series-3D-Printers.” May 03, 2023. Accessed: May 03, 2023. [Online]. Available: https://github.com/TheFeralEngineer/Klipper-for-Elegoo-Neptune-series-3D-Printers/blob/f258c4df2c6fc14be79375a363ffa66f8960446e/Neptune%203%20Pro%20config/printer.cfg

7.4 cm wide * 7.6 cm deep

Extrusion tests

Filament: 3DJake ecoPLA Black Filament diameter: 1.75mm Extrusion length: 200 mm Extrusion volume: extrusion length * (1.75 mm / 2)² * pi = 481.0563751 mm³ Extrusion mass: extrusion volume * 1.24 g/cm³ = 596.5099051 mg Printer: Elegoo Neptune 3 Pro, stock extruder, running Klipper

Nozzle (mm) Flow rate (mm³/s) Temperature (°C) Extruded (g) Difference (%)
0.4 3 200 0.57 -5.
0.4 5 200 0.56 -6.6666667
0.4 7 200 0.54 -10.
0.4 9 200 0.50 -16.666667
0.4 11 200 0.47 -21.666667
0.4 13 200 0.43 -28.333333
0.4 3 210 0.57 -5.
0.4 5 210 0.57 -5.
0.4 7 210 0.55 -8.3333333
0.4 9 210 0.52 -13.333333
0.4 11 210 0.49 -18.333333
0.4 13 210 0.48 -20.
0.4 3 220 0.58 -3.3333333
0.4 5 220 0.57 -5.
0.4 7 220 0.56 -6.6666667
0.4 9 220 0.55 -8.3333333
0.4 11 220 0.52 -13.333333
0.4 13 220 0.49 -18.333333
0.4 3 240 0.58 -3.3333333
0.4 5 240 0.58 -3.3333333
0.4 7 240 0.58 -3.3333333
0.4 9 240 0.57 -5.
0.4 11 240 0.55 -8.3333333
0.4 13 240 0.54 -10.
0.8 3 200 0.59 -1.6666667
0.8 5 200 0.58 -3.3333333
0.8 7 200 0.57 -5.
0.8 9 200 0.57 -5.
0.8 11 200 0.57 -5.
0.8 13 200 0.55 -8.3333333
0.8 15 200 0.53 -11.666667
0.8 17 200 0.5 -16.666667
0.8 19 200 0.46 -23.333333
0.8 21 200 0.43 -28.333333
0.8 23 200 0.41 -31.666667
0.8 25 200 0.4 -33.333333
0.8 3 210 0.59 -1.6666667
0.8 5 210 0.58 -3.3333333
0.8 7 210 0.58 -3.3333333
0.8 9 210 0.58 -3.3333333
0.8 11 210 0.57 -5.
0.8 13 210 0.57 -5.
0.8 15 210 0.54 -10.
0.8 17 210 0.53 -11.666667
0.8 19 210 0.50 -16.666667
0.8 21 210 0.47 -21.666667
0.8 23 210 0.45 -25.
0.8 25 210 0.44 -26.666667
0.8 3 220 0.59 -1.6666667
0.8 5 220 0.6 0.
0.8 7 220 0.58 -3.3333333
0.8 9 220 0.56 -6.6666667
0.8 11 220 0.57 -5.
0.8 13 220 0.57 -5.
0.8 15 220 0.56 -6.6666667
0.8 17 220 0.55 -8.3333333
0.8 19 220 0.53 -11.666667
0.8 21 220 0.50 -16.666667
0.8 23 220 0.5 -16.666667
0.8 25 220 0.46 -23.333333
0.8 3 240 0.58 -3.3333333
0.8 5 240 0.58 -3.3333333
0.8 7 240 0.58 -3.3333333
0.8 9 240 0.59 -1.6666667
0.8 11 240 0.58 -3.3333333
0.8 13 240 0.58 -3.3333333
0.8 15 240 0.57 -5.
0.8 17 240 0.56 -6.6666667
0.8 19 240 0.56 -6.6666667
0.8 21 240 0.55 -8.3333333
0.8 23 240 0.53 -11.666667
0.8 25 240 0.51 -15.
library(tidyverse)

xTicks <- unique(data["Flow rate (mm³/s)"])
yTicks <- unique(data["Extruded (g)"] / expected - 1)

g <- ggplot(data = data, mapping = aes(x=`Flow rate (mm³/s)`, y=(`Extruded (g)`/expected - 1), group=factor(`Temperature (°C)`))) +
    geom_point() +
    geom_line(aes(color=factor(`Temperature (°C)`))) +
    labs(colour = "Temperature (°C)") +
    scale_x_continuous(
      breaks = pull(xTicks),
      minor_breaks = NULL,
    ) +
    scale_y_continuous(
      name = "Underextrusion (%)",
      breaks = pull(yTicks),
      minor_breaks = NULL,
      labels = . %>% map (\(x) round(x, 2) * 100)
    ) +
    facet_wrap(
      vars(`Nozzle (mm)`),
      labeller = labeller(`Nozzle (mm)` = (\(x) glue::glue("Nozzle: {x}")))
    )
print(g)

Practical applications

When printing at 13 mm³/s with a 0.8 mm nozzle, the measured under-extrusion is 3.16%, which is close to the theoretical (and rounded) 3%. Printing with an adjusted extrusion multiplier resulted in an over-extrusion of 0.63%. We can attribute this to imprecisions in the extrusion system, the filament diameter, and rounding in the gcode. It seems appropriate to assume a ~3% under-extrusion and use a multiplier of 1.031. We used the 1.031 multiplier with a 5 mm³/s print and had an over-extrusion of 0.47%.

We can’t possibly print the calibration cube at 13 mm³/s at the moment, though. Our cooling isn’t remotely good enough, and the extruded filament probably has a solid core.

When we printed the ringing tower at 100 mm/s (resulting in a nominal 18.4 mm³/s volumetric speed) and 215 C, we ended up with a matte finish (i.e. significantly under the targeted temperature), but couldn’t spot any obvious under-extrusions. Nevertheless, the strength of the part was noticeably less than when it was printed at 3.6 mm³/s.

Notes on calibrating extrusion multiplier