AI3M x BIGTREETECH MANTA M5P – Part 4

はじめに

ここまでの構成変更で M5P で駆動できるようになっていたが,せっかく買った BTT TFT35 と klipper の連携ができていなかった.インターネット上では整理された設定方法が見当たらなかったが,ようやく整理がついたのでここにまとめておく.

BIGTREETECH
「BIGTREETECH」の記事一覧です。

接続方法のアイディア

BTT TFT35 は,EXP1/2で接続する Marlin Mode(LCD12864 mode),RS232 で接続する Touch Mode(serial port screen mode),の2種類のモードがあり,ロータリーエンコーダを3秒程度長押しすると切り替えられる.過去の投稿では Marlin Mode の配線にしていたので,Klipperとの連携ができない.

今回は Touch Mode として Klipper に接続する.アイディアはこちらの記事で書かれているとおり,MCU の Linux 上で Klipper と TFT35 の通信をブリッジする.ただし,環境によってはそのままでは適用できないので,一部の設定を読み替えたり,サービスを止めたり,色々いじってあげる必要があるみたい.

Using BTT TFT35 with Klipper in Touch Mode
I have the BigTreeTech TFT35 display connected to my Anycubic Linear + running Marlin. I know it is an old 3D printer in...

TFT Bridge for BTT CB1

やることはこんな感じ.baudrate を調整しつつ,UART を Klipper に接続する.

UART0@CB1 <--> ttyS0 <<--(getty.service)-->> Linux console



UART@TFT35 <--> UART0@CB1 <--> ttyS0 <<--(bridge program)-->> klippy.serial

ちょっと手間がかかるので順を追って変更箇所を整理する.

TFT35 接続と設定

M5P と TFT35 を次の通りに接続する.

TFT35 の設定画面で baudrate を 115200 に設定する.

Klipper サービス修正

Klipper サービスは起動時に仮想シリアル klippy.serial を生成する.klippy.serial に G コードを流すことで Klipper のインタフェースになっていることが確認できる.デフォルトの baudrate は38400 として認識されている.

btt-cb1:~$ echo G28 > printer_data/comms/klippy.serial
btt-cb1:~$ stty -F printer_data/comms/klippy.serial 
speed 38400 baud; line = 0;
-brkint -imaxbel
-echo

この仮想シリアル klippy.serial は klipper.service の起動スクリプト klippy.py で生成される.そのままのプログラムでは baudrate を指定するオプションがないので,サービス起動処理 klippy.py を修正して baudrate 指定オプションを実装する.デフォルト値を 115200 とする.

btt-cb1:~$ diff klipper/klippy/klippy.py{.org,}
269a270,272
>     opts.add_option("-b", "--baudrate", dest="baudrate", type="int",
>                     default=115200,
>                     help="set baudrate for input tty (default 115200)")
299a303,317
>         try:
>             import termios, os
>             fd = os.open(options.inputtty, os.O_RDWR)
>             attrs = termios.tcgetattr(fd)
>             baud = getattr(termios, f'B{options.baudrate}', None)
>             if baud is None:
>                 raise ValueError("Unsupported baudrate: %s" % options.baudrate)
>             attrs[4] = baud  # ISPEED
>             attrs[5] = baud  # OSPEED
>             termios.tcsetattr(fd, termios.TCSANOW, attrs)
>             os.close(fd)
>             logging.info("Set baudrate %d on %s", options.baudrate, options.inputtty)
>         except Exception as e:
>             logging.warning("Failed to set baudrate on %s: %s",
>                             options.inputtty, e)

任意の値を指定したい場合は klipper.env にオプションを追加すれば良い.これはお好みでどうぞ.

