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

接続方法のアイディア
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 の通信をブリッジする.ただし,環境によってはそのままでは適用できないので,一部の設定を読み替えたり,サービスを止めたり,色々いじってあげる必要があるみたい.

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
https://github.com/bigtreetech/CB1console=display, This means that theUART0of CB1 is used as the debugging port by default. We can useMobaXtermto connect to CB1 by UART0 and debug. If klipper wants to useUART0to control the motherboard, we need to set it toconsole=serial, now klippe can useUART0as/dev/ttyS0.
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 rebootbaudrate 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 -echokegetty サービスを無効化
ここまでの設定で 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 - linuxdisable することができなかったので,サービス停止して,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 の起動が遅くなるかもしれない.(原因未確認
いちおうシリアル用のライブラリをインストールしておく.
btt-cb1:~$ sudo apt install python3-serialあとは GitHub の説明を適当に読み替えながら設定する.
- Copy
tftbridge.pyinto/home/biqu/klipper/klippy/extras/ - 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 にもデータを置いてみたり,適当に使い分けてみることにする.需要があればどうぞ.












コメント