Raspberry Pi 1台で3Dプリンタ2台を動かしつつタイムラプス動画を撮影する方法

概要

前置き

日本の3Dプリンタユーザーが集まっている Discord の 3D Printing Japan Comunity のメンバーの虎鉄悦夫さんがRaspberry pi1台で複数台のKlipper搭載3Dプリンタを制御する方法(KIAUH活用版)|虎鉄悦夫|noteという記事を執筆されたので、自分もやってみようと思ってみたら結構大変だったので、自分用の備忘録として作業記録を残します。

なお、今回の作業はゼロからのスタートではなく、2台の Raspberry Pi で2台の3Dプリンタ(Klipperインストール済)を制御している状態からスタートして、1台の Raspberry Pi で2台の3Dプリンタを動かしながらタイムラプス動画も撮影できるようにしました。

TL;DL

  1. Klipper と Moonraker を一度削除してから2台分インストールする
  2. klipper_config/printer_1/printer.cfgklipper_config/printer_2/printer.cfg を設定する
  3. タイムラプス動画撮影のためのスクリプトを clone する
  4. タイムラプス動画撮影のインストールスクリプトを2つ用意して修正する
  5. タイムラプス動画撮影のスクリプトをインストールする
  6. カメラの設定ファイルを2つ用意して編集する
  7. 動画を保存するディレクトリを2つ用意する
  8. FluiddPi で2台のプリンタを制御できるようにする

具体的な作業

Klipper と Moonraker の削除

既存の Klipper と Moonraker の削除は、Kiauh を使うと簡単です。まず、./kiauh/kiauh.sh でプロンプトを開いて 3) [Remove] を選択します。

 1/=======================================================\
 2|     ~~~~~~~~~~~~~~~~~ [ KIAUH ] ~~~~~~~~~~~~~~~~~     |
 3|        Klipper Installation And Update Helper         |
 4|     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     |
 5\=======================================================/
 6/=======================================================\
 7|     ~~~~~~~~~~~~~~~ [ Main Menu ] ~~~~~~~~~~~~~~~     |
 8|-------------------------------------------------------|
 9|  0) [Upload Log]     |       Klipper: Installed: 2    |
10|                      |        Branch: master          |
11|  1) [Install]        |                                |
12|  2) [Update]         |     Moonraker: Installed: 2    |
13|  3) [Remove]         |                                |
14|  4) [Advanced]       |      Mainsail: Not installed!  |
15|  5) [Backup]         |        Fluidd: Installed!      |
16|                      | KlipperScreen: Not installed!  |
17|  6) [Settings]       |  Telegram Bot: Not installed!  |
18|                      |                                |
19|                      |          DWC2: Not installed!  |
20|  v3.1.0-93           |     Octoprint: Not installed!  |
21|-------------------------------------------------------|
22|                        Q) Quit                        |
23\=======================================================/
24Perform action: 3

次に 1) [Klipper] を選択して Klipper を削除すると答えると、合わせて Moonraker も削除するか聞かれますので、はいと答えます。

 1/=======================================================\
 2|     ~~~~~~~~~~~~~~~~~ [ KIAUH ] ~~~~~~~~~~~~~~~~~     |
 3|        Klipper Installation And Update Helper         |
 4|     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     |
 5\=======================================================/
 6/=======================================================\
 7|     ~~~~~~~~~~~~~~ [ Remove Menu ] ~~~~~~~~~~~~~~     |
 8|-------------------------------------------------------|
 9|  Directories which remain untouched:                  |
10|  --> Your printer configuration directory             |
11|  --> ~/kiauh-backups                                  |
12|  You need remove them manually if you wish so.        |
13|-------------------------------------------------------|
14|  Firmware:                |  Touchscreen GUI:         |
15|  1) [Klipper]             |  5) [KlipperScreen]       |
16|                           |                           |
17|  Klipper API:             |  Other:                   |
18|  2) [Moonraker]           |  6) [Duet Web Control]    |
19|                           |  7) [OctoPrint]           |
20|  Klipper Webinterface:    |  8) [PrettyGCode]         |
21|  3) [Mainsail]            |  9) [Telegram Bot]        |
22|  4) [Fluidd]              |                           |
23|                           |  10) [MJPG-Streamer]      |
24|                           |  11) [NGINX]              |
25|-------------------------------------------------------|
26|                       B) « Back                       |
27\=======================================================/
28Perform action: 1