btt-cb1:~$ diff printer_data/systemd/klipper.env{.org,}
1c1
< KLIPPER_ARGS="/home/biqu/klipper/klippy/klippy.py /home/biqu/printer_data/config/printer.cfg -I /home/biqu/printer_data/comms/klippy.serial -l /home/biqu/printer_data/logs/klippy.log -a /home/biqu/printer_data/comms/klippy.sock"
---
> KLIPPER_ARGS="/home/biqu/klipper/klippy/klippy.py /home/biqu/printer_data/config/printer.cfg -I /home/biqu/printer_data/comms/klippy.serial -b 115200 -l /home/biqu/printer_data/logs/klippy.log -a /home/biqu/printer_data/comms/klippy.sock"

これでサービス起動時に自動的に baudrate が設定される.

サービスを再起動して,stty で baudrate が指定した値になっているか確認する.ただし,この仮想シリアルの実態は tty(pty) であり,見かけ上は指定値となっていても,通信速度制限としては作用しないらしい.

btt-cb1:~$ sudo systemctl restart klipper.service
btt-cb1:~$ stty -F printer_data/comms/klippy.serial 
speed 115200 baud; line = 0;
-brkint -imaxbel
-echo

ちなみに,とりあえず baudrate を一時的に変更して動作確認したいだけなら stty コマンドで値を変更しておけば良い.

btt-cb1:~$ stty -F printer_data/comms/klippy.serial 115200

カーネルパラメータ変更

BTT CB1 はブートパラメータを設定することで /dev/ttyS0 を UART0 として利用できる.

The default value is console=display, This means that the UART0 of CB1 is used as the debugging port by default. We can use MobaXterm to connect to CB1 by UART0 and debug. If klipper wants to use UART0 to control the motherboard, we need to set it to console=serial, now klippe can use UART0 as /dev/ttyS0.

https://github.com/bigtreetech/CB1
console=device,options

device:         tty0 for the foreground virtual console
                ttyX for any other virtual console
                ttySx for a serial port
                lp0 for the first parallel port
                ttyUSB0 for the first USB serial device

options:        depend on the driver. For the serial port this
                defines the baudrate/parity/bits/flow control of
                the port, in the format BBBBPNF, where BBBB is the
                speed, P is parity (n/o/e), N is number of bits,
                and F is flow control ('r' for RTS). Default is
                9600n8. The maximum baudrate is 115200.
https://docs.kernel.org/admin-guide/serial-console.html

これに合わせてarmbianEnv.txtを修正してOSを再起動する.

btt-cb1:~$ cat /boot/armbianEnv.txt | grep console
console=serial,115200
btt-cb1:~$ sudo reboot

baudrate 115200 として ttyS0 が有効化される.

btt-cb1:~$ stty -F /dev/ttyS0 
speed 115200 baud; line = 0;
min = 1; time = 0;
-brkint -icrnl -imaxbel iutf8
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

getty サービスを無効化

ここまでの設定で ttyS0 は有効にできたが,ttyS0 は getty サービスが掴んでいる状態になっている.カーネルパラメータ console が設定されていると,getty サービスが自動的に仮想コンソールを掴みに来る.このままだと仮想シリアルへのアクセスがブリッジプログラムと競合するのでgettyサービスを止める.

btt-b1:~$ ps auxf | grep ttyS[0]
root        1308  0.0  0.1   5244  1664 ttyS0    Ss+  00:33   0:00 /sbin/agetty -o -p -- \u --keep-baud 115200,57600,38400,9600 - linux
btt-b1:~$ systemctl status serial-getty@ttyS0.service 
● serial-getty@ttyS0.service - Serial Getty on ttyS0
     Loaded: loaded (/lib/systemd/system/serial-getty@.service; enabled-runtime; preset: enabled)
    Drop-In: /usr/lib/systemd/system/serial-getty@.service.d
             └─10-term.conf
     Active: active (running) since Wed 2025-10-29 21:27:27 JST; 7min ago
       Docs: man:agetty(8)
             man:systemd-getty-generator(8)
             https://0pointer.de/blog/projects/serial-console.html
   Main PID: 54404 (agetty)
      Tasks: 1 (limit: 924)
     Memory: 192.0K
        CPU: 6ms
     CGroup: /system.slice/system-serial\x2dgetty.slice/serial-getty@ttyS0.service
             └─54404 /sbin/agetty -o "-p -- \\u" --keep-baud 115200,57600,38400,9600 - linux

