Skip to content

Instantly share code, notes, and snippets.

@t-nissie
Last active June 24, 2023 19:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save t-nissie/9256acaf29cc901fa1504d7ace79a2e3 to your computer and use it in GitHub Desktop.
Save t-nissie/9256acaf29cc901fa1504d7ace79a2e3 to your computer and use it in GitHub Desktop.
FUJITSU ARROWS Tab Q508/SEにUbuntu 22.04 LTS 日本語 RemixをインストールしてAnet ET4+をKlipperで制御

FUJITSU ARROWS Tab Q508/SEにUbuntu 22.04 LTS 日本語 RemixをインストールしてAnet ET4+をKlipperで制御

Atom x7-Z8700 1.6GHz/RAM:4GB/SSD:128GB/10.1インチなタブレットPC FUJITSU ARROWS Tab Q508/SE に Ubuntu 22.04 LTS 日本語 Remix という GNU/Linux をインストールして Klipper, Moonraker, Mainsailをインストールして 3DプリンターAnet ET4+を制御した記録。 2023年6月に書いている。 完全無保証書きかけ

必要なモノ

他にUSBメモリスティックにisoイメージを書き込むためにLinuxかMacが必要。

  • USBメモリスティック
  • Ubuntu iso image ubuntu-ja-22.04-desktop-amd64.iso
  • FUJITSU ARROWS Tab Q508/SE
  • 3Dプリンター
  • USBケーブル
  • ST-LINK v2
  • FMV-NDS35クレードルがあるとインストールやその後の設定のときに有線LAN, 外部ディスプレイ, USBマウス, USBキーボードを接続できて便利。
  • クレードルから繋げられる外部ディスプレイは最大1920x1200か。
  • ただしタブレットをクレードルに乗せたとき、本体側面のUSB Aコネクタおよびクレードルの3つのUSB AコネクタともET4+とのUSB接続が切れがち。
  • ET4+を制御する時にはタブレット本体にACアダプターから直接電気を供給し、側面のUSB AコネクタとET4+を直接USBケーブルで接続すること。
  • Appendix 1を見よ。

タブレットPC Q508 諸元

小学校などに配布されていた文教用タブレットPC。 参考→ https://jp.fujitsu.com/platform/pc/product/arrowstab/1801/q508se/

  • 型式: ARROWS Tab Q508/SE
  • メモリ: 4GB
  • SSD: 128 GB
  • 無線LAN: IEEE 802.11a/b/g/n/ac準拠(5GHz帯チャンネル:W52/W53/W56)
  • Bluetooth
  • USB3.0×1、USB3.1(Type-C)×1
  • カメラ×2 イン、アウト(いまのところLinuxから使うことはできない)

FFF方式3DプリンターAnet ET4+ 諸元

"ET4+" は "アップグレード版ET4" の習慣的な呼称。 本体側面のプレートには "ET4" と書かれている。 "ET4+" は "初代ET4" のノズル横に金属探知式レベリングセンサが加わったもの。 参考→ https://anet3d.com/blogs/et-series/firmware-upgrade

  • 門型: 20x20, 40x20 アルミフレーム
  • 造形範囲体積: 220mm×220mm×250mm
  • 積層厚: 0.1-0.3mm
  • フィラメント径: 1.75mm
  • 標準ノズル径: 0.4mm
  • 最大ベッド温度: 100°C
  • 最大ノズル温度: 250°C
  • オールメタルフレーム
  • ベッド: アルミ+強化ガラス

Ubuntuインストールの手順

「BIOSの『変更を保存して終了』した直後にのみUSBメモリから起動がされる」がキモ。

  • LinuxだかmacOSだかで sudo dd if=ubuntu-ja-22.04-desktop-amd64.iso of=/dev/sdX などと3.2 GBほどのisoイメージを書き込んだUSBメモリスティックを用意。
  • そのUSBメモリをタブレットに挿して音量のマイナスボタンを押しながら電源オン。
  • BIOSの『セキュリティメニュー』で「セキュアブート機能」が「使用しない」設定になっていることを確認。
  • BIOSの『起動メニュー』挿入してあるUSB HDDから起動されるように優先順位を変更。
  • BIOSの『変更を保存して終了する』。この『変更を保存して終了』した直後にのみUSBメモリから起動がされるようである。
  • ユーザ名はtakeshiなどなんでもよい。piにしておくとデフォルト値が使えることが多い。
  • あとは普通にUbuntuをインストール。
  • タッチパネルははじめから使えるようになる。
  • スクリーンキーボードはメニューバーの人間アイコンをクリックすると現れるメニューでON/OFFできる。
  • WiFiは使える。
  • Bluetoothは接続が切れがちという報告があるが未確認。
  • インアウトともカメラは今のところLinuxからは使えない。