これで既存の Klipper と Moonraker を削除できましたので、今度は必要な台数分 Klipper と Moonraker をインストールします。

Klipper のインストール

インストール方法は、./kiauh/kiauh.sh でプロンプトを開いて 1) [Install] を選択し、続いて 1) [Klipper] を選択します。

 1/=======================================================\
 2|     ~~~~~~~~~~~~~~~~~ [ KIAUH ] ~~~~~~~~~~~~~~~~~     |
 3|        Klipper Installation And Update Helper         |
 4|     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     |
 5\=======================================================/
 6/=======================================================\
 7|     ~~~~~~~~~~~ [ Installation Menu ] ~~~~~~~~~~~     |
 8|-------------------------------------------------------|
 9|  You need this menu usually only for installing       |
10|  all necessary dependencies for the various           |
11|  functions on a completely fresh system.              |
12|-------------------------------------------------------|
13|  Firmware:                |  Touchscreen GUI:         |
14|  1) [Klipper]             |  5) [KlipperScreen]       |
15|                           |                           |
16|  Klipper API:             |  Other:                   |
17|  2) [Moonraker]           |  6) [Duet Web Control]    |
18|                           |  7) [OctoPrint]           |
19|  Klipper Webinterface:    |  8) [PrettyGCode]         |
20|  3) [Mainsail]            |  9) [Telegram Bot]        |
21|  4) [Fluidd]              |                           |
22|                           |  Webcam:                  |
23|                           |  10) [MJPG-Streamer]      |
24|-------------------------------------------------------|
25|                       B) « Back                       |
26\=======================================================/
27Perform action: 1

そうすると何台分インストールするか聞かれますので、必要な台数を回答するとその数だけ Klipper をインストールしてくれます。

Moonraker のインストール

Moonraker のインストールも同様の手順で、上の画面で 2) [Moonraker] を選択すると何台分インストールするか聞かれるので、必要な台数を回答します。

なお、インストールの最後に FluiddPi でアクセスするときに必要な IPアドレスが表示されますので、忘れずにメモします。

1#########################################################
2 2 Moonraker instances have been set up!
3#########################################################
4
5       ● Instance 1: 192.168.1.5:7125
6       ● Instance 2: 192.168.1.5:7126

これで Klipper と Moonraker がサービスとして必要な台数分だけ起動されます。

1systemctl -l | grep klipper
2klipper-1.service  loaded active running   Starts klipper instance 1 on startup
3klipper-2.service  loaded active running   Starts klipper instance 2 on startup
4
5systemctl -l | grep moonraker
6moonraker-1.service  loaded active running   Starts Moonraker 1 on startup
7moonraker-2.service  loaded active running   Starts Moonraker 2 on startup

ちなみに、Klipper と Moonraker が1台分だけ起動されている場合のサービス状況は次のとおりです。

1systemctl list-units --type=service | grep klipper
2klipper.service     loaded active running Starts klipper on startup
3
4systemctl list-units --type=service | grep moonraker
5moonraker.service   loaded active running Starts Moonraker on startup

printer.cfg の編集

klipper_config/printer_1klipper_config/printer_2 ができているはずなので、それぞれのディレクトリに printer.cfg を作成して設定します。私の場合、klipper_config/printer_1/printer.cfg を Prusa に、klipper_config/printer_2/printer.cfg を Ender 3 Pro に割り当てています。

printer.cfg[mcu] に設定するシリアルポートについては、Raspberry Pi とプリンタを接続してからプリンタの電源を入れ、./kiauh/kiauh.sh を実行して 4) Advanced -> 6) [Get MCU ID] -> 1) USB と進むと確認できます。

1###### Identifying MCU ...
2 ● (USB) MCU #1: /dev/serial/by-id/usb-Klipper_stm32f103xe_34FFFFFF344E313337570157-if00
3 ● (USB) MCU #2: /dev/serial/by-id/usb-Prusa_Research__prusa3d.com__Original_Prusa_i3_MK3_CZPX3419X004XC43991-if00

ここで確認したシリアルポートを [mcu] に設定します。プリンタを取り違えるとホットエンドが常時加熱されたりしますので、その点は注意してください。そのほかの設定は、プリンタが1台の場合と同じです。

moonraker.conf の編集

