2026-07-06

Ender 3 V3 SE Klipper 전환 기록 (4) - 카메라 장착

Ender 3 V3 SE를 Klipper로 전환하는 과정의 네 번째 게시글입니다.

3D PrintKlipperLinux

Klipper를 사용하면서 이제 웹을 통해 출력 상태를 확인할 수 있게 되었으나, 여전히 프린터 자체는 직접 눈으로 봐야 한다. 특히 장시간 출력을 하며 다른 작업을 하는 동안 틈틈이 출력이 잘 되고 있는지 확인하려면 카메라가 사실상 필수에 가깝다. 이번 글에서는 Crowsnest를 이용해 USB 웹캠을 연동하고 Mainsail을 통해 확인하는 과정을 정리한다.

Crowsnest 설치

kiauh를 통해 Crowsnest를 설치할 수 있다. 일반적으로, 설치 과정을 따라가면 된다. 설정 파일은 crowsnest.conf이고, 기본 설정이 이 과정에서 자동으로 설정된다.

crowsnest.conf 설정

Mainsail을 사용한다면 MACHINE 메뉴에서 crowsnest.conf를 열 수 있다. 앞서 언급한 대로 기본 설정이 이미 들어가 있을 것이다. 여기서 먼저 확인해야 할 것은 [cam 1] 섹션의 device 설정이다.

카메라 위치 확인

카메라는 /dev/video*의 형태로 연결된다. 기본 설정에서는 /dev/video0이 들어가 있는데, 이것이 맞다는 보장이 없으니 실제 카메라가 어디에 연결되어 있는지 확인해야 한다.

ls /dev/video*

나의 경우 아래의 결과가 나왔다.

crw-rw---- 1 root video 81, 0 Jul  5 13:27 /dev/video0
crw-rw---- 1 root video 81, 1 Jul  5 13:27 /dev/video1
crw-rw---- 1 root video 81, 2 Jul  5 13:27 /dev/video2

이 중 무엇이 카메라인지 찾아야 한다.

v4l2-ctl --list-devices

내 환경에서는 다음과 같이 보였다.

cedrus (platform:cedrus):
        /dev/video0
        /dev/media0

IPC-HD1 WEBCAM: IPC-HD1 WEBCAM (usb-5200000.usb-1):
        /dev/video1
        /dev/video2
        /dev/media1

video1과 video2가 내 웹캠이 생성한 장치이다. 이 중 무엇인지 찾아야 한다.

v4l2-ctl -d /dev/video1 --list-formats-ext