さらに

sudo apt remove brltty
sudo apt update
sudo apt upgrade
sudo apt install openssh-server

として再起動した後、YouTubeなどの再生音が出るようになった。

brlttyパッケージを削除するのはAnet ET4+をUSBケーブルでQ508に接続した時に ch341-uartのシリアル通信を使えるようにするため。 参考 → https://stackoverflow.com/questions/70123431/why-would-ch341-uart-is-disconnected-from-ttyusb

さらにのちのちのためsshでログインできるようにしておいた。

IPアドレスの固定

WiFiのアクセスポイントのWebページの詳細設定からDHCP固定割り当て設定で Q508のMACアドレスに対して固定のIPアドレスが割り当てられるようにする。 例えば 192.168.10.111 。

UbuntuでマシンのMACアドレスを表示するコマンドは

ip a

KIAUHを使ってKlipperとMainsailをインストール

KIAUH (Klipper Installation And Update Helper) https://github.com/th33xitus/kiauh を使って Klipper https://github.com/Klipper3d/klipper Moonraker https://github.com/Arksine/moonraker Mainsail https://github.com/mainsail-crew/mainsail をQ508にインストール。

参考 → Klipper用にタブレットPCの中古をぽちった その3 https://note.com/boyon/n/n4e592b4d242b

sudo apt-get install git
git clone https://github.com/th33xitus/kiauh.git
./kiauh/kiauh.sh

あとはメニューにしたがってインストールしてゆく。 たぶんクロスコンパイラなどもインストールしてくれる。 インストール後、先に固定したIPアドレスにアクセスすると Mainsailの画面になるが、プリンタに接続できない旨のエラーになっている。

Klipperのmicro-controllerをビルドして3DプリンターAnet ET4+にフラッシュ

micor-controllerをビルドしてET4+に書き込む。

参考 → https://www.klipper3d.org/Installation.html

参考 → HowTo Setup and Flash Klipper on Anet ET4/Pro/X https://3dprint.wiki/reprap/anet/et4/setup-and-flash-klipper CONFIG_SERIAL_BAUD 誤: 112500 正: 115200

参考 → Klipper用にタブレットPCの中古をぽちった その4 https://note.com/boyon/n/n4e592b4d242b

cd klipper
make menuconfig     # .config ができる dot.config としてGistにおいてある。
make

できあがったklipper.binをST-LINK v2でET4+に書き込む。 液晶画面は真っ白になってしまう。

注意!再度ET4+にfirmwareを書き込むことができなくなってしまった。 再書き込みにはどこかのピンのショートによるリセットが必要か? 今のところ動いているからよいけど。

なお、ET4+にインストールした OpenBLT https://github.com/davidtgbe/openblt で読み込めるfirmwareを作ることはできなかった。

printer.cfgの設定

現状のprinter.cfgをGistに置いてある。 /home/takeshi/printer_data/config/printer.cfg に置く。固有の設定は [virtual_sdcard] path: /home/takeshi/printer_data/gcodes と [mcu] baud: 115200 serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 のあたりか。

フィラメントの流量を [extruder] gear_ratio: 70:100 で調節する必要があった。

Auto bed leveling

設定

3DプリンターAnet ET4+はレベルセンサ付。Klipper/Moonraker/Mainsailでprinter.cfcに

[bed_mesh]
speed: 120
horizontal_move_z: 5
mesh_min: 30, 20
mesh_max: 225, 215
probe_count: 5, 5

として、コンソールからBED_MESH_CALIBRATESAVE_CONFIG。 実際はprinter.cfgの最後に追加される。

MainsailでBed MeshのHEIGHTMAPの表示

Mainsailの左上のメニューからHEIGHTMAPを選んで "CALIBRATE" をクリック。 BED_MESH_CALIBRATEと同様にベッドの25点を計測、その後HEIGHTMAPが表示される。 高さ調節とCALIBRATEを繰り返して、HEIGHTMAPに満足がいったら 最上部の "SAVE CONFIG"(またはフロッピーディスクのアイコン💾)をクリック。