klipper_config/printer_1klipper_config/printer_2moonraker.cfg を作成して設定します。printer.cfg とは違い、moonraker.conf はプリンタが複数台になったことに伴って設定箇所が増えていますので、変更点と変更理由を説明します。

なお、klipper_config/printer_1/moonraker.cfg を Prusa に、klipper_config/printer_2/moonraker.cfg を Ender 3 Pro に割り当てています。

1# printer_2/moonraker.cfg
2[server]
3-port: 7125
4+port: 7126

Ender 3 Pro のアクセス先が「192.168.1.5:7126」となっていることに伴う変更です。

1# printer_1/moonraker.cfg
2[server]
3-klippy_uds_address: /tmp/klippy_uds
4+klippy_uds_address: /tmp/klippy_uds-1
1# printer_2/moonraker.cfg
2[server]
3-klippy_uds_address: /tmp/klippy_uds
4+klippy_uds_address: /tmp/klippy_uds-2

上記のインストールにより /tmp/klippy_uds/tmp/klippy_uds-1/tmp/klippy_uds-2 になっていますので、それに合わせて変更しています。

1# printer_1/moonraker.cfg
2+[database]
3+database_path: /home/pi/.moonraker_database_1
1# printer_2/moonraker.cfg
2+[database]
3+database_path: /home/pi/.moonraker_database_2

デフォルトでは設定不要のセクションですが、上記のインストールにより設定する必要が生じています。

1# printer_1/moonraker.cfg
2[file_manager]
3-config_path: ~/klipper_config
4+config_path: ~/klipper_config/printer_1
1# printer_2/moonraker.cfg
2[file_manager]
3-config_path: ~/klipper_config
4+config_path: ~/klipper_config/printer_2

設定ファイルの保存場所が /klipper_config/printer_1/klipper_config/printer_2 に分かれたことに伴う変更です。

1# printer_1/moonraker.cfg
2[update_manager timelapse]
3-#output_path: ~/timelapse/
4+output_path: ~/timelapse/printer1
1# printer_2/moonraker.cfg
2[update_manager timelapse]
3-#output_path: ~/timelapse/
4+output_path: ~/timelapse/printer2

タイムラプス動画の保存場所をプリンタ毎に用意しています。

1# printer_1/moonraker.cfg
2[timelapse]
3-#frame_path: /tmp/timelapse/
4+frame_path: /tmp/timelapse/printer1
1# printer_2/moonraker.cfg
2[timelapse]
3-#frame_path: /tmp/timelapse/
4+frame_path: /tmp/timelapse/printer2

タイムラプス動画の撮影中の画像の保存先をプリンタ毎に分けています。保存先が同じだと、2台のカメラで撮影した画像が繋ぎ合わされた動画が作成されます。

1# printer_2/moonraker.cfg
2[timelapse]
3-#snapshoturl: http://localhost:8080/?action=snapshot
4+snapshoturl: http://192.168.1.5:8081/?action=snapshot

2台目のプリンタのみ設定します。2台の Webカメラを使うように設定していますが、2台目のカメラの URL がデフォルトの http://localhost:8080/?action=snapshot から変更されていますので、それに伴う変更です。なお、IPアドレス直打ちにしているのは、localhost では上手く接続できないときがあったためです。

タイムラプス動画撮影のスクリプトをインストール

git clone https://github.com/mainsail-crew/moonraker-timelapse.git を実行してタイムラプス動画撮影スクリプトをインストールしますが、このスクリプトは、複数台のプリンタが接続されているケースに対応していないため、修正が必要です。

1cp moonraker-timelapse/install.sh moonraker-timelapse/install_printer1.sh
2cp moonraker-timelapse/install.sh moonraker-timelapse/install_printer2.sh

上記のコマンドでスクリプトを必要な台数分コピーしてから、Klipper と Moonraker を複数起動したことに伴うサービス名の変更に対応するための修正を行います。

 1-    if [ "$(sudo systemctl list-units --full -all -t service --no-legend | grep -F "klipper.service")" ]; then
 2+    if [ "$(sudo systemctl list-units --full -all -t service --no-legend | grep -F "klipper-1.service")" ]; then
 3-        sudo systemctl stop klipper
 4+        sudo systemctl stop klipper-1
 5-    if [ "$(sudo systemctl list-units --full -all -t service --no-legend | grep -F "moonraker.service")" ]; then
 6+    if [ "$(sudo systemctl list-units --full -all -t service --no-legend | grep -F "moonraker-1.service")" ]; then
 7-        sudo systemctl stop moonraker
 8+        sudo systemctl stop moonraker-1
 9- After=moonraker.service
