見出し画像

Orange Pi Zero2にMainsail・Klipperのインストール

※この記事は、2022.3.25時点のものとなります。
 既にKlipperがかなり変化しており、この記事の記載のままでは動作しませんのでご了承願います。2023.2.6時点で、より簡単にセットアップできる記事を公開しましたので、そちらをご参照いただければと思います。

あまりにもRaspberryPiが手に入らなかったので、Orange Piなるのものに手を出してしまいました。
Orange Piシリーズは、基本的にRaspberryPi3B+と同じような64ビットARMプロセッサを搭載したシングルボードコンピュータです。
今回、コンパクトでそれなりに高性能な、Orange Pi Zero2を入手し、これに3D PrinterのコントローラーであるMainSailやKlipper などをインストールしましたので、参考までにメモを残しておきます。
Linuxは素人なので、おかしい等のツッコミは優しくご指摘いただければ、修正していきたいと思いますのでよろしくお願いします。

■入手

Orange Pi Zero2の入手は、AliExpressで注文しました。入手までは、約2週間かかりましたが、約3,000円程度で購入できました。

■OSインストール

今回は、GUI不要で扱いやすそうな、Ubuntu serverを選択しました。
ここからOSイメージを入手できます。

上のメニューから"Resources"→"Downloads"で一覧が出てくるので”Orange Pi Zero2"の”Ubuntu Image”を選択し、Google Driveを選択し下記イメージをダウンロードしました。
Orangepizero2_2.1.6_ubuntu_focal_server_linux4.9.170.7z
7zipで圧縮されていたので、解凍しOSイメージを取り出します。
先ほどのダウンロードサイトにUser Manualや、Office Toolsなどもあるので必要に応じてダウンロードして目を通しておくと良いでしょう。
(Office Toolsには、SDカードフォーマッターやBalena-Etcherなど入っているので、既にインストールされていたり日本語版が良いという人はダウンロード不要です)
balenaEtcherでSDカードへ書き込みを実施します。

■OSセットアップ

Orange Pi Zero2にSDカード、HDMIディスプレイ、キーボード、電源(USB-C)、LANなど繋いで起動します。GUIは使わないのでマウスは不要です。
ログインは、Userとして、デフォルトでrootと、orangepiユーザが登録されていました。パスワードは、どちらも"orangepi"です。
基本orangepiユーザで作業します。

■■wifiの設定

日本では技適がないので使用できませんが、もしwifi設定する場合は下記コマンドで設定できます。

nmtui

■■タイムゾーンの設定

sudo timedatectl set-timezone Asia/Tokyo

■■アップデート

sudo apt update
sudo apt upgrade

■mainsailのセットアップ

基本的には、下記サイトのマニュアルセットアップ手順通り進めます。
※なお設定ファイルでいじっているのは、ユーザ名と、それに付随するホームディレクトリパスだけです。

sudo apt update --allow-releaseinfo-change && sudo apt upgrade
sudo apt install git dfu-util unzip

■■Klipperのインストール

sudo apt install virtualenv python-dev libffi-dev build-essential libncurses-dev libusb-dev avrdude gcc-avr binutils-avr avr-libc stm32flash dfu-util libnewlib-arm-none-eabi gcc-arm-none-eabi binutils-arm-none-eabi

sudo apt-get install libusb-1.0

git clone https://github.com/KevinOConnor/klipper

virtualenv -p python2 ./klippy-env
./klippy-env/bin/pip install -r ./klipper/scripts/klippy-requirements.txt

sudo nano /etc/systemd/system/klipper.service
-----以下記載内容-----
#Systemd Klipper Service

[Unit]
Description=Starts Klipper and provides klippy Unix Domain Socket API
Documentation=https://www.klipper3d.org/
After=network.target
Before=moonraker.service
Wants=udev.target

[Install]
Alias=klippy
WantedBy=multi-user.target

[Service]
Environment=KLIPPER_CONFIG=/home/orangepi/klipper_config/printer.cfg
Environment=KLIPPER_LOG=/home/orangepi/klipper_logs/klippy.log
Environment=KLIPPER_SOCKET=/tmp/klippy_uds
Type=simple
User=orangepi
RemainAfterExit=yes
ExecStart= /home/orangepi/klippy-env/bin/python /home/orangepi/klipper/klippy/klippy.py ${KLIPPER_CONFIG} -l ${KLIPPER_LOG} -a ${KLIPPER_SOCKET}
Restart=always
RestartSec=10
------以上記載内容-----
sudo systemctl enable klipper.service
mkdir ~/klipper_config
mkdir ~/klipper_logs
mkdir ~/gcode_files
touch ~/klipper_config/printer.cfg