disable することができなかったので,サービス停止して,mask で強制的にサービスを無効化する.無効化できたら再起動する.

btt-b1:~$ sudo systemctl stop serial-getty@ttyS0.service 
btt-b1:~$ sudo systemctl mask serial-getty@ttyS0.service 
Created symlink /etc/systemd/system/serial-getty@ttyS0.service → /dev/null.
btt-b1:~$ systemctl status serial-getty@ttyS0.service 
Warning: The unit file, source configuration file or drop-ins of serial-getty@ttyS0.service changed on disk. Run 'systemctl daemon-r>
○ serial-getty@ttyS0.service
     Loaded: masked (Reason: Unit serial-getty@ttyS0.service is masked.)
    Drop-In: /usr/lib/systemd/system/serial-getty@.service.d
             └─10-term.conf
     Active: inactive (dead) since Fri 2025-10-31 00:54:11 JST; 2min 26s ago
   Duration: 20min 16.653s
   Main PID: 1308 (code=killed, signal=TERM)
        CPU: 7ms
btt-b1:~$ sudo systemctl daemon-reload
btt-b1:~$ sudo reboot

再起動が終わったら getty サービスが停止されていることを確認しておく.

btt-cb1:~$ systemctl status serial-getty@ttyS0.service 
Warning: The unit file, source configuration file or drop-ins of serial-getty@ttyS0.service changed on disk. Run 'systemctl daemon-r>
○ serial-getty@ttyS0.service
     Loaded: masked (Reason: Unit serial-getty@ttyS0.service is masked.)
    Drop-In: /usr/lib/systemd/system/serial-getty@.service.d
             └─10-term.conf
     Active: inactive (dead)

ブリッジサービス設定

冒頭の接続方法で紹介したブログに掲載されている python コードは,純粋にシリアルインタフェースのブリッジとして実装されている.一時的に動作検証をするには十分だけれど,常用する場合は systemd のサービス化等で自動起動させる必要がある.

これとは別に GitHub 上で Klipper の拡張機能としてコードが公開されているので,今回はこっちを利用する.ただし,何故か Moonraker の起動が遅くなるかもしれない.(原因未確認

GitHub - oldhui-uk/tftbridge: Bridging BigTreeTech TFT35 and Klipper
Bridging BigTreeTech TFT35 and Klipper. Contribute to oldhui-uk/tftbridge development by creating an account on GitHub.

いちおうシリアル用のライブラリをインストールしておく.

btt-cb1:~$ sudo apt install python3-serial

あとは GitHub の説明を適当に読み替えながら設定する.

  1. Copy tftbridge.py into /home/biqu/klipper/klippy/extras/
  2. In your standard printer.cfg file, add the following section:
[tftbridge]
tft_device: /dev/ttyS0
tft_baud: 115200
tft_timeout: 0
klipper_device: /home/biqu/printer_data/comms/klippy.serial
klipper_baud: 115200
klipper_timeout: 0

動作確認

ここまでの設定で TFT35 から Klipper を操作できる状態となっている.TFT35 のメニューから適当に操作して,正しく動作することを確認する.

ホーミングは問題無いけど,ホーミングした後に各軸方向へ移動操作をするとリミットスイッチの状態を無視して移動できるみたい.また,いくつかの G コードは Klipper に対応していない部分もありそうだけど,いまのところ不便無いので困ったらファームウェア書き換えるか考えることにする.

おわりに

やっぱり端末の前に座って直接操作できるのは良いね.

dmm.make はデータの無料ダウンロード機能が無くなったみたいなので,今後は気が向いたら thingiverse にもデータを置いてみたり,適当に使い分けてみることにする.需要があればどうぞ.

HeavyMoon's Thingiverse Profile
I'll be posting remixes of products I find on Thingiverse there, but check out the rest on my blog. I might also put som...

コメント

タイトルとURLをコピーしました