10- Wants=moonraker.service
11+ After=moonraker-1.service
12+ Wants=moonraker-1.service
13- ExecStopPost=systemctl restart klipper
14- ExecStopPost=systemctl restart moonraker
15+ ExecStopPost=systemctl restart klipper-1
16+ ExecStopPost=systemctl restart moonraker-1
17-    sudo systemctl restart moonraker
18+    sudo systemctl restart moonraker-1
19-    sudo systemctl restart klipper
20+    sudo systemctl restart klipper-1

スクリプトを修正したら、次のコマンドでスクリプトをインストールします。

1bash ~/moonraker-timelapse/install_printer1.sh KLIPPER_CONFIG_DIR=/home/pi/klipper_config/printer_1/
2bash ~/moonraker-timelapse/install_printer2.sh KLIPPER_CONFIG_DIR=/home/pi/klipper_config/printer_2/

引数に KLIPPER_CONFIG_DIR=/home/pi/klipper_config/printer_1/ を指定しているのは、printer.cfg の保存場所が klipper_config から klipper_config/printer_1 に変更されていることに対応するためです。

あとは、タイムラプス動画を保存する場所をカメラ毎に用意します。

1mkdir timelapse/printer1
2mkdir timelapse/printer2

Webカメラの設定

次に Webカメラの設定を行います(この作業に一番悩みました)。

まず、FluiddPi をインストールしている場合、Webカメラは webcamd.service というサービスで制御されています。

1systemctl list-units --type=service | grep webcam
2webcamd.service     loaded active running the FluiddPI webcam daemon (based on OctoPi) with the user specified config

このサービスは /etc/systemd/system/webcamd.service から起動されており、コードは次のとおりです。

 1cat /etc/systemd/system/webcamd.service
 2
 3[Unit]
 4Description=the FluiddPI webcam daemon (based on OctoPi) with the user specified config
 5
 6[Service]
 7WorkingDirectory=/usr/local/bin
 8StandardOutput=append:/var/log/webcamd.log
 9StandardError=append:/var/log/webcamd.log
10ExecStart=/usr/local/bin/webcamd
11Restart=always
12Type=forking
13User=pi
14
15[Install]
16WantedBy=multi-user.target

そして、/etc/systemd/system/webcamd.service/usr/local/bin/webcamd を実行していますが、/usr/local/bin/webcamd のコードを見ると、~/klipper_config ディレクトリにある複数の webcam*.txt を読み込んでいることが分かります。

 1# /usr/local/bin/webcamd 抜粋
 2config_dir="/home/pi/klipper_config"
 3
 4echo "Starting up webcamDaemon..."
 5echo ""
 6
 7cfg_files=()
 8#cfg_files+=/boot/fluidd.txt
 9if [[ -d ${config_dir} ]]; then
10  cfg_files+=( `ls ${config_dir}/webcam*.txt` )
11fi

そのため、複数台のWebカメラを制御したければ、klipper_config/webcam1.txtklipper_config/webcam2.txt という具合に、カメラの台数分だけ設定ファイルを用意すれば良いということになります。

そこで、次のコマンドで設定ファイルをカメラの台数分用意するとともに、既存の webcam.txt を読み込ませないためにリネームします。

1cp klipper_config/webcam.txt klipper_config/webcam1.txt
2cp klipper_config/webcam.txt klipper_config/webcam2.txt
3mv klipper_config/webcam.txt klipper_config/webcam.txt.backup

そして、webcam1.txtwebcam2.txt を設定しますが、カメラを複数台使う場合、デバイスファイル(/dev/video*)と映像の出力先(-p 808*)を指定する必要があります。

デバイスファイルは次のコマンドで確認できます。私のカメラは2台とも Logicool C270 なので usb-046d_0825 の部分が同じですが、video0, video1 が1台目のカメラ、video2, video3 が2台目のカメラのデバイスファイルで、webcam*.txt では、video0, video2 を指定します。