만약 카메라가 맞다면 다음과 같은 내용이 보일 것이다.

ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'YUYV' (YUYV 4:2:2)
                Size: Discrete 640x480
                        Interval: Discrete 0.030s (33.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
...

video2의 경우 아래와 같이 나왔다.

ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

해상도와 픽셀 포맷 등이 정상적으로 표시되는 장치가 실제 영상 스트림이다. 일반적으로 낮은 번호가 실제 장치인 경향이 있으나, 확실하지는 않으니 확인해 보는 것이 권장된다.

최종적으로 video1이 실제 영상 스트림으로 확인되었으니, device 항목의 장치를 /dev/video1으로 설정하면 된다.

번외: 그렇다면 video0의 정체는?

video0의 경우 cedrus라는 이름을 가진 것을 알 수 있다. 이 장치의 정체는 카메라가 아니라 Allwinner의 비디오 디코더이다. 이전에 서술했듯 BTT Pi v1.2는 Allwinner H616을 채택했는데, 여기에 내장된 장치이다. 만약 앞서 사용한 명령으로 확인해 본다면 다음과 같은 결과를 볼 수 있다.

ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'NV12' (Y/UV 4:2:0)
        [1]: 'ST12' (Y/UV 4:2:0 (32x32 Linear))

해상도/프레임 설정

일반적으로 출력물을 보는 데 그리 높은 해상도나 프레임률이 필요하지는 않다. 대체로 640x480@10fps만 되어도 충분히 프린트가 정상적으로 진행되고 있는지 확인할 정도는 된다. 나의 경우는 640x360 및 최대 15fps로 설정했는데, 아래와 같다.

[cam 1]
...
resolution: 640x360
max_fps: 15
...

custom_flags 설정

정상적인 웹캠이라면 위 항목만 해도 충분하다. 그러나 나는 해상도를 아무리 낮춰도 5 fps 근처로 나오는 등 문제가 있었다. 이 제품의 경우 MJPG를 사용하면 프레임이 깨지는 것으로 추측되는데, 내 것이 불량인지는 모르겠지만 당시 화상 수업에 사용할 때도 낮은 프레임률과 드물게 일부 프레임이 깨지는 현상을 겪은 기억이 있다. 여러 시도 끝에 custom_flags--format=YUYV --buffers=5 --device-timeout=5를 사용했더니 10 fps 근처를 얻을 수 있었다.

번외: MJPG/YUYV

웹캠의 영상은 여러 포맷으로 전송될 수 있는데, 보통 MJPG와 YUYV가 흔하게 보인다.

MJPG는 Motion JPEG의 약자로, 웹캠의 영상을 JPEG로 압축하여 전송하는 방식이다. 프레임이 압축되어 있으니 USB 대역폭을 적게 쓰고 높은 해상도와 높은 프레임률을 지원하기 유리하다. 그러나 일부 저가형 웹캠은 구현 품질이 좋지 않아 내가 겪은 것처럼 프레임 드랍 등의 문제가 생길 수 있다.

YUYV는 압축되지 않은 포맷을 사용한다. 따라서 대역폭을 더 많이 쓰고, 해상도와 프레임률에서 불리하다. 그러나 앞서 설정한 것처럼 높은 해상도와 높은 프레임률이 목표가 아니라면, MJPG 구현 품질이 나쁜 저가 웹캠에서는 오히려 더 안정적일 수 있다.

Mainsail 설정

Mainsail 설정에서 WEBCAMS 메뉴를 누르면 웹캠을 추가할 수 있다. 보통 기본값을 그대로 두면 작동한다.

카메라 장착

나는 장착 위치로 Z 축의 왼쪽 끝을 골랐다. 베드 움직임도 잘 보이고 레이어가 점점 올라갈수록 카메라도 따라서 올라가는 등, 전반적으로 무난한 위치였기 때문이다. 모델링은 여기의 Webcam Mount v2를 사용했다.

사용한 모델링을 포함해 대부분의 웹캠 장착 브라켓은 웹캠 하단의 삼각대 마운트에 고정하는 것을 전제로 설계되어 있는데, 내 카메라 모델에는 해당 마운트가 없었다. 그래서 웹캠의 모니터 고정 클립을 제거한 다음, 그 자리에 연결될 수 있는 별도의 브라켓을 제작했다. 해당 브라켓에는 M4 나사 홀과 너트 포켓을 넣어 삼각대 마운트 역할을 하도록 해 고정했다. 추후 해당 브라켓의 모델링 파일을 링크할 예정이다.

다만 만들고 나서 알았지만, 사실 삼각대의 나사는 M4가 아니라 별도의 규격을 사용한다. 원본 모델의 페이지에서도 삼각대 나사의 모델링 링크를 별도로 제공하고 있었다. 나는 당장 남는 나사가 M4였고 이것으로도 고정 자체는 큰 무리가 없었기 때문에 그대로 사용했다.

장착 사진

전면 모습

추후 필요한 작업

카메라는 저조도에서는 영상이 제대로 나오지 않는다. 그러나 프린터는 방의 전등을 끈 상태에서도 자주 동작하므로, 본래의 설치 목적과 어긋나는 상황이 자주 생긴다. 이를 해소하기 위해 LED 스트립을 장착하려고 한다. 현재는 장착 위치 및 장착 방법, 전원 공급 방법 등에 대해 고민하고 있다.

다음에 다룰 내용

다음에는 필라멘트 런아웃 센서 장착에 대해 다룰 예정이다. 특히 여기서는 Creality가 판매하는 공식 런아웃 센서 장착 키트 대신, 저렴한 서드파티 센서를 순정의 신호에 맞게 장착하는 방법에 대해 다루려고 한다.