Tronxy CRUX1 (CXY-446-V10-220413)にKlipperを導入したい！

## はじめに

### Why done it 
この度前々から狙っていたTronxy社のCRUX1がAmazonブラックフライデーでセールになっており，うっかり手がぽちりました．
実は既に我が家にある3Dプリンタ5台の内1台はKlipper導入済みでKlipper無しでは生きていけない体にされており，新たにお迎えするCRUX1くんにもKlipperを導入することに決めました．
似たような先行事例もありすんなりいくかと思いきや，地味に厄介な落とし穴があったので共有＆備忘録として本稿を書いています．

### Klipper is なに（参考）
KlipperとはOSSで公開されている3Dプリンタ制御ソフトの1つで，「プリンタ本体に積んであるプロセッサだけじゃ物足りないから，Raspberry Piとかリッチな計算リソースも組み合わせてもっと細やかにプリンタを制御しようぜ」という夢のあるプロジェクトです．最近の自作＆改造3DP界隈ではデファクトになりつつのあるかな，と個人的に思っています．細かな紹介記事は他に良いものが沢山ありますので，ここでは公式サイトのリンク掲載にとどめます．（公式：[Kliper3d.org](https://www.klipper3d.org/)）


## 搭載チップがSTM32F446の場合
実は我が家にCRUX1が届く前に，運良く別のCRUX1くんをKlipper化試してみる機会があり，そちらはちゃんと(?)チップがまだSTM32F446でした．恐らく少し前のロットまでは部品が調達できていたのだと思います．

このロットを引けた場合は，特に罠はありません．[こちらのZenn[1]](https://zenn.dev/marbocub/articles/tronxy-stm32f4-klipper)に従って作業を進めれば問題なくKlipper化することができました．有益な記事を上げてくださっている著者の方には頭が上がりません．

## 搭載チップがGD32F427の場合
さて，うちにお迎えした子含めて問題はこちらです．ボードに描かれたシルク自体は"CXY-446-V10-220413"なので，全く同じようにKlipper導入できるかと思いきや，ほんの少しだけ設定を変えてあげる必要がありました．本節ではこの対処法とそこに至るまでの試行錯誤を共有します．

### こうすれば動く
まずは先に対処法から示します．

[参考[1]の 1.1 make menuconfig](https://zenn.dev/marbocub/articles/tronxy-stm32f4-klipper#1.1.-make-menuconfig)の画面において，下図のように`[*] Enable extra low-level configuration options`にチェックを入れ，クロック周波数とボーレートを指定できるようにします．ここでクロックに `8 MHz crystal`を，ボーレートに `250000`を設定．以降は同様に`make`してバイナリを書き込み...の手順を踏めばOKです．きっとクリスタルだけはチップ変更に伴って変更されていたのでしょう...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490597/866f5bcf-679c-9bb3-e5ef-6c2f05cf6298.png)


### 試行錯誤の過程

動いてみればどうということもない設定修正ですが，ここに至るまでにはそれなりに頭を悩ませました．大抵の解説記事では端的に結論を紹介のみされていますが，せっかくなのでTwitterで騒ぎながら対応を考えていた過程を紹介しようと思います．

Twitterでの悲痛な叫び↓（ツリーで全部つないで呟いたので，全部が気になる方は追ってみてください．迷走している様子が確認できます．）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">印刷会で戯れたCRUX1くんはちゃんとSTM32F446だったぽいんだけど、我が家に来た子はGD32F”427”だった<br><br>ボード型番は446のままだからいけるやろ！！と思って446のファーム流し込んだけど！！！！まあダメですね！！！ゔぇ！！ <a href="https://t.co/sSA2Gax7Z3">pic.twitter.com/sSA2Gax7Z3</a></p>&mdash; 孔明 (@eternalfriend17) <a href="https://twitter.com/eternalfriend17/status/1599343712664170496?ref_src=twsrc%5Etfw">December 4, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

(1)：「ダメ」とは具体的にどんな状態か確認する．見られるならエラーメッセージも読む．
→ Mainsailのステータスが`Printer is not ready`になっている．つまり初手の疎通が出来ていないと予想．

(2)：疎通ができてないのは何故？ハードとソフトどっち起因か考えてみる
→ 本体とつなぐUSBケーブルを抜き差しすると，`/dev/ttyUSB0`が現れたり消えたりする．つまりデバイスレベルでは問題がなさそう．つまりソフト（流しているファーム）が悪さをしているぽい？

(3)：`/dev/ttyUSB0`が見えるということは，CH340とNanoPiの間の通信には（多分）問題がない．
→ でもCH340とGD32F427の間で通信ができてない可能性はある．

(4)：(2), (3)より，とりあえずピン配置から疑ってみる．[STM32F446のデータシート[2]]()と，[GD32F427のデータシート[3]]()を見比べてみる．
→ 電源はもちろん，ピン番号やUSARTに割り当てられるピン配置まで一緒．冷静に考えたら，シルク変同じないのにチップだけ変わってるんだからそれはそうって感じ．でもPA9とPA10に割り当てられているUSARTの番号が，STMは`USART1`だけど，GDは`USRAT0`なので，ここが悪さしてるかもしれない．

(5)：もう1回データシートを見比べて，STMの`USART1`に割り当てられているアドレスと，GDの`USART0`に割り当てられているアドレスを確認してみる．実はこいつらが違うアドレスなせいで，ファームそのまま流してもCH340との通信ができていないのかもしれない．
→ 両者とも全く同じアドレス割り当てだった．チップ換装対象なわけだしまあ妥当か...

(6)：行き詰まってきたのでなんとなくボードを眺め直す．なんか8MHzのクロックが乗っていることに気づく．
→ そういえばデフォルトのクロックは周波数いくつなんだろう...調べるの面倒だしとりあえず8MHzで指定してファーム再makeしてみる．

(7)：やってみたら動いた！！！！


ざっくり要約するとこんな感じでした．
今回解決するまで数時間程度でしたが，STM32F446版のCRUX1なら[1]の手順ですんなりKlipper化できることを体験していなければ，問題の切り分けはもっと大変だったなと後から思います．この点非常に幸運でした．

この手のトラブルシューティングの過程ってあまり見かけたことがない（調べ方が悪いだけかも）ので，考え方の参考になったという方が1人でもいらしたら嬉しいです．


## おわりに

本稿ではTronxy CRUX1 ( = CXY-446-V10-220413 )のKlipper化について，2種類のチップについて手順を紹介しました．今後同じ罠を踏み抜く人を減らせたら幸いです．

## 参考資料
- [[1] Zenn TRONXY CXY-V6-191121 (STM32F446 based) メインボードをKlipper化する](https://zenn.dev/marbocub/articles/tronxy-stm32f4-klipper)
- [[2] STM32F446データシート](https://www.st.com/resource/en/datasheet/stm32f446mc.pdf)
- [[3] GD32F427データシート](https://gd32mcu.com/data/documents/datasheet/GD32F427xx_Datasheet_Rev1.2.pdf)
- [[4] Tronxy 3D プリンター公式ストアページ](https://www.tronxy3d.com/ja/products/tronxy-silent-mainboard-with-wire-cable-for-x5sa-series-x5sa-400-series)
（本文中では特に参照していませんが，本体写真が大きくて見やすいので参考用にリスト追加しておきます．）