{"id":73418,"date":"2025-01-17T15:55:45","date_gmt":"2025-01-17T20:55:45","guid":{"rendered":"https:\/\/pappp.net\/?p=73418"},"modified":"2025-01-17T15:55:45","modified_gmt":"2025-01-17T20:55:45","slug":"a-goofy-3d-printer-setup","status":"publish","type":"post","link":"https:\/\/pappp.net\/?p=73418","title":{"rendered":"A Goofy 3D Printer Setup"},"content":{"rendered":"\n<p>TL;DR: I converted my Anycubic Linear Kossel to Klipper.  <br \/>Using a hacked Chromebook as the host, which is great and I recommend hacking surplus education market Chromebooks for many of hobby projects usually done with an SBC.  <br \/>Running in containers as a docker-compose project, which works but is dumb and wasteful. <br \/>Next I&#8217;m going to try to do some systematic performance experiments to it, but that&#8217;s for a later post. <br \/>Details below.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>I wanted to play with <a href=\"https:\/\/www.klipper3d.org\/\">Klipper<\/a> (a hybrid control stack that uses a relatively generic firmware on the printer uC for IO only, and does parsing and motion planning etc. on a host computer) and the nice modern <a href=\"https:\/\/docs.fluidd.xyz\/\">fluidd<\/a> web front-end for it, with my little old Anycubic Linear <a href=\"https:\/\/pappp.net\/?p=9356\">Kossel<\/a> which is <a href=\"https:\/\/www.lpomykal.cz\/anycubic-kossel-klipper-configuration\/\">known-supported<\/a>. This was brought about partly by having some un-allocated time for a change, partly by seeing some neat Klipper-based projects, and partly because the aging craptop I&#8217;d been using as an OctoPrint server finally finished dying. <br \/><br \/>I grabbed the older of the used Chromebooks I have around &#8211; a Dell Chromebook 11 3189, flashed with a UEFI payload and running normal Arch Linux which I was last playing with Hyprland on &#8211; to use as the host part, not just because I already had it, but because this stack is designed to run on a little SBC, and it is my conviction that education market surplus Chromebooks are cheaper, better, easier, and more ecologically sound than SBCs and the associated pile of expensive add-ons for like 90% of tasks people get them for. I&#8217;m even using the built-in webcam as the monitoring camera by &#8230;sticking the whole laptop on an empty box so it lines up.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"831\" height=\"1024\" src=\"https:\/\/pappp.net\/wp-content\/uploads\/2025\/01\/KlipperedKossel-831x1024.jpg\" alt=\"A modified Anycubic Linear Kossel and the hacked Chromebook being used to convert it to Klipper\" class=\"wp-image-73851\" srcset=\"https:\/\/pappp.net\/wp-content\/uploads\/2025\/01\/KlipperedKossel-831x1024.jpg 831w, https:\/\/pappp.net\/wp-content\/uploads\/2025\/01\/KlipperedKossel-244x300.jpg 244w, https:\/\/pappp.net\/wp-content\/uploads\/2025\/01\/KlipperedKossel-768x946.jpg 768w, https:\/\/pappp.net\/wp-content\/uploads\/2025\/01\/KlipperedKossel-1247x1536.jpg 1247w, https:\/\/pappp.net\/wp-content\/uploads\/2025\/01\/KlipperedKossel.jpg 1559w\" sizes=\"auto, (max-width: 831px) 100vw, 831px\" \/><\/figure>\n\n\n\n<p>I started setting it up, downloaded the klipper package out of the Arch repos, built a firmware image and flashed the Trigorilla board&#8217;s Atmega2560 over to Klipper, and loaded up Lukas&#8217; sample config.  Then I realized that while Arch has Klipper (with some nicely opinionated packaging choices since upstream is a little goofy) and Fluidd in the repos &#8230; the <a href=\"https:\/\/github.com\/Arksine\/moonraker\">Moonraker<\/a> API package required for them to talk to each other isn&#8217;t packaged (?!) There is only a moonraker-git in the AUR, so I assume at one point it was packaged and something breaking happened, but I haven&#8217;t investigated. <br \/><br \/>Instead of doing the reasonable thing and just building the Moonraker AUR package or installing a better supported OS on the computer, I saw this <a href=\"https:\/\/github.com\/mkuf\/prind\">prind<\/a> project that runs the whole stack out of a pile of docker containers. Since that seemed easy and likely to offer desirable stability\/portability guarantees, I decided to use setting that up as an excuse to refresh on dealing with docker and docker compose. <br \/><br \/>I generally view containers as 90% &#8220;adding an extra layer of complexity to isolate badly designed, un-deployable software,&#8221; but that&#8217;s kind of what we&#8217;re doing here, so it seemed reasonable(-ish), and It&#8217;s good to check in on container-land once every once and a while since they&#8217;ve become so common. <br \/><br \/>The only special thing I had to do (which is mentioned way down in the prind README) is cause the printer&#8217;s serial device to be assigned GID 20 &#8211; which on debian-likes is &#8220;dialout&#8221; and on Arch is fortunately unused by default, and likewise make whatever webcam I want to use get GID 44 &#8211; &#8220;video&#8221; on debian-likes, also unused by default on Arch.  That this is how permissions work through the container boundary is <em>rancid<\/em>.<br \/><br \/>That&#8217;s straightforward with a couple udev rules on the host like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>=== \/etc\/udev\/rules.d\/71-kossel.rules ====\n#prind's debian-derived container wants the serial device to belong to dialout with gid=20\nACTION==\"add\",SUBSYSTEM==\"tty\",ATTRS{idVendor}==\"10c4\",ATTRS{idProduct}==\"ea60\",GROUP=\"20\"\n# And cameras need GID=44\nACTION==\"add\",SUBSYSTEM==\"video4linux\",ATTRS{idVendor}==\"1415\",ATTRS{idProduct}==\"2000\",GROUP=\"44\"<\/code><\/pre>\n\n\n\n<p><br \/>&#8230; And with that done it just works. Did the automatic probe calibration, automatic Delta calibration, automatic PID calibration, edited my PrusaSlicer profile to output Klipper-dialect gcode, and printed a part.<\/p>\n\n\n\n<p>It&#8217;s not noticeably better (or worse) quality or faster than it was with the Marlin build I had on there &#8211; which is not surprising since I sliced with essentially the same profile &#8211; but it does sound different with the different control regime.<br \/><br \/>I have a suitable &#8220;Mellow Fly&#8221; ADXL345+ RP2040 accelerometer board, and I&#8217;ve already rigged up an adapter to mount it to the effector, so I can start figuring out how to push it and\/or start studying if any stiffening tricks are worthwhile &#8211; one of the main reasons for this project is I&#8217;d like to systematically try some schemes for stiffening a kossel. <br \/><br \/>Now I have 5 containers running, totaling something like 2.5GB, to deploy like 25MB of software, which is absurd.  It&#8217;s all running on a slightly hacked Chromebook, which is not as absurd as it sounds. <br \/>As is often the case with appliance-like computers and\/or sophisticated deployments, I should have just installed Debian and the packages I wanted to deploy on the bare hardware, and not looked at as other-than-appliance again for 5 years, instead of touching the complexity fetishist junk, but it&#8217;s good enough to play with for now. <br \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TL;DR: I converted my Anycubic Linear Kossel to Klipper. Using a hacked Chromebook as the host, which is great and I recommend hacking surplus education market Chromebooks for many of hobby projects usually done with an SBC. Running in containers &hellip; <a href=\"https:\/\/pappp.net\/?p=73418\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,8,37,1],"tags":[],"class_list":["post-73418","post","type-post","status-publish","format-standard","hentry","category-computers","category-diy","category-electronics","category-general"],"_links":{"self":[{"href":"https:\/\/pappp.net\/index.php?rest_route=\/wp\/v2\/posts\/73418","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pappp.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pappp.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pappp.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pappp.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=73418"}],"version-history":[{"count":0,"href":"https:\/\/pappp.net\/index.php?rest_route=\/wp\/v2\/posts\/73418\/revisions"}],"wp:attachment":[{"href":"https:\/\/pappp.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=73418"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pappp.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=73418"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pappp.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=73418"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}