[Appendix 1] "Lost communication with MCU"というエラーになる場合

KlipperのFAQ https://www.klipper3d.org/FAQ.html#i-keep-getting-random-lost-communication-with-mcu-errors にあるとおり、3DプリンターとタブレットやPCをUSBケーブルで繋いだ場合、通信接続が切れがちになることがある。 Anet ET4+の場合、印刷開始時のホットエンドのヒーターのON電流により電源が不安定化してUSB接続が切れてしまうことがある。 (印刷開始時のホットエンドのヒーターを Pulse Width Modulation (PWM) 制御で少しずつONにすれば防げるかもしれない。)

Q508タブレットはそれをクレードルに乗せたとき、本体側面のUSB Aコネクタおよびクレードルの3つのUSB AコネクタともET4+とのUSB接続が切れがちになる。 ET4+を制御する時にはタブレット本体にACアダプターから直接電気を供給し、側面のUSB AコネクタとET4+を直接USBケーブルで接続すること。

接続が切れた時のエラーは

sudo dmesg -e

で見ることができる。Linux kernelのバージョンや状況によって

device descriptor read/64, error -110
device not accepting address 7, error -110

とか

ch341-uart ttyUSB0: usb_serial_generic_read_bulk_callback - urb stopped: -32
usb 1-4-port1: disabled by hub (EMI?), re-enabling...
usb 1-4.1: USB disconnect, device number 6
ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
ch341 1-4.1:1.0: device disconnected

とか

USB port nn disabled by hub (EMI?), re-enabling

などのエラーが記録されている。

[Appendix 2] リアルタイムカーネルは必要か?

Ubuntuインストール後の設定そのままでプリンタのコントロールは間に合っていそうなので、 リアルタイムカーネルは必要なさそう。

Debianなら

sudo apt install linux-image-rt-amd64

Ubuntuなら

sudo apt install linux-lowlatency

でリアルタイムカーネルをインストールできるらしい。 Klipperの対応状況 → Klipper3d/klipper#485

[Appendix 3] Rufus or UUI

Linuxインストールのとき、Rufusで作った起動用USBメモリではうまくブートしなかった。

UUIで作った起動用USBメモリでは起動直後に

Can not mount /dev/loop0 on /cow

のエラーが出て止まる。[Enter]を押してinitramfsのプロンプトを出して、

losetup
losetup -f
losetup -d /dev/loop0
exit

でUbuntuの起動が続行可能だった気がする。

参考 → https://forums.linuxmint.com/viewtopic.php?t=260100

