2017년 9월 6일 수요일

3D 프린터 원격제어 - 9편 (두대의 3D 프린터를 한대의 라즈베리파이로 제어하기)

음.. 이제까지 취미 프로젝트에서 9편까지 진행 되었던 것은 없었던 것 같은데, OTIS 로봇을 만들려고 잠깐 스쳐가던 3D 프린터에 이렇게 까지 깊게 들어올 줄은 생각치 못했다.

로봇을 만들기 위해 Core200 이라는 프린터를 다루기 시작했고 이것저것 필요한 것을 생각하다 보니 원격으로 제어하며 모니터링하는 것이 필요해서 OctoPrint 를 사용하기 시작했고 출력된 결과물을 자동으로 정리하는 것을 만들어 보기 위해 다양한 생각을 하다가 챔버 방식이 아닌 프린터가 있었으면 해서 결국에 또하나의 프린터를 구매 했다.

이렇게 되다 보니 원격으로 두대의 프린터를 모니터링 하고 싶어졌다.
하지만 아쉽게도 OctoPrint 는 공식적으로는 한대의 프린터만 제어할 수 있다. 그리고 내가 갖고 있는 라즈베리 카메라가 한대 뿐이고, 릴레이도 Core200 의 전원과 LED 조명에 다 썼기 때문에 장비도 부족했다.

일단 부족한 장비는 나중에 고민하기로 하고 OctoPrint 를 사용해서 2대의 프린터를 모니터하는 방법부터 찾아 봤다.

구글에서 가장 먼저 검색 되는 것은 여기 였는데 가능성은 확인할 수 있었으나 완벽한 솔루션은 찾을 수 없었다. 그 다음으로 이곳 에서 같은 주제로 질의 응답이 있었는데 70% 정도의 구현 방법이 설명이 되어 있었다. 하지만 이또한 완벽하지 않았고 '이러 이러하면 저러저러 하게 될거야' 정도의 얼버무림을 깔끔하게 구현해 내야만 했다. 그래서~~ 다양한 시도와 시간 투자로 완벽하게? 구현해 냈다.

정리를 시작 하기 전에 필요한 장비를 다시 정리 해 보면,
1. 릴레이 2개 - Core200 과 CR-10 의 전원을 제어 하기 위한 스위치
2. 릴레이 1개 - Core200 의 LED
3. 라즈베리 파이 카메라 2개 - Core200 과 CR-10 을 모니터링 하기 위한 카메라
4. 1구 콘센트 암/수, 전선

이중에 모자란 것은 릴레이 1개와 카메라 1대 였다.
궁여지책으로 모자란 릴레이는 Core200 의 LED 제어를 포기하고 CR-10 전원에 사용하기로 했다. 그리고 라즈베리 파이 카메라는 당장 구할 수가 없으니 집에서 놀고있는 골동품 USB 카메라를 사용해 보기로 했다.

그럼 어떻게 문제를 해결했는지 정리를 시작해 보자.

1. octoprint 를 하나 더 띄우기

 이 부분은 위에 있는 두번째 링크인 구글 그룹에 잘 설명 되어 있다.
    sudo cp /etc/init.d/octoprint /etc/init.d/octoprint2
    sudo cp /etc/default/octoprint /etc/default/octoprint2
then in /etc/init.d/octoprint2 change these lines:
    NAME="Octoprint"
    [...]
    PKGNAME=octoprint
to this:
    NAME="Octoprint2"
    [...]
    PKGNAME=octoprint2
and in /etc/default/octoprint2 change this line:
    DAEMON_ARGS="--port=$PORT"
to this:
    DAEMON_ARGS="--port=5001 --config /home/pi/.octoprint2/config.yaml --basedir /home/pi/.octoprint2"
Then register the octoprint2 service to automatically start upon server start:
    sudo update-rc.d octoprint2 defaults 99
and start your second instance with
    sudo service octoprint2 start
이렇게 하면 하나는 5000 번 포트를, 다른 하나는 5001번 포트를 사용하면서 동작하게 된다.

2. mjpg-streamer 를 하나 더 띄워주기

카메라로 모니터링을 하기 위해서는 스트리밍이 필요한데, mjpg-streamer 가 이 역할을 해 주고 있다. 이것도 octoprint 와 마찬가지로 2개 띄워줘야 한다.

이것은 /root/bin/webcamd 에 보면 mjpg-streamer 를 실행하는 부분이 있는데 그 아랫줄에 추가 해 주면 된다.
./mjpg_streamer -o "output_http.so -p 8080 -w $camera_http_webroot $camera_http_options" -i "$input" &   
./mjpg_streamer -o "output_http.so -p 8081-w $camera_http_webroot $camera_http_options -i "input_file.so -f /tmp/zc0301 -n test.jpg -r" &
원래는 ./mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 640x480 -f 15" 처럼 해주면 되는데 내가 갖고 있는 구닥다리 USB 카메라는 MJPEG 을 지원하지 않는 모델이라서 test.jpg 로 저장하게 해 두고 그걸 퍼다 나르게 했다.

참고로 test.jpg 를 저장하는 것은 gstreamer 로 했다.
gst-launch-1.0 v4l2src ! queue ! multifilesink location="/tmp/zc0301/test.jpg" &
요렇게~

3. haproxy 설정을 추가 해 줘야 한다.

눈치 챘겠지만 octoprint 를 web 으로 동작을 하는데 octoprint 는 80 포트가 아닌 5000번 50001번 포트를 사용을 하기 때문에 이것들을 적당히 바인딩 해 줘야 한다. octoprint 를 haproxy 를 사용해서 이것을 한다. mjpg-streamer 의 8080번 / 8081번 포트 역시 바인딩을 해 줘야 한다.

/etc/haproxy/haproxy.cfg 를 수정하면 된다.
frontend public-2
        bind *:81
        bind 0.0.0.0:443 ssl crt /etc/ssl/snakeoil.pem
        option forwardfor except 127.0.0.1
        use_backend webcam-usb if { path_beg /webcam-usb/ }
        default_backend octoprint-2
backend octoprint-2
        acl needs_scheme req.hdr_cnt(X-Scheme) eq 0
        reqrep ^([^\ :]*)\ /(.*) \1\ /\2
        reqadd X-Scheme:\ https if needs_scheme { ssl_fc }
        reqadd X-Scheme:\ http if needs_scheme !{ ssl_fc }
        option forwardfor
        server octoprint2 127.0.0.1:5001
        errorfile 503 /etc/haproxy/errors/503-no-octoprint.http
backend webcam-usb
        reqrep ^([^\ :]*)\ /webcam-usb/(.*)     \1\ /\2
        server webcam2  127.0.0.1:8081
        errorfile 503 /etc/haproxy/errors/503-no-webcam.http

추가한 내용만 정리하면 위와 같다.
굵은 글씨로 표시한 webcap-usb 와 5001번 8081번 포트에 대한 설정이 핵심이다.

이렇게 해주고 재부팅을 해 주면 짱 잘 동작한다. 역시 백문이 불여일견!
짜잔~~  Core200과 CR-10 을 한눈에 보면서 컨트롤하고 모니터링이 가능해 졌다.

좀 더 자세한 설명을 위해 동영상도 감상해 보자.
각각의 전원을 관리하고 컨트롤 할 수 있고, 카메라로 모니터링이 가능하다.

생각보다 난이도가 높았던 작업이었던지라...... 피곤하다.

댓글 없음: