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へのコードのフラッシュは別途必要です。
ここから先は
¥ 100
よろしければ、サポートお願いします。今後の活動費に使わせていただきたいと思います!