sudo shutdown -r now

sudo systemctl start klipper

■■moonrakerのインストール

sudo apt install python3-virtualenv python3-dev libopenjp2-7 python3-libgpiod curl libcurl4-openssl-dev libssl-dev liblmdb-dev libsodium-dev zlib1g-dev libjpeg-dev

git clone https://github.com/Arksine/moonraker.git

virtualenv -p python3 ./moonraker-env
./moonraker-env/bin/pip install -r ./moonraker/scripts/moonraker-requirements.txt

nano ~/klipper_config/moonraker.conf
-----以下記載内容-----
[server]
host: 0.0.0.0
port: 7125
enable_debug_logging: False

[file_manager]
config_path: ~/klipper_config
log_path: ~/klipper_logs

[authorization]
cors_domains:
    https://my.mainsail.xyz
    http://my.mainsail.xyz
    http://*.local
    http://*.lan
trusted_clients:
    10.0.0.0/8
    127.0.0.0/8
    169.254.0.0/16
    172.16.0.0/12
    192.168.0.0/16
    FE80::/10
    ::1/128

# enables partial support of Octoprint API
[octoprint_compat]

# enables moonraker to track and store print history.
[history]

# this enables moonraker's update manager
[update_manager]

[update_manager mainsail]
type: web
repo: mainsail-crew/mainsail
path: ~/mainsail
------以上記載内容-----


sudo nano /etc/systemd/system/moonraker.service
-----以下記載内容-----
#Systemd moonraker Service

[Unit]
Description=Moonraker provides Web API for klipper
Documentation=https://moonraker.readthedocs.io/en/latest/
After=network.target klipper.service

[Install]
WantedBy=multi-user.target

[Service]
Environment=MOONRAKER_CONFIG=/home/orangepi/klipper_config/moonraker.conf
Environment=MOONRAKER_LOG=/home/orangepi/klipper_logs/moonraker.log
Type=simple
User=orangepi
RemainAfterExit=yes
ExecStart=/home/orangepi/moonraker-env/bin/python /home/orangepi/moonraker/moonraker/moonraker.py -c ${MOONRAKER_CONFIG} -l ${MOONRAKER_LOG}
Restart=always
RestartSec=10
------以上記載内容-----

sudo systemctl enable moonraker.service
sudo systemctl start moonraker

■■mainsail(nginx)のインストール

sudo apt install nginx

sudo touch /etc/nginx/sites-available/mainsail
sudo touch /etc/nginx/conf.d/upstreams.conf
sudo touch /etc/nginx/conf.d/common_vars.conf

sudo nano /etc/nginx/conf.d/upstreams.conf
-----以下記載内容-----
# /etc/nginx/conf.d/upstreams.conf

upstream apiserver {
    ip_hash;
    server 127.0.0.1:7125;
}

upstream mjpgstreamer1 {
    ip_hash;
    server 127.0.0.1:8080;
}

upstream mjpgstreamer2 {
    ip_hash;
    server 127.0.0.1:8081;
}

upstream mjpgstreamer3 {
    ip_hash;
    server 127.0.0.1:8082;
}

upstream mjpgstreamer4 {
    ip_hash;
    server 127.0.0.1:8083;
}
------以上記載内容-----

sudo nano /etc/nginx/conf.d/common_vars.conf
-----以下記載内容-----
# /etc/nginx/conf.d/common_vars.conf

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
------以上記載内容-----

sudo nano /etc/nginx/sites-available/mainsail
-----以下記載内容-----
# /etc/nginx/sites-available/mainsail

server {
    listen 80 default_server;

    access_log /var/log/nginx/mainsail-access.log;
    error_log /var/log/nginx/mainsail-error.log;

    # disable this section on smaller hardware like a pi zero
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_proxied expired no-cache no-store private auth;
    gzip_comp_level 4;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css text/xml text/javascript application/javascript application/x-javascript application/json application/xml;

    # web_path from mainsail static files
    root /home/orangepi/mainsail;

    index index.html;
    server_name _;

    # disable max upload size checks
    client_max_body_size 0;

    # disable proxy request buffering
    proxy_request_buffering off;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location = /index.html {
        add_header Cache-Control "no-store, no-cache, must-revalidate";
    }

    location /websocket {
        proxy_pass http://apiserver/websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 86400;
    }

    location ~ ^/(printer|api|access|machine|server)/ {
        proxy_pass http://apiserver$request_uri;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Scheme $scheme;
    }
    location /webcam/ {
        proxy_pass http://mjpgstreamer1/;
    }

    location /webcam2/ {
        proxy_pass http://mjpgstreamer2/;
    }

    location /webcam3/ {
        proxy_pass http://mjpgstreamer3/;
    }

    location /webcam4/ {
        proxy_pass http://mjpgstreamer4/;
    }
}
------以上記載内容-----

mkdir ~/mainsail
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/mainsail /etc/nginx/sites-enabled/
sudo systemctl restart nginx
cd ~/mainsail
wget -q -O mainsail.zip https://github.com/mainsail-crew/mainsail/releases/latest/download/mainsail.zip && unzip mainsail.zip && rm mainsail.zip

ここまでで、ブラウザで動作確認( http://<printer-ip>/)でMainsailの画面が確認出来ると思います。

■■Important macros

mainsail.cfgを下記記載で作成してください(マクロ部分は適時変更をお願いします。あまり試せていません)
作成にあたっては、mainsailのGUI(MACHINE)からでも良いですし、
/home/orangepi/klipper_config/へ直接ファイルを作成しても良いと思います。
※自分の設定が悪いのか[virtual_sdcard]についてサイトに記載のある
path: ~/gcode_files
ではうまくファイラーが動作してくれなかったので、絶対パスで記載しています。

[virtual_sdcard]
path:  /home/orangepi/gcode_files

[pause_resume]

[display_status]

[gcode_macro CANCEL_PRINT]
description: Cancel the actual running print
rename_existing: CANCEL_PRINT_BASE
gcode:
    TURN_OFF_HEATERS
    CANCEL_PRINT_BASE

[gcode_macro PAUSE]
description: Pause the actual running print
rename_existing: PAUSE_BASE
# change this if you need more or less extrusion
variable_extrude: 1.0
gcode:
    ##### read E from pause macro #####
    {% set E = printer["gcode_macro PAUSE"].extrude|float %}
    ##### set park positon for x and y #####
    # default is your max posion from your printer.cfg
    {% set x_park = printer.toolhead.axis_maximum.x|float - 5.0 %}
    {% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %}
    ##### calculate save lift position #####
    {% set max_z = printer.toolhead.axis_maximum.z|float %}
    {% set act_z = printer.toolhead.position.z|float %}
    {% if act_z < (max_z - 2.0) %}
        {% set z_safe = 2.0 %}
    {% else %}
        {% set z_safe = max_z - act_z %}
    {% endif %}
    ##### end of definitions #####
    PAUSE_BASE
    G91
    {% if printer.extruder.can_extrude|lower == 'true' %}
      G1 E-{E} F2100
    {% else %}
      {action_respond_info("Extruder not hot enough")}
    {% endif %}
    {% if "xyz" in printer.toolhead.homed_axes %}
      G1 Z{z_safe} F900
      G90
      G1 X{x_park} Y{y_park} F6000
    {% else %}
      {action_respond_info("Printer not homed")}
    {% endif %} 
    
[gcode_macro RESUME]
description: Resume the actual running print
rename_existing: RESUME_BASE
gcode:
    ##### read E from pause macro #####
    {% set E = printer["gcode_macro PAUSE"].extrude|float %}
    #### get VELOCITY parameter if specified ####
    {% if 'VELOCITY' in params|upper %}
      {% set get_params = ('VELOCITY=' + params.VELOCITY)  %}
    {%else %}
      {% set get_params = "" %}
    {% endif %}
    ##### end of definitions #####
    {% if printer.extruder.can_extrude|lower == 'true' %}
      G91
      G1 E{E} F2100
    {% else %}
      {action_respond_info("Extruder not hot enough")}
    {% endif %}  
    RESUME_BASE {get_params}

補足ですが、mac等でホスト名.localで名前引きしたい人は下記コマンドを打っておくと便利です。

sudo apt install avahi-daemon
sudo systemctl start      avahi-daemon
sudo systemctl enable     avahi-daemon

■最後に

以上で、最低限mainsailが立ち上がるところまで出来ると思います。
意外と長い工程でlinux初心者にはなかなかハードルが高かったですが、3000円程度のボードで普通に使えるのは良い選択だと感じました。

なお、ここでは説明を省きましたが、Klipperのセットアップや、mcuへのコードのフラッシュは別途必要です。

ここから先は

0字

¥ 100

よろしければ、サポートお願いします。今後の活動費に使わせていただきたいと思います!