1ls -la /dev/v4l/by-id
2total 0
3drwxr-xr-x 2 root root 120 Feb  6 06:17 .
4drwxr-xr-x 4 root root  80 Feb  6 06:17 ..
5lrwxrwxrwx 1 root root  12 Feb  6 06:17 usb-046d_0825_338DCAC0-video-index0 -> ../../video2
6lrwxrwxrwx 1 root root  12 Feb  6 06:17 usb-046d_0825_338DCAC0-video-index1 -> ../../video3
7lrwxrwxrwx 1 root root  12 Feb  6 06:17 usb-046d_0825_C0A8C1F0-video-index0 -> ../../video0
8lrwxrwxrwx 1 root root  12 Feb  6 06:17 usb-046d_0825_C0A8C1F0-video-index1 -> ../../video1

映像の出力先は、camera_http_options-p 8080 とポート番号で指定します。

これらを踏まえて、デフォルト設定から変更した点は次のとおりです。

1# webcam1.txt
2-camera_usb_options="-r 640x480 -f 10"
3+camera_usb_options="-r 640x480 -d /dev/video0"
4-#camera_http_options="-n"
5+camera_http_options="-n -p 8080"
1# webcam2.txt
2-camera_usb_options="-r 640x480 -f 10"
3+camera_usb_options="-r 640x480 -d /dev/video2"
4-#camera_http_options="-n"
5+camera_http_options="-n -p 8081"

上手くいけば、次のとおり webcamd.service で2つのカメラが制御されるようになります。

 1systemctl status webcamd.service
 2 webcamd.service - the FluiddPI webcam daemon (based on OctoPi) with the user specified config
 3   Loaded: loaded (/etc/systemd/system/webcamd.service; enabled; vendor preset: enabled)
 4   Active: active (running) since Sun 2022-02-06 06:49:48 GMT; 6h ago
 5  Process: 378 ExecStart=/usr/local/bin/webcamd (code=exited, status=0/SUCCESS)
 6    Tasks: 6 (limit: 3596)
 7   CGroup: /system.slice/webcamd.service
 8           ├─537 ./mjpg_streamer -o output_http.so -w ./www-mjpgstreamer -n -p 8080 -i input_uvc.so -r 640x480 -d /dev/v
 9           └─590 ./mjpg_streamer -o output_http.so -w ./www-mjpgstreamer -n -p 8081 -i input_uvc.so -r 640x480 -d /dev/v
10Feb 06 06:49:47 fluiddpi mjpg_streamer[590]: MJPG-streamer [590]: Format............: JPEG
11Feb 06 06:49:47 fluiddpi mjpg_streamer[590]: MJPG-streamer [590]: TV-Norm...........: DEFAULT
12Feb 06 06:49:47 fluiddpi mjpg_streamer[590]: MJPG-streamer [590]: www-folder-path......: ./www-mjpgstreamer/
13Feb 06 06:49:47 fluiddpi mjpg_streamer[590]: MJPG-streamer [590]: HTTP TCP port........: 8081
14Feb 06 06:49:47 fluiddpi mjpg_streamer[590]: MJPG-streamer [590]: HTTP Listen Address..: (null)
15Feb 06 06:49:47 fluiddpi mjpg_streamer[590]: MJPG-streamer [590]: username:password....: disabled
16Feb 06 06:49:47 fluiddpi mjpg_streamer[590]: MJPG-streamer [590]: commands.............: disabled
17Feb 06 06:49:47 fluiddpi mjpg_streamer[590]: MJPG-streamer [590]: starting input plugin input_uvc.so
18Feb 06 06:49:47 fluiddpi mjpg_streamer[590]: MJPG-streamer [590]: starting output plugin: output_http.so (ID: 00)
19Feb 06 06:49:48 fluiddpi systemd[1]: Started the FluiddPI webcam daemon (based on OctoPi) with the user specified config
20lines 1-19/19 (END)

ここまできたら、後は FluiddPi 側の設定に移ります。

FluiddPi の設定

まず、http://fluiddpi.local または http://192.168.1.5:7125 にアクセスします。それから、右上のメニューアイコンをクリックしてから Add Printer をクリックします。

FluiddPi - Menu
FluiddPi - Add Printer

すると API URL の入力を求められますので、上記の Moonraker のインストールの最後に表示された 192.168.1.5:7126 を入力します。問題がなければ入力欄右側にある雲マークが緑色になりますので、SAVE ボタンを押して保存します。

FluiddPi - URL 入力

これで Printers にもう1台のプリンタが表示されますので、必要に応じて2台のプリンタの制御画面を切り替えて操作します。

FluiddPi - プリンタ追加後