옥토프린트

3D 프린터를 구매 후 이것 저것 많은 시도를 해보았는데요.
Youtube에서 많은 Timelapse 영상들을 보면서 저도 따라해 보고 싶어서, 옥토프린트(OctoPrint)를 설치해 보았습니다.

기본 설치

OctoPrint를 설치하기 위해서는 배포되는 이미지를 MicroSD에 Write 하고, 기타 설정을 진행하면 됩니다. 기존에 RetroPie 등의 라즈베리파이 배포본을 설치하는 과정과 동일하게 MicroSD를 포멧(파티션 제거)후, 다운받은 OctoPi & OctoPrint 이미지를 Write해주면 됩니다.

파티션 초기화 및 포멧을 위해 SD Card Formatter를 사용하였습니다.
OctoPrint가 설치된 OctoPi 이미지를 MicroSD에 Write하였습니다.

이미지 Write를 완료하면, Windows에서 인식할 수 있는 파티션이 존재하며, octopi-wpa-supplicant.txt 파일을 수정하여 기본적인 설정을 변경할 수 있습니다. WiFi 사용을 위해서는 network 설정의 주석(#)을 제거 후 SSID, Password를 입력합니다.

network={
   ssid="인터넷 공유기 SSID"
   psk="SSID비밀번호"
}

network 설정을 마친 microSD를 라즈베리파이에 꼽으면 부팅 후 자동으로 파티션을 확장하는 과정을 거처 정상적으로 사용할 수 있게됩니다.

OctoPi의 설정을 원하면 putty 등의 SSH Client 프로그램으로 접근하여 설정이 가능합니다. OctoPi에 접속하면 버전정보가 표시됩니다.

OctoPrint version : 1.5.3
OctoPi version    : 0.18.0

일반적으로 알려진 Password는 위험하므로 비밀번호의 변경이 필요합니다. 초기 ID/PW는 pi/raspberry 입니다. 또한 타임존은 Asia/Seoul로 변경하고, 로케일은 en_US.UTF-8로 수정하였습니다.

[pi@octopi:/home/pi]$ passwd pi
[pi@octopi:/home/pi]$ sudo dpkg-reconfigure tzdata
[pi@octopi:/home/pi]$ sudo dpkg-reconfigure locales
  • 초기 : pi / raspberry
  • 비밀번호 변경 명령 : passwd pi

이 후 웹브라우저에서 http://octopi.local/ 에 접근하면 OctoPrint를 사용할 수 있게 됩니다. 초기 설정에서 신경쓸 부분은 프린터에 맞는 출력크기 정도입니다. 제가 사용중인 Ender 5는 220 * 220 * 300mm 로 설정하였습니다.

좌측 사이드바에는 연결/상태/파일 등의 표시 및 제어가 가능합니다.
우측에는 기본적으로 5개의 탭이 존재하며 플러그인 추가시 三을 눌러 추가된 탭을 확인할 수 있습니다.

라즈베리파이와 3D 프린터는 Mini USB 케이블로 연결후, OctoPrint에서 Connection을 누르면 연결되어 상태확인 및 제어가 가능해 집니다. 3D 프린터가 Off 된 상태에서도 라즈베리파이에 연결된 USB 케이블을 통해 5V가 인입되어 LCD/BLTouch가 켜진 상태가 됩니다. 이때문에 케이블의 전원쪽 커넥터에는 캡톤 테이프로 막아두었습니다.

케이스

OctoPrint를 사용하기 위해 라즈베리파이 3B+를 사용하였고, 전원제어를 위한 릴레이는 2채널을 사용하였습니다. 릴레이 케이스는 싱기버스에서 다운로드하여 적용하였고, 라즈베리파이 케이스는 기존에 보유하고 있는 것을 활용하였습니다.

웹캠 연결

WebCam을 라즈베리파이에 연결하면, 출력되고 있는 상태를 PC/Mobile을 통해 관찰할 수 있고, Timelapse 영상도 만들 수 있게 됩니다.
라즈베리파이용 카메라도 적당하지만, 저는 로지텍의 C270 을 선택하였습니다.
포커스가 잘 맞지 않아서, 포커스를 수동으로 조작할 수 있는 링을 추가하였고, 적당한 각도로 촬영하기 위해 마운트암을 출력해서 부착하였습니다.

챔버의 좌측 전면에 웹캠을 연결하였습니다.

공유기 설정

OctoPrint에서는 권장하지 않지만, 외부접속을 허용하면 외부에서 접근하여 3D 프린터의 전원제어, 출력제어, 영상모니터링 등이 가능합니다.
이를 위해 인터넷공유기에서 DDNS, 고정IP, 포트포워딩 설정을 진행하였습니다.

  • DDNS : Dynamic DNS로 유동 IP여도 도메인명을 통해 외부접근이 가능합니다.
  • 포트포워딩 : 특정포트를 특정장비의 특정포트로 포워딩(전달)합니다. OctoPrint의 경우 Web Interface이기 때문에 80 포트를 사용하는데, 저는 해당 포트가 다른 서비스에 사용중이기 때문에 포트포워딩이 필요했습니다. 주의할 점은 대략 50000번 포트 이후 값을 사용해야 정상적으로 처리가 되었습니다.
  • 고정IP : 포트포워딩을 처리할 장비를 선택하기 위해 라즈베리파이에는 IP를 고정하였습니다.
DDNS를 통해 도메인명을 통해 라즈베리파이에 설치된 OctoPrint에 접근이 가능해집니다.
포트포워딩을 설정하기 위해 OctoPrint가 설치된 라즈베리파이는 고정 IP를 할당하였습니다.
예를 들어, 50000번 외부 포트에서 요청된 트래픽은 OctoPrint가 설치된 라즈베리파이의 80 포트로 전달됩니다.

OctoApp

OctoPrint를 원격으로 제어할 수 있는 다양한 스마트폰 앱들이 존재합니다. 저는 OctoApp을 스마트폰에 설치하여 사용하고 있습니다.

Cura 연동

3D프린트를 위해서는 슬라이서를 통해 GCode를 생성해야 하는데, 저는 주로 Cura를 사용하고 있습니다. Cura에 플러그인을 설치하면 모니터 탭에서 OctoPrint를 사용할 수 있습니다.

플러그인 – PSU Control

OctoPrint에는 플러그인을 통해 다양한 기능을 확장할 수 있습니다. 그 중에서 Power Supply Unit 을 처리하는 PSU Control 플러그인을 사용하면 3D 프린터의 전원제어가 가능합니다. 전원제어를 위한 릴레이 모듈은 1채널만 필요하지만, 혹시 추가로 필요한 일이 생길까봐 2채널을 구매하였습니다.

참고로 제가 구매한 릴레이에는 점퍼가 2개 있는데, 점퍼를 High 쪽으로 연결해야 라즈베리파이에서 정상 동작하였습니다.

S1, S2 점퍼를 High 방향으로 연결해야 라즈베리파이에서 정상적으로 제어가 되었습니다.

라즈베리파이 GPIO의 5V, GND, GPIO15(10pin)를 릴레이의 DC+, DC-, IN1 에 연결하였습니다. 3D 프린터에서 사용하던 전원 케이블의 피복을 벗겨서, 파란선을 릴레이의 COM1, NC1에 연결하였습니다. NC는 Normal Close로 평상시 연결된다는 의미입니다.

사진상으로는 3D프린터를 위한 전원선만 연결되어 있지만, 현재는 2번째 릴레이에 LED 제어를 위한 배선을 연결된 상태입니다.
3D 프린터 전원선을 릴레이에 연결하였습니다.

플러그인 설정은 다음과 같이 수행하였습니다. 릴레이모듈과 연결한 라즈베리파이 GPIO15는 보드 10번 핀입니다.

상단의 번개 표시를 누르면 3D 프린터의 전원을 On/Off 할 수 있습니다.

플러그인 – Octolapse

플러그인 – Tab Order

  • 플러그인들을 설정하다 보니 탭이 추가되어 영역이 모자라게 되어 설치하였습니다.
  • 탭 타이틀을 줄이고, 아이콘을 배치하고, 불필요한 탭은 숨김 처리하였습니다.

플러그인 – Enclosure Plugin

  • 챔버에 연결된 LED를 제어하고, 웹캠을 On/Off 제어하기 위해 사용중입니다. Outputs 설정에 3가지 항목을 추가하였습니다.
  • LED의 전원과 릴레이를 연결하고, 릴레이와 라즈베리파이는 PIN16 (GPIO23)에 연결하였습니다. 필요할때만 LED를 Off할 목적이였기 때문에, 옥토프린트 시작시 자동으로 On 되도록 설정하였습니다.
하얀선이 LED 제어용
LED
   - Output Type : Regular IO
   - Label : LED
   - IO Number : 16
   - Start with server : V
   - Auto Startup : V
   - Active Low : V
   - Show Button on Navbar : V

Webcam ON
   - Output Type : Shell Script
   - Lebel : Webcam ON
   - Script : sudo service webcamd start
   - Show Button on Navbar : V

Webcam OFF
   - Output Type : Shell Script
   - Lebel : Webcam OFF
   - Script : sudo service webcamd stop
   - Show Button on Navbar : V

플러그인 – 기타

DisplayLayerProgress Plugin

  • 현재 출력상태를 네비게이션바에 표시합니다.
  • Navigationbar 설정은 다음과 같이 수정하였습니다.
Progress:[progress]%   
Layer:[current_layer]/[total_layers]   
Left:[printtime_left] ([estimated_end_time])

Fullscreen Plugin

  • Control 탭에서 웹캠 영상을 더블클릭하면 전체화면으로 볼 수 있습니다.

InlineConfirm

  • 취소버튼을 2번 눌러서 취소를 confirm(확인)합니다.

Preheat Button

  • 노즐과 배드의 온도를 미리 높일 수 있는 버튼이 추가됩니다.
  • PLA의 경우 배드와 핫엔드가 큰 차이 없이 목표 온도에 도달하므로 유용합니다.

PrettyGCode

  • 3D로 출력중인 GCode를 확인할 수 있습니다.

Printer Stats

  • 프린터와 전력사용에 대한 통계를 제공합니다.

Simple Filament Change Buttons

  • 필라멘트 교체 버튼을 추가합니다.

Dashboard

  • 대시보드 탭을 추가하여 모니터링을 수행할 수 있습니다.

Themeify

  • 어두운 계열의 테마로 변경하기 위해 설치하였습니다.
Dashboard와 Themeify 조합

플러그인 참고사항

설정한 플러그인들은 다음 내용들을 참고하였습니다.

2021-02-28 추가사항

라즈베리파이4 교체

가끔 웹캠 영상을 볼때 느려지는 현상이 보여서, 관련 증상을 찾다 보니 라즈베리파이 3B 사용시 병목현상이 있다는 글이 있었습니다.

혹시 모를 불상사를 대비하기 위해 라즈베리파이4 4GB를 구매하여 설치하였습니다. 옥토프린터는 상시 켜두고 있기 때문에, 팬을 사용하지 않는 쿨러케이스를 구매하였고, 안정적인 전원 관리를 위해 5V4A 아답터를 사용하였습니다.

옥토프린트에는 backup과 restore 기능이 제공되기 때문에, 기존 옥토프린트의 설정을 PC로 backup 후 microSD에 옥토프린트 이미지를 write 하였습니다. 최초 옥토 프린트 실행 후 최신버전으로 update 하고, 백업한 파일을 restore하니 플러그인 설치 부터 설정들까지 그대로 복원되었습니다.

웹캠

챔버 내에 웹캠을 설치하였더니, 화각도 좋지 않고 각도 조절도 불편하여 자석 자바라와 광각렌즈를 구매하여 설치하였습니다.
챔버 상단에 LED 조명이 렌즈에 비치는 현상이 있어서 렌즈 후드를 출력하여 적용하였습니다.

5000원
C270의 포커스링과 커버를 1.5mm 얇게 수정하고, 광각렌즈를 착탈할 수 있도록 개조하였습니다.
동일한 위치에서 광각렌즈를 장착하여 촬영해 보았습니다.

C270 웹캠 설정

웹캠의 기본 설정은 640×480 해상도와 10fps 프레임레이트 입니다.
C270의 경우 다음과 같은 설정으로 변경이 가능합니다.
저는 1280×720 으로 변경하였습니다.

$ sudo vi /boot/octopi.txt

HD 16:9 --> camera_usb_options="-r 1280x720 -f 30"
HD 4:3 ---> camera_usb_options="-r 1280x960 -f 30"
VGA 4:3 --> camera_usb_options="-r VGA -f 10"

Babystep 제어

첫 레이어의 안정적인 안착을 위해 베이비스텝 제어 버튼을 추가하였습니다.

$ sudo vi ~/.octoprint/config.yaml

controls:
- children:
  - children:
    - command: M851
      confirm: null
      name: Get
    - command: M500
      confirm: null
      name: Save
    layout: horizontal
  - default: 'Current Z Offset: ???'
    regex: 'Probe Offset X([-+]?[0-9.-]+) Y([-+]?[0-9.-]+) Z([-+]?[0-9.-]+)'
    template: 'Current Z Offset: {2}mm'
  - children:
    - command: M290 Z0.01
      confirm: null
      name: Babystep Up (+0.01)
    - command: M290 Z-0.01
      confirm: null
      name: Babystep Down (-0.01)
    layout: horizontal
  layout: vertical
  name: Live-Z Probe Offset

2021-03-03 추가사항 : Monitor

아두이노를 사용하여 OctoPrint와 연동하여 모니터링할 수 있도록 3D Printer Monitor를 제작하였습니다.

2021-03-14 Relay 추가

챔버에 달려있는 Fan을 특정 온도에 따라 제어하기 위해 Relay Switch를 추가하였습니다.

2021-03-24 DHT22 온습도계

PLA 필라멘트가 습도에 취약하고, 챔버 내부의 온도도 품질에 영향을 주기 때문에 온습도를 체크하기 위해 온습도계를 라즈베리파이에 연결해 보았습니다.
기존에 DHT21 센서와 Adafruit_Python_DHT 조합으로 사용중 가끔 온도 습도를 정상 측정하지 못하는 경우가 발생하였습니다.
좀 더 안정적인 시스템 구동을 위해 DHT22 센서로 교체하고, 라이브러리도 새로운것으로 교체하였습니다.

pip3 설치

$ sudo apt-get update
$ sudo apt-get install python3-pip

온습도계 라이브러리 설치

$ sudo pip3 install adafruit-circuitpython-dht
$ sudo apt-get install libgpiod2

인클로저 플러그인 – 온습도 측정 파일 수정

$ cd /home/pi/oprint/lib/python3.7/site-packages/octoprint_enclosure/
$ mv getDHTTemp.py getDHTTemp.py.org
$ vi getDHTTemp.py
import sys
import board
import adafruit_dht

if len(sys.argv) == 3:
    if sys.argv[1] == '22' and sys.argv[2] == '4':
        dhtDevice = adafruit_dht.DHT22(board.D4)
    elif sys.argv[1] == '11' and sys.argv[2] == '4':
        dhtDevice = adafruit_dht.DHT11(board.D4)
    else:
        sys.exit(1)
else:
    sys.exit(1)

try:
    print('{0:0.1f} | {1:0.1f}'.format(dhtDevice.temperature, dhtDevice.humidity))
except Exception as error:
    print('-1 | -1')

sys.exit(1)

온습도 측정 테스트

$ python3 /home/pi/oprint/lib/python3.7/site-packages/octoprint_enclosure/getDHTTemp.py 22 4

실행 명령을 파이썬3로 변경

$ vi /home/pi/oprint/lib/python3.7/site-packages/octoprint_enclosure/__init__.py 
cmd = sudo_str + "python3 " + script + str(sensor) + " " + str(pin)

플러그인 설정

Enclosure Plugin 에서 Input으로 온도센서를 설정하면 됩니다.

상단바에 온도 표시 추가

$ vi /home/pi/oprint/lib/python3.7/site-packages/octoprint/static/js/lib/less.min.js

;
var temp_install = setInterval(function() {
    if ($('#navbar_plugin_enclosure_2').length) {
        clearInterval(temp_install);
        $('#navbar_plugin_enclosure_2>a').prepend('<span id="temp_display"></span><span>°C&nbsp;</span>');
        var temp_timer = setInterval(function() {
            $('#temp_display').html($('#navbar').find('span[data-bind="text: temp_sensor_temp, attr: {title: temp_sensor_temp}"]').html());
        }, 3000);
    }
}, 3000);

Notice

  • 이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용할 수 있습니다. 크리에이티브 커먼즈 라이선스
  • 저작권과 관련된 파일요청 및 작업요청을 받지 않습니다.
  • 댓글에 대한 답변은 늦을 수도 있습니다.
  • Retroarch 등의 게임 설정에 대한 질문들은 답변이 힘들 수 있습니다.
  • 1 댓글

    1. 핑백: 자동 팬 조절 - Kimstar 3.0

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다