王者の帰還
2013年にReplicator2Xが発売され、うちに迎え入れてから何回壊れて何回復活しただろう。だが今回は壊れたわけではない。なんとなく使わなくなって1年以上何も出力していなかったReplicator2X改をソフトウェア環境をアップグレードすることでもう少し延命させようという試みのお話である。もうReplicator2Xを手に入れたころから10年以上の時が過ぎている。コンシューマー向け3Dプリンタにも技術の進捗がいろいろとみられ、今では多色刷りが当たり前、印刷精度も安定度も当時とは段違いで価格も手ごろだ。発売当時はみんなが単色刷りしかできない中で2色刷りできることに優越感を得ることができた。それが今では3色4色当たり前の世の中で、2色刷りにすら手こずるReplicator2Xをこれ以上延命させる意味などない。ならばなぜ今になってReplicator2Xのソフトウェア環境をバージョンアップして延命させようというのか。私は気づいてしまったのだ。3Dプリンターってそんなに頻繁に使わねえなって。もう最新機種に買い替えるほどの情熱はない。だが、たまに何かしら出力したいものはある。そして3Dプリンターをいじくるのは楽しい。昨今の技術進化した最新機種を買ってしまったら、Replicator2Xに施しているほどの大胆な改造は気後れしてしまってできないだろう。そして最新機種を買うほどのお金はないのである。貧乏が憎い。
そこで先日、ヤフオクでeMMCが抜かれた富士通のWindowsタブレットQ5011を2000円という格安で手に入れたものの、メインストレージがないので使い道がないという記事を書いた。そのタブレットを、klipperの制御端末にしているRaspberry Piの代わりにできたら、タッチパネル付きの豪華な機体になるのではないか。単純な処理能力を比較すると、Raspberry Pi 3よりもQ5011のほうが性能が高い。10年落ちの機体でもまだまだやれる!新しい3Dプリンターを買う金などない!あったら米を買う!いいか、Replicator2Xは、この世界で一番いい3Dプリンターだ!いちばんすぐれた3Dプリンターなんだ!!おれにはこれしかないんだ!だからReplicator2Xがいちばんいいんだ!!
作戦はこうじゃ
まずここに、どこのご家庭にもあるDELL ドッキングステーションWD15があるじゃろ?このへその緒みたいに出とるUSB-CをQ5011の電源とするんじゃ。そんで、常時充電状態は火事が怖いからQ5011は前回とおなじく3枚におろしてバッテリーは外してしまうんじゃ。そんで、WD15のUSBポートに、お手頃なSSDを接続してそこからブートするのじゃ。WD15にはUSBカメラやキーボード、マウス、そしてReplicator2X改のメイン基板となっているBigtreeTech Octopus Proをつなぐのじゃ。これでハードウェア環境は完成じゃ。

そこに、NixOSをインストールして、klipper、moonraker、mainsail、をインストールしたら、Q5011のタッチパネルを活用したモダンUIをそなえたモダンな3Dプリンターが完成するのじゃ。
ヤフオクなどををさがせばWD15は1000円そこそこで手に入る。ストレージなしタブレットも同様に数百円から数千円程度で手に入るだろう。Q5011は2000円だった。SSDにはアリエクのセールで手に入れた128GBのNVMeのM.2 (Type2230)SSDを、amazonでかった怪しいUSB変換アダプターでUSB接続のSSDとして使う。USB接続がボトルネックになっているので、NVMeではなくm.2 sataのssdなんかを使うともっとお安く済むかもしれない。しかし、ずっと前に買って家に転がっていた128GBという帯に短したすきに長しといった中途半端な安かったから確保したというようなパーツはこのような時にすごく役に立つ。ちょうどいい。ただ、M.2接続のSSDはやたら発熱するので、ヒートシンクを乗せておくのは必須であろう。
あとは、キーボード、マウス、USB接続のカメラ、なんかをQ5011と共にWD15につなぐことでWD15からの電源供給でこれらすべてが動作することになる。3Dプリンターの基盤も繋ぐがこちらは別の電源で動く。なので電源を入れるときは、3Dプリンターの電源と、制御端末関係の電源の両方を忘れず立ち上げる必要がある。
NixOSという選択
前置きが長くなったがいよいよQ5011にNixOSをインストールする。NixOSは、環境構築を純粋関数型のNix言語で宣言的に行うことができるLinuxディストリビューションだ。一つの設定ファイルで環境構築が簡素化できる。今回みたいな3Dプリンターの制御端末を作る場合、SSDがぶっ壊れたからもう一度同じものを構築したいなんて時に関数的に宣言された設定ファイルのバックアップがあれば、比較的簡単に同じ環境を再構築でき、保守性が高くなるのではないかとの思いから、NixOSを採用することにしたのである。
NixOSにはklipperやmainsail、Moonrakerなんかの3Dプリンター周りのソフトウェアもレポジトリに含まれているので宣言するだけでインストール出来ちゃったりするのだ。とても良い。
では早速、NixOSの公式Webサイトから、インストールメディアをダウンロードしてくる。パッケージマネージャーだけを導入することもでき、そのダウンロードが上部に来ているが、その下にNixOSのメディアのダウンロードリンクがある。

Ventoyという楽園
いつもならこのダウンロードしたisoイメージをrufusなんかを使ってUSBメモリに焼いて起動ディスクにしてしまうわけだが、最近はいちいちUSBメモリを1つつぶすのめんどくさいので、Ventoyを使うようにしている。
こいつをUSBメモリなんかにぶち込むと、Ventoyをブートするボリュームとデータボリュームに分かれた環境が作られ、データボリューム部分にインストールイメージのファイルをぶち込むことで、Ventoyでブートしたときにデータボリュームに保存したイメージから選択して起動できるという何とも素敵な新しいブータブルUSBソリューションなのだ。つまり、ブータブルなイメージをUSB記憶領域に入れとくだけで選択的に起動できる素敵インストールメディアが作成できる。
たくさんのインストールメディアを入れておきたいので、家に転がっている古い壊れる寸前の128GB SSDを、USB接続の変換アダプターなんかを使ってマジカル起動USBストレージにしてしまおう。HDDをUSBに接続するアダプタを使うと外部電源が必須だが、2.5インチSSDならUSBからの電源供給で行けるので、でっかいポータブルSSDが手軽にできる。

こいつを使って、Q5011を起動するわけだが、今回はバッテリーを摘出してしまっているので、以下のようなエラーが出る。

ここで気を取り直して、キーボードを接続して起動しなおして、富士通のロゴが出るか出ないかのところからF12キーを連打して起動メニューを呼び出す。

1のUSB HHD がVentoyを入れたSSDだ。これを選択した状態でエンターを押すと、Ventoyが立ち上がる。

いろんな起動イメージが保存されていてご機嫌だ。その中から先ほどダウンロードしたNixOSのisoを探して選択してエンターキーを押す。

そしたら、normal modeでブートしちゃえばいいさ。いよいよNixOSのインストールメディアの世界へ入っていくわけだが、GNOMEはメモリ1GBくらい食いつぶすのに対して、Plasmaなら700MBくらいで勘弁してくれるらしい。今、利用しているQ5011のメモリは4GBしかないので軽い方を選びたい。今回はGNOMEではなくKDEのPlasmaを選ぶ。

富士通ロゴがバグったような表示になり、万事休すか!?と思ったがその後問題なく起動してきた。このバグったような表示は今後起動するたびにこうなるので気にしない。


無事にインストーラーが立ち上がってくるのだが、安価なタブレット端末あるあるでこのQ5011も縦長の液晶の表示を回転させることで横長端末として利用しているらしく、デフォルト表示は縦長方向になっている。横向きにしておこう。