CONFIG_LOW_LEVEL_OPTIONS=y
# CONFIG_MACH_AVR is not set
# CONFIG_MACH_ATSAM is not set
# CONFIG_MACH_ATSAMD is not set
# CONFIG_MACH_LPC176X is not set
CONFIG_MACH_STM32=y
# CONFIG_MACH_HC32F460 is not set
# CONFIG_MACH_RP2040 is not set
# CONFIG_MACH_PRU is not set
# CONFIG_MACH_AR100 is not set
# CONFIG_MACH_LINUX is not set
# CONFIG_MACH_SIMU is not set
CONFIG_BOARD_DIRECTORY="stm32"
CONFIG_MCU="stm32f407xx"
CONFIG_CLOCK_FREQ=168000000
CONFIG_SERIAL=y
CONFIG_FLASH_SIZE=0x80000
CONFIG_FLASH_BOOT_ADDRESS=0x8000000
CONFIG_RAM_START=0x20000000
CONFIG_RAM_SIZE=0x20000
CONFIG_STACK_SIZE=512
CONFIG_FLASH_APPLICATION_ADDRESS=0x8000000
CONFIG_STM32_SELECT=y
# CONFIG_MACH_STM32F103 is not set
# CONFIG_MACH_STM32F207 is not set
# CONFIG_MACH_STM32F401 is not set
# CONFIG_MACH_STM32F405 is not set
CONFIG_MACH_STM32F407=y
# CONFIG_MACH_STM32F429 is not set
# CONFIG_MACH_STM32F446 is not set
# CONFIG_MACH_STM32F031 is not set
# CONFIG_MACH_STM32F042 is not set
# CONFIG_MACH_STM32F070 is not set
# CONFIG_MACH_STM32F072 is not set
# CONFIG_MACH_STM32G070 is not set
# CONFIG_MACH_STM32G071 is not set
# CONFIG_MACH_STM32G0B0 is not set
# CONFIG_MACH_STM32G0B1 is not set
# CONFIG_MACH_STM32G431 is not set
# CONFIG_MACH_STM32H723 is not set
# CONFIG_MACH_STM32H743 is not set
# CONFIG_MACH_STM32H750 is not set
# CONFIG_MACH_STM32L412 is not set
CONFIG_MACH_STM32F4=y
CONFIG_MACH_STM32F4x5=y
CONFIG_HAVE_STM32_USBOTG=y
CONFIG_HAVE_STM32_CANBUS=y
CONFIG_HAVE_STM32_USBCANBUS=y
CONFIG_STM32_DFU_ROM_ADDRESS=0
# CONFIG_STM32_FLASH_START_8000 is not set
# CONFIG_STM32_FLASH_START_20200 is not set
# CONFIG_STM32_FLASH_START_C000 is not set
# CONFIG_STM32_FLASH_START_4000 is not set
CONFIG_STM32_FLASH_START_0000=y
CONFIG_STM32_CLOCK_REF_8M=y
# CONFIG_STM32_CLOCK_REF_12M is not set
# CONFIG_STM32_CLOCK_REF_16M is not set
# CONFIG_STM32_CLOCK_REF_20M is not set
# CONFIG_STM32_CLOCK_REF_25M is not set
# CONFIG_STM32_CLOCK_REF_INTERNAL is not set
CONFIG_CLOCK_REF_FREQ=8000000
CONFIG_STM32F0_TRIM=16
# CONFIG_STM32_USB_PA11_PA12 is not set
CONFIG_STM32_SERIAL_USART1=y
# CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set
# CONFIG_STM32_SERIAL_USART2 is not set
# CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set
# CONFIG_STM32_SERIAL_USART3 is not set
# CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set
# CONFIG_STM32_CANBUS_PA11_PA12 is not set
# CONFIG_STM32_CANBUS_PA11_PB9 is not set
# CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set
# CONFIG_STM32_MMENU_CANBUS_PI9_PH13 is not set
# CONFIG_STM32_MMENU_CANBUS_PB5_PB6 is not set
# CONFIG_STM32_MMENU_CANBUS_PB12_PB13 is not set
# CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set
# CONFIG_STM32_USBCANBUS_PA11_PA12 is not set
CONFIG_SERIAL_BAUD=115200
CONFIG_USB_VENDOR_ID=0x1d50
CONFIG_USB_DEVICE_ID=0x614e
CONFIG_USB_SERIAL_NUMBER="12345"
CONFIG_CANBUS_FREQUENCY=500000
CONFIG_INITIAL_PINS=""
CONFIG_HAVE_GPIO=y
CONFIG_HAVE_GPIO_ADC=y
CONFIG_HAVE_GPIO_SPI=y
CONFIG_HAVE_GPIO_SDIO=y
CONFIG_HAVE_GPIO_I2C=y
CONFIG_HAVE_GPIO_HARD_PWM=y
CONFIG_HAVE_GPIO_BITBANGING=y
CONFIG_HAVE_STRICT_TIMING=y
CONFIG_HAVE_CHIPID=y
CONFIG_HAVE_STEPPER_BOTH_EDGE=y
CONFIG_HAVE_BOOTLOADER_REQUEST=y
CONFIG_INLINE_STEPPER_HACK=y
# This file contains common pin mappings for the Anet ET4 printer for klipper.
[stepper_x]
step_pin: PB6
dir_pin: !PB5
enable_pin: !PB7
rotation_distance: 40
microsteps: 16
endstop_pin: ^!PC13
position_min: -3
position_endstop: -3
position_max: 225
homing_speed: 50
[stepper_y]
step_pin: PB3
dir_pin: PD6
enable_pin: !PB4
rotation_distance: 40
microsteps: 16
endstop_pin: ^!PE12
position_min: -8
position_endstop: -8
position_max: 220
homing_speed: 50
[stepper_z]
step_pin: PA12
dir_pin: !PA11
enable_pin: !PA15
rotation_distance: 8
microsteps: 16
#endstop_pin: ^!PE11
#position_endstop: 250
endstop_pin: probe:z_virtual_endstop
position_min: -2 # The Z carriage may need to travel below the Z=0
# homing point if the bed has a significant tilt.
position_max: 250
homing_speed: 12
second_homing_speed: 5
# The safe_z_home section modifies the default G28 behavior
[safe_z_home]
home_xy_position: 100, 100
speed: 50
z_hop: 15
z_hop_speed: 5
[extruder]
step_pin: PB9
dir_pin: PB8
enable_pin: !PE0
full_steps_per_rotation: 200
gear_ratio: 70:100
rotation_distance: 23.132
microsteps: 16
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: PA0 # END_CONTROL
sensor_pin: PA1 # TEMP_EXB1
sensor_type: EPCOS 100K B57560G104F
control: pid
pid_Kp: 20.375
pid_Ki: 0.844
pid_Kd: 123.016
min_temp: 0
max_temp: 250
[heater_bed]
heater_pin: PE2 # BED_CONTROL
sensor_pin: PA4 # TEMP_BED
sensor_type: EPCOS 100K B57560G104F
control: pid
pid_Kp: 70.721
pid_Ki: 1.981
pid_Kd: 631.118
min_temp: 0
max_temp: 125
[fan]
pin: PE3 # LAY_FAN
[heater_fan fan1]
pin: PE1 # END_FAN
[mcu]
baud: 115200
serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
restart_method: command
[printer]
kinematics: cartesian
max_velocity: 500
max_accel: 3000
max_z_velocity: 12
max_z_accel: 50
[pause_resume]
[filament_switch_sensor filament_sensor]
switch_pin: PA2 # MAT_DET
pause_on_runout: True
# The printer ships without a probe, but the wiring loom is
# already prepared for one
[probe]
pin: !PC3 # LV_DET
z_offset: 0.2
[bed_mesh]
speed: 120
horizontal_move_z: 5
mesh_min: 30, 20
mesh_max: 225, 215
probe_count: 5, 5
########################################
# EXP1 / EXP2 (display) pins
########################################
[board_pins]
aliases:
# P1 header
P1_1=PD7, P1_3=PB2, P1_5=PE4, P1_7=PB1, P1_9=<GND>,
P1_2=PD5, P1_4=PE5, P1_6=PB0, P1_8=PD4, P1_10=<3V3>,
# P2 header
P2_1= PE6, P2_3=PD15, P2_5=PD1, P2_7=PE8, P2_9=PE10,
P2_2=PD13, P2_4=PD14, P2_6=PD0, P2_8=PE7, P2_10=PE9
[virtual_sdcard]
path: /home/takeshi/printer_data/gcodes
[pause_resume]
[display_status]
#[screws_tilt_adjust]
#screw1: 10, 10
#screw1_name: front left screw
#screw2: 10, 210
#screw2_name: rear left screw
#screw3: 210, 210
#screw3_name: rear right screw
#screw4: 210, 10
#screw4_name: front right screw
#horizontal_move_z: 10.
#speed: 50.
#screw_thread: CW-M3
[gcode_macro CANCEL_PRINT]
rename_existing: BASE_CANCEL_PRINT
gcode:
TURN_OFF_HEATERS
CLEAR_PAUSE
SDCARD_RESET_FILE
BASE_CANCEL_PRINT
[gcode_macro PAUSE]
rename_existing: BASE_PAUSE
# 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 #####
SAVE_GCODE_STATE NAME=PAUSE_state
BASE_PAUSE
G91
G1 E-{E} F2100
G1 Z{z_safe} F900
G90
G1 X{x_park} Y{y_park} F6000
[gcode_macro RESUME]
rename_existing: BASE_RESUME
gcode:
##### read E from pause macro #####
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
##### end of definitions #####
G91
G1 E{E} F2100
RESTORE_GCODE_STATE NAME=PAUSE_state
BASE_RESUME
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# -0.040000, -0.017500, -0.025000, -0.017500, -0.055000
#*# -0.052500, -0.035000, -0.007500, -0.052500, -0.075000
#*# -0.067500, -0.035000, -0.010000, -0.040000, -0.090000
#*# -0.050000, -0.012500, -0.012500, -0.030000, -0.050000
#*# -0.075000, -0.040000, -0.045000, -0.017500, -0.070000
#*# x_count = 5
#*# y_count = 5
#*# mesh_x_pps = 2
#*# mesh_y_pps = 2
#*# algo = lagrange
#*# tension = 0.2
#*# min_x = 30.0
#*# max_x = 225.0
#*# min_y = 20.0
#*# max_y = 215.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment