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
- Klipper と Moonraker を一度削除してから2台分インストールする
klipper_config/printer_1/printer.cfg
とklipper_config/printer_2/printer.cfg
を設定する- タイムラプス動画撮影のためのスクリプトを clone する
- タイムラプス動画撮影のインストールスクリプトを2つ用意して修正する
- タイムラプス動画撮影のスクリプトをインストールする
- カメラの設定ファイルを2つ用意して編集する
- 動画を保存するディレクトリを2つ用意する
- 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_1
と klipper_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_1
と klipper_config/printer_2
に moonraker.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.txt
、klipper_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.txt
と webcam2.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 をクリックします。
すると API URL の入力を求められますので、上記の Moonraker のインストールの最後に表示された 192.168.1.5:7126
を入力します。問題がなければ入力欄右側にある雲マークが緑色になりますので、SAVE ボタンを押して保存します。
これで Printers にもう1台のプリンタが表示されますので、必要に応じて2台のプリンタの制御画面を切り替えて操作します。