ネットワークに接続されていないと怒られるので、Wi-Fiの設定をしてみる。ここまでドライバーのインストールなどしていないが、タッチパネルもサウンドもWi-Fiも普通に使えた。最近のLinuxすごい。




ネットに繋がったらここからは普通のLnuxのGUIインストールの画面が続く。ここまでで設定したデスクトップの向きやWi-Fiの接続情報などはインストール後の環境にも引き継がれる。




GUIマネージャーを選択する。今回はPlasmaを選んだが、今となってはもっと軽いのを選んでおけばよかったかもしれないと思っているが、まあ今回はこれで。





ファイルのコピーの完了を待って再起動すると、インストールしたディスクからNixOSが立ち上がる。

3Dプリンターの出力は長時間にわたるので、その間にスリープに入って印刷を止めてしまったりしないよう、非アクティブ時にも何もしないように設定を変更しておく。

これで準備が整った!
configuration.nixの編集
いよいよ/etc/nixos/configuration.nix の編集をしていくことになる。このファイルにNix言語という関数型言語で環境の宣言を記述して、リビルドコマンドを打つことで環境をビルドしていくという流れになる。リビルドコマンドを行うごとに/nix/storeに環境がハッシュ付きで出力される。/nix/storeは読み取り専用で編集ができない。関数型なので入力に対して出力があるという考え方で、同じ入力に対しては同じ出力になる。同じハッシュであれば同じ環境であることが保証されるということになるらしい。configuration.nix を編集するごとにリビルドするわけだが、そのたびに環境が増えていき、再起動時にGRUBから選択して前の環境にロールバックして起動することが可能となるが、明示的に削除しなければ消えずストレージを圧迫し続けるので注意が必要だ。削除しなければ何も失われないというのもNixOSの良いところだ。
configuration.nix をバックアップしておいてリビルドすれば同じ環境が作れる。これがNixOSを選ぶ利点だといえる。configuration.nix のどこをいじくったか覚えている限り備忘録として残しておこうと思う。なにぶん初めてのことなので試行錯誤しながらいろいろいじくったため、抜けがあるかもしれない。もっとたくさんいじくった気がするが、また思い出したら追記するかもしれない。
SSHの有効化
openssh.enableをtrueにして、networking.firewall.allowedTCPPortsで22番ポートを開放している。
# List packages installed in system profile. To search, run: $ nix search wget
environment.systemPackages = with pkgs; [
neovim # Do not forget to add an editor to edit configuration.nix The Nano editor is also installed by default.
xclip
wl-clipboard
wget
git
curl
];
# Enable the OpenSSH daemon.
services.openssh.enable = true;
# Open ports in the firewall.
networking.firewall.allowedTCPPorts = [ 22 3389 ];
RDPの有効化
同様にリモートデスクトップで接続できるようにservices.xrdp.enableをtrueにして、3389番ポートを開放している。
# Enble the SRDP daemon.
services.xrdp.enable = true;
services.xrdp.defaultWindowManager = "${pkgs.kdePackages.plasma-workspace}/bin/startplasma-x11";
# Open ports in the firewall.
networking.firewall.allowedTCPPorts = [ 22 3389 ];
パッケージをいろいろ追加
neovimとか、wgetとか、いろいろ必要そうなパッケージを追加してみた。mjpg-streamerとかはカメラで造形物をストリーミングでのぞくときなんかに使う。構築中に引っかかったらその都度いろいろ追加していたので、なんだかどんどん増えていく。これからも増えていくと思う。
# List packages installed in system profile. To search, run: $ nix search wget
environment.systemPackages = with pkgs; [
neovim
xclip
wl-clipboard
wget
git
curl
bashInteractive
dialog
ncurses
python3
gcc
gnumake
systemd
tmux
usbutils
gcc-arm-embedded # arm-none-eabi-gcc を提供
dfu-util # DFU書き込みに
stlink # ST-LINK使う場合
stm32flash # UART書き込みに使う場合
dfu-util
libusb1
pkg-config
mjpg-streamer
v4l-utils
qutebrowser
epiphany
];
ここで一回環境をリビルドしておく
ここからklipperのコンパイルとかするので、いったんここまでの設定で環境をリビルドしてみる。nixosでは設定に応じた環境がストアディレクトリにビルドされて格納される。ストアディレクトリはリビルドするごとに増えていき、grubのブートローダーで選んでブートすることができる。3つ前のビルドに戻りたいなんてことが簡単にできる。その代わりストアディレクトリに格納された環境にファイルを置いたり編集したりすることはできない。そんなことがしたいなら/etc/nixos/configuration.nixに書いておけ!という仕組みになっている。なので、ビルドするコマンドを一発叩く。
$ sudo nixos-rebuild switch
building Nix...
building the system configuration...
以下略
ついにKlipperを追加!
差し当たってのリビルドが完了したら、ついに!klipperの追加部分を記述する!Q5011とreplicator2Xの制御基板であるbigtreetech octopus proをUSBケーブルで接続し、/dev/serial/by-idディレクトリの中を覗いて、シリアルのIDを確認する。
$ sudo ls -l /dev/serial/by-id
合計 0
drwxr-xr-x 2 root root 60 10月 14 12:55 .
drwxr-xr-x 4 root root 80 10月 14 12:55 ..
lrwxrwxrwx 1 root root 13 10月 14 12:55 usb-Klipper_stm32f429xx_xxxxxxxxxxxxxxxxxxxxxxxxx-if00 -> ../../ttyACM0
replicator2Xの制御基板側に入ってるファームウェアは前と同じバージョンなら更新せずにそのまま使えるが、klipperが新しくなっているらしかったので、ユーザーのホームディレクトリにklipperディレクトリをつくって、そこにGithubからとってきてコンパイルして更新してみよう。
[user@nixos:~]$
[user@nixos:~]$ mkdir klipper
[user@nixos:~]$ cd klipper/
[user@nixos:~/klipper]$
[user@nixos:~/klipper]$
[user@nixos:~/klipper]$ git clone https://github.com/Klipper3d/klipper.git
Cloning into 'klipper'...
remote: Enumerating objects: 81768, done.
remote: Counting objects: 100% (329/329), done.
remote: Compressing objects: 100% (162/162), done.
remote: Total 81768 (delta 266), reused 167 (delta 167), pack-reused 81439 (from 3)
Receiving objects: 100% (81768/81768), 225.93 MiB | 10.84 MiB/s, done.
Resolving deltas: 100% (66623/66623), done.
[user@nixos:~/klipper]$
[user@nixos:~/klipper]$ cd klipper
[user@nixos:~/klipper]$ make menuconfig
menuconfigの選択は制御基板に応じたオプションを選択する必要がある。bigtreetech のoctopusの中でもいくつかエディションによって違いがあるので注意が必要である。以下は当環境のoctopusの場合である。






