From 6153aabafe90a6bb4ea0a838aa3604b22f0861fe Mon Sep 17 00:00:00 2001 From: Kat Inskip Date: Tue, 6 Aug 2024 12:50:04 -0700 Subject: [PATCH] feat(logistics): working klipper --- nixos/klipper.nix | 189 +++++++++++++++++++++++++++++++++++++++++++ nixos/moonraker.nix | 1 + nixos/octoprint.nix | 2 +- overlays/print.nix | 2 + packages/klipper.nix | 84 +++++++++++++++++++ 5 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 packages/klipper.nix diff --git a/nixos/klipper.nix b/nixos/klipper.nix index 65c63821..cd582827 100644 --- a/nixos/klipper.nix +++ b/nixos/klipper.nix @@ -4,6 +4,195 @@ _: { enable = true; octoprintIntegration = true; settings = { + filter = {}; + + print_stats = {}; + + virtual_sdcard = { + path = "/printersd/"; + }; + + dirzctl = {}; + + hx711s = { + sensor0_clk_pin = "PA4"; + sensor0_sdo_pin = "PC6"; + }; + + prtouch = { + sensor_x = 32; + sensor_y = 30; + clr_noz_start_x = 15; + clr_noz_start_y = 25; + clr_noz_len_y = 15; + s_hot_min_temp = 160; + s_hot_max_temp = 200; + s_bed_max_temp = 60; + show_msg = true; + wipe_retract_distance = 2; + }; + + stepper_x = { + step_pin = "PC2"; + dir_pin = "!PB9"; + enable_pin = "!PC3"; + microsteps = 16; + rotation_distance = 40; + endstop_pin = "~!PA5"; + position_endstop = -6; + position_min = -6; + position_max = 230; + homing_speed = 80; + }; + + "tmc2208 stepper_x" = { + uart_pin = "PB12"; + run_current = 0.60; + sense_resistor = 0.150; + interpolate = true; + }; + + stepper_y = { + step_pin = "PB8"; + dir_pin = "PB7"; + enable_pin = "!PC3"; + microsteps = 16; + rotation_distance = 40; + endstop_pin = "~!PA6"; + position_endstop = -14; + position_min = -14; + position_max = 230; + homing_speed = 80; + }; + + "tmc2208 stepper_y" = { + uart_pin = "PB13"; + run_current = 0.60; + sense_resistor = 0.150; + interpolate = true; + }; + + stepper_z = { + step_pin = "PB6"; + dir_pin = "!PB5"; + enable_pin = "!PC3"; + microsteps = 16; + rotation_distance = 8; + endstop_pin = "probe:z_virtual_endstop"; + position_min = -3; + position_max = 250; + homing_speed = 4; + second_homing_speed = 1; + homing_retract_dist = 2.0; + }; + + "tmc2208 stepper_z" = { + uart_pin = "PB14"; + run_current = 0.8; + sense_resistor = 0.150; + interpolate = true; + }; + + extruder = { + max_extrude_only_distance = 100.0; + step_pin = "PB4"; + dir_pin = "PB3"; + enable_pin = "!PC3"; + microsteps = 16; + rotation_distance = 7.44; + nozzle_diameter = 0.400; + filament_diameter = 1.750; + heater_pin = "PA1"; + sensor_type = "EPCOS 100K B57560G104F"; + sensor_pin = "PC5"; + control = "pid"; + pid_Kp = 27.142; + pid_Ki = 1.371; + pid_Kd = 134.351; + min_temp = 0; + max_temp = 260; + }; + + heater_bed = { + heater_pin = "PB2"; + sensor_type = "EPCOS 100K B57560G104F"; + sensor_pin = "PC4"; + control = "pid"; + pid_kp = 66.371; + pid_ki = 0.846; + pid_kd = 1301.702; + min_temp = 0; + max_temp = 100; + }; + + "heater_fan hotend_fan" = { + pin = "PC1"; + }; + + fan = { + pin = "PA0"; + }; + + mcu = { + serial = "/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0"; + restart_method = "command"; + }; + + printer = { + kinematics = "cartesian"; + max_velocity = 250; + max_accel = 2500; + max_z_velocity = 5; + square_corner_velocity = 5.0; + max_z_accel = 100; + }; + + bltouch = { + sensor_pin = "^PC14"; + control_pin = "PC13"; + x_offset = -23.0; + y_offset = -14.5; + z_offset = 2.65; + speed = 20; + pin_move_time = 0.4; + stow_on_each_sample = false; + probe_with_touch_mode = true; + }; + + safe_z_home = { + home_xy_position = "134,123"; + speed = 150; + z_hop = 10; + z_hop_speed = 10; + }; + + bed_mesh = { + speed = 120; + horizontal_move_z = 5; + mesh_min = "30,30"; + mesh_max = "207,215.5"; + probe_count = "5,5"; + algorithm = "bicubic"; + }; + + screws_tilt_adjust = { + screw1 = "54.5,45.5"; + screw1_name = "front left screw"; + screw2 = "224.5,45.5"; + screw2_name = "front right screw"; + screw3 = "224.5,215.5"; + screw3_name = "rear right screw"; + screw4 = "54.5,215.5"; + screw4_name = "rear left screw"; + horizontal_move_z = 10.; + speed = 50.; + screw_thread = "CCW-M4"; + }; + + e3v3se_display = { + language = "english"; + logging = true; + }; }; }; }; diff --git a/nixos/moonraker.nix b/nixos/moonraker.nix index d942371a..81699853 100644 --- a/nixos/moonraker.nix +++ b/nixos/moonraker.nix @@ -3,6 +3,7 @@ _: { moonraker = { enable = true; address = "0.0.0.0"; + user = "octoprint"; port = 7125; # it's the default but i'm specifying it anyway settings = { octoprint_compat = { }; diff --git a/nixos/octoprint.nix b/nixos/octoprint.nix index 72832e17..66fac5d1 100644 --- a/nixos/octoprint.nix +++ b/nixos/octoprint.nix @@ -71,7 +71,7 @@ in { serial = { port = "/dev/ttyUSB0"; baudrate = 115200; - autoconnect = true; + autoconnect = false; }; } { diff --git a/overlays/print.nix b/overlays/print.nix index bb5c88fc..5eefb953 100644 --- a/overlays/print.nix +++ b/overlays/print.nix @@ -5,6 +5,8 @@ in { plugins = [final.curaPlugins.octoprint]; }; + klipper = prev.callPackage ../packages/klipper.nix {}; + octoprint = let mapPlugin = python3Packages: _: plugin: plugin.override { diff --git a/packages/klipper.nix b/packages/klipper.nix new file mode 100644 index 00000000..0c923839 --- /dev/null +++ b/packages/klipper.nix @@ -0,0 +1,84 @@ +{ stdenv +, lib +, fetchFromGitHub +, python3 +, unstableGitUpdater +, makeWrapper +}: + +stdenv.mkDerivation rec { + pname = "klipper"; + version = "0.12.0-unstable-2024-07-05"; + + src = fetchFromGitHub { + owner = "kittywitch"; + repo = "ender3-v3-se-klipper-with-display"; + rev = "c2fb1cf76812b974152ecc90cb696c302384adbd"; + hash = "sha256-Rx5+ECHlCG1trJnF/Xs4cSUTrIcAry/4RrZRMaPoPeg="; + }; + + sourceRoot = "${src.name}/klippy"; + + # NB: This is needed for the postBuild step + nativeBuildInputs = [ + (python3.withPackages ( p: with p; [ cffi ] )) + makeWrapper + ]; + + buildInputs = [ (python3.withPackages (p: with p; [ can cffi pyserial greenlet jinja2 markupsafe numpy ])) ]; + + # we need to run this to prebuild the chelper. + postBuild = '' + python ./chelper/__init__.py + ''; + + # Python 3 is already supported but shebangs aren't updated yet + postPatch = '' + for file in klippy.py console.py parsedump.py; do + substituteInPlace $file \ + --replace '/usr/bin/env python2' '/usr/bin/env python' + done + + # needed for cross compilation + substituteInPlace ./chelper/__init__.py \ + --replace 'GCC_CMD = "gcc"' 'GCC_CMD = "${stdenv.cc.targetPrefix}cc"' + ''; + + # NB: We don't move the main entry point into `/bin`, or even symlink it, + # because it uses relative paths to find necessary modules. We could wrap but + # this is used 99% of the time as a service, so it's not worth the effort. + installPhase = '' + runHook preInstall + mkdir -p $out/lib/klipper + cp -r ./* $out/lib/klipper + + # Moonraker expects `config_examples` and `docs` to be available + # under `klipper_path` + cp -r $src/docs $out/lib/docs + cp -r $src/config $out/lib/config + + # Add version information. For the normal procedure see https://www.klipper3d.org/Packaging.html#versioning + # This is done like this because scripts/make_version.py is not available when sourceRoot is set to "${src.name}/klippy" + echo "${version}-NixOS" > $out/lib/klipper/.version + + mkdir -p $out/bin + chmod 755 $out/lib/klipper/klippy.py + makeWrapper $out/lib/klipper/klippy.py $out/bin/klippy --chdir $out/lib/klipper + runHook postInstall + ''; + + passthru.updateScript = unstableGitUpdater { + url = meta.homepage; + tagPrefix = "v"; + }; + + meta = with lib; { + description = "Klipper 3D printer firmware"; + mainProgram = "klippy"; + homepage = "https://github.com/KevinOConnor/klipper"; + maintainers = with maintainers; [ lovesegfault zhaofengli cab404 ]; + platforms = platforms.linux; + license = licenses.gpl3Only; + }; +} +