menuconfigが終わったらmakeしちゃうぞ!
[user@nixos:~/klipper/klipper]$ make
Building out/autoconf.h
Compiling out/src/sched.o
Compiling out/src/command.o
Compiling out/src/basecmd.o
Compiling out/src/debugcmds.o
Compiling out/src/initial_pins.o
Compiling out/src/gpiocmds.o
Compiling out/src/stepper.o
Compiling out/src/endstop.o
Compiling out/src/trsync.o
Compiling out/src/adccmds.o
Compiling out/src/spicmds.o
Compiling out/src/i2ccmds.o
Compiling out/src/pwmcmds.o
Compiling out/src/sdiocmds.o
Compiling out/src/buttons.o
Compiling out/src/tmcuart.o
Compiling out/src/neopixel.o
Compiling out/src/pulse_counter.o
Compiling out/src/lcd_st7920.o
Compiling out/src/lcd_hd44780.o
Compiling out/src/spi_software.o
Compiling out/src/i2c_software.o
Compiling out/src/thermocouple.o
Compiling out/src/sensor_adxl345.o
Compiling out/src/sensor_lis2dw.o
Compiling out/src/sensor_mpu9250.o
Compiling out/src/sensor_icm20948.o
Compiling out/src/sensor_hx71x.o
Compiling out/src/sensor_ads1220.o
Compiling out/src/sensor_ldc1612.o
Compiling out/src/sensor_angle.o
Compiling out/src/sensor_bulk.o
Compiling out/src/sos_filter.o
Compiling out/src/load_cell_probe.o
Compiling out/src/stm32/watchdog.o
Compiling out/src/stm32/clockline.o
Compiling out/src/stm32/dfu_reboot.o
Compiling out/src/generic/crc16_ccitt.o
Compiling out/src/generic/armcm_boot.o
Compiling out/src/generic/armcm_irq.o
Compiling out/src/generic/armcm_reset.o
Compiling out/src/stm32/stm32f4.o
Compiling out/src/../lib/stm32f4/system_stm32f4xx.o
Compiling out/src/generic/armcm_timer.o
Compiling out/src/stm32/gpio.o
Compiling out/src/stm32/gpioperiph.o
Compiling out/src/stm32/adc.o
Compiling out/src/stm32/spi.o
Compiling out/src/stm32/i2c.o
Compiling out/src/stm32/usbotg.o
Compiling out/src/stm32/chipid.o
Compiling out/src/generic/usb_cdc.o
Compiling out/src/stm32/hard_pwm.o
Compiling out/src/stm32/sdio.o
Building out/compile_time_request.o
Version: v0.13.0-345-ge3909fb20
Preprocessing out/src/generic/armcm_link.ld
Linking out/klipper.elf
Creating bin file out/klipper.bin
[user@nixos:~/klipper/klipper]$
makeが終わるとファームウェアが、/home/user/klipper/klipper/out/klipper.binとして出力される。octopus proはusb経由のファームウェアアップデートができないので、klipper.binをfirmware.binにリネームしてmicroSDカードに入れて、電源OFF状態のoctopusに突っ込んで電源ONしてしばらく待ってfirmwareを書き込む。
制御ボードにfirmwareが書き込めたら、/etc/nixos/configuration.nixにもどって、klipperのサービスを定義する項目を作る。さっき確認したシリアルのIDを入れたり、klipperの設定ファイルであるprinter.cfgや、ログファイルの場所をユーザーディレクトリの下/home/usre/klipper/pringer.cfgにしておく。
# klipper
services.klipper = {
enable = true;
logFile = "/var/lib/klipper/klipper.log";
configFile = /home/user/klipper/printer.cfg;
firmwares = {
mcu = {
enable = false;
# Run klipper-genconf to generate this
configFile = /home/user/klipper/printer.cfg;
# Serial port connected to the microcontroller
serial = "usb-Klipper_stm32f429xx_xxxxxxxxxxxxxxxxxxxxxxxxx-if00";
};
};
};
systemd.services.klipper.serviceConfig.UMask = lib.mkForce "0007";
Mainsailを入れる
klipperのWeb APIを提供するMainsailのサービスも定義しちゃう。
# Mainsail
services.mainsail = {
enable = true;
};
Moonrakerも入れる
Webインターフェースを提供するMoonrakerのサービスも定義しちゃう。
# Moonraker
services.moonraker = {
enable = true;
klipperSocket = "/run/klipper/api"; # Klipper と通信するためのソケット
settings = {
server = {
host = "0.0.0.0";
port = 7125;
};
authorization = {
trusted_clients = [
"127.0.0.1"
"::1"
"192.168.1.0/24"
];
cors_domains = [
"http://localhost"
"http://127.0.0.1"
"http://192.168.1.39"
];
};
};
};
klippreとmoonrakerが相互にファイル参照できるように権限をいじる
このまま動かすとなんかklipperとmoonrakerが権限が無いからファイル触れねえよっていうエラーを出してくるので、ファイルの権限をちょちょいのチョイとしている。
users.users.moonraker = {
isSystemUser = true;
extraGroups = [ "klipper" ];
};
users.users.klipper = {
isSystemUser = true;
group = "klipper";
home = "/var/lib/klipper";
extraGroups = [ "moonraker" ];
};
users.groups.klipper.members = [ "moonraker" "klipper" ];
systemd.tmpfiles.rules = [
"d /var/lib/klipper 0755 klipper klipper -"
"d /var/lib/klipper/klipper-led_effect 0755 klipper klipper -"
];
造形物監視用のカメラサービスを定義する
ここまでの設定でKlipperをmoonrakerのWebGUIから操作できるようになっている。これでおうちのLANに参加している端末からなら、3Dプリンターのあるお部屋にいなくてもある程度の遠隔操作が可能となった。最近のモダンな3Dプリンターなら造形の様子をカメラで監視できるようになっているのがほぼ標準装備の時代だ。うちの3Dプリンターももじゃもじゃ様がご降臨なされた暁には、なるはやで停止できるようにしたい。moonrakerのWebGUIではUSB接続のWebカメラの画像をストリーミングで表示することができる。なので、USB接続のカメラの設定をやってしまう。
まずは、カメラの確認。
[user@nixos:~/klipper/klipper]$ ls -l /dev/video*
crw-rw----+ 1 root video 81, 0 1月 11 15:53 /dev/video0
crw-rw----+ 1 root video 81, 1 1月 11 15:53 /dev/video1
crw-rw----+ 1 root video 81, 2 1月 11 15:53 /dev/video2
crw-rw----+ 1 root video 81, 3 1月 11 15:53 /dev/video3
crw-rw----+ 1 root video 81, 4 1月 11 15:53 /dev/video4
crw-rw----+ 1 root video 81, 5 1月 11 15:53 /dev/video5
[user@nixos:~/klipper/klipper]$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'MJPG' (Motion-JPEG, compressed)
Size: Discrete 1920x1440
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1280x960
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 640x360
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 320x180
Interval: Discrete 0.033s (30.000 fps)
[1]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 640x360
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 320x180
Interval: Discrete 0.033s (30.000 fps)
[user@nixos:~/klipper/klipper]$ ls -l /dev/v4l/by-id
合計 0
drwxr-xr-x 2 root root 160 1月 11 15:53 .
drwxr-xr-x 4 root root 80 1月 11 15:53 ..
lrwxrwxrwx 1 root root 12 1月 11 15:53 usb-Chicony_Electronics_Co._Ltd._FJ_Camera-video-index0 -> ../../video4
lrwxrwxrwx 1 root root 12 1月 11 15:53 usb-Chicony_Electronics_Co._Ltd._FJ_Camera-video-index1 -> ../../video5
lrwxrwxrwx 1 root root 12 1月 11 15:53 usb-SYX-231020-J_HD_Camera-video-index0 -> ../../video2
lrwxrwxrwx 1 root root 12 1月 11 15:53 usb-SYX-231020-J_HD_Camera-video-index1 -> ../../video3
lrwxrwxrwx 1 root root 12 1月 11 15:53 usb-SunplusIT_Inc_FJ_8M_Camera_01.00.00-video-index0 -> ../../video0
lrwxrwxrwx 1 root root 12 1月 11 15:53 usb-SunplusIT_Inc_FJ_8M_Camera_01.00.00-video-index1 -> ../../video1
/dev/video0~/dev/video5までの6つのビデオデバイスがある。カメラとしては、Q5011のインカメ(usb-SunplusIT_Inc_FJ_8M_Camera)、アウトカム(usb-SYX-231020-J_HD_Camera)、外付けのUSBWebCam(usb-SYX-231020-J_HD_Camera)の3つだ。いずれもUSB接続となっている。インカメとアウトカムはビルドプレートを映すのには不向きなので使わない。外付けのWebCamはアマゾンで買った3Dプリンタ用の小型カメラだ。これをエンクロージャー内に配置する。ほかにもUSB接続すると別角度からの映像も同時に監視できるが、USBバス帯域に収まるよう、解像度とフレームレート、カメラの個数を調整する必要がある。この環境では2つが限界だった。将来的に拡張の余地を残していまは1つだけにしておく。
/dev/v4l/by-id で確認したデバイスIDでsystemdのサービスを定義しておく。
# CAMERA
services.mjpg-streamer.enable = true;
# 自前の systemd サービス定義(UVC対応USBカメラ例)
systemd.services.mjpg-streamer-3dp001 = {
description = "mjpg-streamer for USB webcam";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = ''
${pkgs.mjpg-streamer}/bin/mjpg_streamer \
-i "${pkgs.mjpg-streamer}/lib/mjpg-streamer/input_uvc.so \
-d /dev/v4l/by-id/usb-SYX-231020-J_HD_Camera-video-index0 -r 1920x1080 -f 30" \
-o "${pkgs.mjpg-streamer}/lib/mjpg-streamer/output_http.so -p 1920 -w ${pkgs.mjpg-streamer}/share/mjpg-streamer/www"
'';
Restart = "always";
User = "root";
};
};
あとは、printer.cfgを色々環境に合わせていじくって、サイドリビルドすると完成だ!OctoPiよりも使いやすい環境ができたと思う。

NixOSのメンテナンス
NixOSは先述のとおり、コンフィグファイルさえあれば同じ環境の構築が容易だったり、前の環境に戻るのが簡単だったりと色々恩恵があるのだが、環境をリビルドするたびにストアディレクトリに環境が増えていくのでほっとくとすぐいっぱいいっぱいになってしまう。なので、アップデートしたりしたらその都度、いらなくなった環境は削除する必要がある。
環境の更新
[user@nixos:~/klipper/klipper]$ sudo nixos-rebuild switch --upgrade
古い世代の一覧
[user@nixos:~/klipper/klipper]$ sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
古い世代を3世代残して削除
[user@nixos:~/klipper/klipper]$ sudo nix-env --delete-generations --profile /nix/var/nix/profiles/system +3
参照されなくなったビルドの削除
[user@nixos:~/klipper/klipper]$ sudo nix-collect-garbage -d
NixOS良く分からん
NixOSはなんか組み込みLinuxっぽくて難しい。わからんなりにあやふやな理解でここまで構築してきたが、良く分からんが故にやりたくてもできなかったことがちらほらある。
例えば、klipperのプラグインはプラグインディレクトリにpythonを放り込んでおけば使えるようになるのだが、ストアディレクトリは直接いじくれないのでプラグインを突っ込むことができなかった。どうやればいいのか、ChatGPTに相談しながら進めてみたが結局、プラグインを機能させることができなかった。LEDを色々設定できるプラグインを使いたかったのだが、今はデフォルトの設定だけで我慢している。
ともあれ、これで2000円で買った使い道のないQ5011を3Dプリンタのタッチパネル付き制御端末として利用できるようになった。Q5011はRaspberryPi3よりもハイパワーなので色々恩恵があるのではないかと期待している。次は、Replicator2Xのエクストルーダー周りをモダンなものに改造しようと思っているが、それはまた別のお話。

ASA フィラメント 1.75mm
MSL FORCE M.2 SSD NVME SATA 外付けケース 10Gbps 1000MB/s USB-A USB-C USB3.2 Gen2 4TB 外付ハードディスク対応
シリコンパワー SSD 512GB 3D NAND M.2 2280 PCIe3.0×4 NVMe1.3 P34A60シリーズ 5年保証 SP512GBP34A60M28