CAN エラーのトラブルシューティング
このドキュメントでは、CANネットワークの一般的なエラー、通信異常のトラブルシューティング、およびCAN IDが見つからない場合の手順について説明します。
適用シーン:
- KlipperでCAN0、CAN UUID、またはCANネットワーク関連のエラーが発生した場合。
- CANデバイスが断続的にオフラインになる、または検出されない場合。
bytes_invalid、Timer too closeなどの問題を調査する必要がある場合。
CAN0の設定、CAN IDの検索、配線や終端抵抗のルールについては、まずCANネットワーク設定とID検索を参照してください。
一般的なエラーの判断
| エラー | 一般的な原因 | 対処方法 |
|---|---|---|
OSError: [Errno 19] No such device | ホストPCがCANデバイスを見つけられない | UTOC、USBケーブル、CANブリッジファームウェア、電源を確認 |
can.CanError: Failed to transmit: [Errno 100] Network is down | CAN0が起動していない、または設定が間違っている | CAN0を再設定して再起動 |
can.CanError: Failed to transmit: [Errno 105] No buffer space available | CANキャッシュ不足、またはシステムネットワークキュー異常 | キャッシュを1024に確認し、必要に応じてCAN0を再設定 |
mcu 'xxx': Invalid CAN uuid | CAN UUIDの記入ミス、またはデバイスがオンラインではない | UUIDを再検索し、線順、電源、終端抵抗を確認 |
Serial connection closed | Klipperが設定を見つけたが接続が切断された | CANネットワーク品質、線順、終端抵抗、ファームウェアレートを確認 |
その他のKlipperエラーについては、一般的なエラーメッセージを参照してください。
CAN通信エラーのトラブルシューティング
CANバス通信異常の大きな原因の一つは電磁干渉(EMI)です。3Dプリンター内部のステッピングモーターケーブル、ヒーターケーブル、ヒートベッドケーブルは大電流動作時に強力な電磁界を発生します。CAN通信線(CANH/CANL)がこれらの強電線と近距離で平行配線されている場合、干渉信号がCANバスに結合され、以下を引き起こす可能性があります:
- 通信タイムアウト、MCUの断続的な切断
- CANデバイスのランダムなオフライン、
canbus_query.pyによるスキャン不可 - ホーミング中の
Timer too closeまたはCommunication timeoutのトリガー - 印刷中の突然のシャットダウン。ログに明確なハードウェアエラーなし
干渉調査時は、まずCAN線と強電線の配線レイアウト、シールド層の接地、終端抵抗の完全性を確認してください。
CAN bytes_invalid カウンターが増加し続ける
エラーメッセージ:klippy.logの毎秒統計行Statsにbytes_invalidが非ゼロで表示され、増加し続ける。
エラーの原因:CANバスメッセージが再順序付け(reordered messages)されている。これは深刻な問題であり、印刷中のどの段階でも不安定さやランダムなエラーを引き起こす可能性があります。
既知の原因:
- Linuxカーネルバージョンがv6.6.0未満の場合、gs_usb CANドライバーに再順序付けのバグが存在する。
- candlelightファームウェアを使用するUSB-CANアダプターで、ファームウェアバージョンがv2.0未満の場合。
- Klipper USB-to-CANブリッジモードのノードファームウェアがv0.12.0未満の場合。
解決方法:
- Linuxカーネルをv6.6.0以降にアップグレードする。
- candlelight USB-CANアダプターを使用している場合、ファームウェアをv2.0以降にアップグレードする。
- Klipper USB-to-CANブリッジモードを使用している場合、ブリッジノードに**Klipper v0.12.0+**ファームウェアをフラッシュしていることを確認する。
- それでも
bytes_invalidが増加する場合、根本原因が解決されていないため、カーネルバージョンとファームウェアバージョンの調査を続ける必要がある。 - 注意:
bytes_invalidの増加は、配線や終端抵抗などのハードウェア問題によって引き起こされるものではありません。ソフトウェア/ファームウェアの更新によってのみ修正できます。
CANバスキューの不足によるTimer too close
エラーメッセージ:CANバス通信時にMCU 'xxx' shutdown: Timer too closeが発生する。
エラーの原因:LinuxカーネルがCANネットワークインターフェースに設定するデフォルトのキュー長(qlen)は通常10であり、Klipperの高頻度・低遅延通信のニーズには不足しています。Klipper公式サンプルではtxqueuelen 128がよく使われます。FlyOS-FASTではデフォルトで1024に設定されており、ノード数が多い場合や高負荷シナリオで余裕があります。
解決方法:
- 現在のCANインターフェースのキュー長を確認する:
ip link show can0 | grep qlen
- キュー長を一時的に増加させる。通常のシステムではまず
128を試し、FLYシステムやマルチノードマシンでは1024を使用できます:
sudo ip link set dev can0 qlen 128
# または
sudo ip link set dev can0 qlen 1024
- 永続的に設定する:
/etc/network/interfaces.d/can0にtxqueuelen 128またはtxqueuelen 1024パラメータを追加します。systemd-networkdを使用している場合は、.linkファイルにTxQueueLength=を設定します。
CANバスノードが応答しない
エラーメッセージ:CANデバイスが突然オフラインになり、canbus_query.pyでデバイスをスキャンできない。
一般的な原因:
- CAN終端抵抗の欠落または不正(CANH-CANL間には必ず2つの120Ω抵抗が必要)。
- CANH/CANL配線の緩み、圧着不良、またはコネクタの緩み。
- CANケーブルがツイストペアシールドケーブルではない、または強電線と平行配線されていることによる電磁干渉(最も一般的で見つけにくい原因)。
- USB-CANアダプターの電源異常。
干渉調査のポイント:
電磁干渉によるCAN通信異常は、「断続的」かつ「ランダム」に現れることが多いです。つまり、正常な時もあれば突然切断され、電源再投入で復旧することもあります。調査時は以下に注目してください:
- 配線レイアウト:CAN通信線がモーターケーブル、ヒーターケーブル、ヒートベッドケーブルとケーブルキャリア内で並走していませんか?高速PWM変調されたモータードライバー信号とヒーターのスイッチングノイズは、最も強力な干渉源です。
- シールド層の接地:シールドケーブルを使用する場合、シールド層は片端接地(ホスト側のみ)ですか?両端接地はグラウンドループを形成し、かえって干渉を引き起こします。
- 終端抵抗の位置:終端抵抗はCANバスの物理的な末端に取り付けられ、ボード上のジャンパーピン、ディップスイッチ、または既製の終端インターフェースを介して有効になっていますか?
- CANケーブル仕様:ツイストペアケーブル(ツイストピッチが数センチメートル以内)を使用していますか?パラレルケーブル(ツイストペアではない)はコモンモード干渉をほとんど抑制できません。
- 接地の完全性:マシンの電源、筐体は確実に接地されていますか?接地されていないマシンの金属フレームは大型アンテナのように機能し、環境ノイズを拾いやすくなります。
調査方法:
以下のハードウェア調査は、プリンターの電源を完全に切り、電源をコンセントから抜いた状態で行ってください:CANH/CANLの確認、配線のやり直し、シールド層の調整、終端抵抗の有効化/無効化、CANH-CANL間の抵抗測定。
- CANバス上に2つの120Ω終端抵抗がちょうど存在することを確認します。ボード上のジャンパーピン、ディップスイッチ、または既製の終端インターフェースを優先して使用します。
- CANH/CANLの配線が確実に固定されているか、コネクタが完全に挿入されているかを確認します。
- 電源を切ってから操作してください。マルチメータを使用してCANH-CANL間の抵抗を測定します(正常値は約60Ω)。
- 配線をやり直す:CAN通信線を強電線から分離し、少なくとも2~3cmの距離を保ち、平行にならないようにします。
- シールド接地の確認:シールド線はホスト側のみで接地し、ツールボード側は浮かせて接続しないでください。電源を分解したり、商用電源のアース線を変更したりしないでください。
candumpを使用してCANバストラフィックを監視し、多数のエラーフレーム(error frames)が表示されるかどうかを確認します。- 印刷速度/加速度を一時的に下げてテストします。問題が解消される場合、干渉がモータードライブ強度に正の相関関係があることを示しています。
IDが見つからない場合の調査手順
ip -details link show can0を実行し、CAN0が存在し利用可能な状態であることを確認します。- ツールボード、メインボードのファームウェアCANレートがホストPCのCAN0レートと一致していることを確認します。
- デバイスIDが
printer.cfgに既に書き込まれている場合、一時的に対応する設定をコメントアウトし、シャットダウンして約10秒後に電源を再投入して検索します。 - CAN-HとCAN-Lの接続が逆ではないか、断線や接触不良がないか確認します。
- CANネットワークの両端にそれぞれ
120Ωの終端抵抗があることを確認します。マシンの電源を完全に切った状態で、CAN-HとCAN-L間の抵抗値を測定し、約60Ωであることを確認します。 - ツールボードまたはメインボードに正常に電源が供給されていることを確認します。
- ファームウェアコンパイル時に正しい通信方式が選択されていることを確認します。
- 検索結果に
Application: CANBOOTまたはApplication: Katapultと表示される場合、先にKlipperファームウェアをフラッシュしてから再度検索します。
終端抵抗のルール
終端抵抗のジャンパーピン、ディップスイッチの調整、またはCANケーブルの抜き差しを行う前に、プリンターの電源を完全に切り、電源をコンセントから抜いてください。
| デバイスタイプ | 終端抵抗の要件 | 操作説明 |
|---|---|---|
| CANツールボード | 120Ω終端抵抗が必要 | ボード上のジャンパーピンまたはディップスイッチで有効化 |
| メインボードCANインターフェース | 120Ω終端抵抗が必要 | ボード上のジャンパーピンまたはディップスイッチで有効化 |
| UTOCタイプ変換モジュール | 通常は120Ω抵抗が内蔵済み | 追加の終端抵抗は不要 |
クイック調査手順
- まずデバイスを確認:
lsusbを実行し、1d50:606fが表示されることを確認します。 - 次に設定を確認:
ip -details link show can0を実行し、CAN0が存在し、レートが正しく、キャッシュが1024であることを確認します。 - 最後にハードウェアを確認:完全に電源を切った状態でCAN-HとCAN-L間の抵抗を測定し、約
60Ωであることを確認します。
これらをすべて確認しても異常が続く場合は、USBケーブル、CANケーブル、UTOC、またはCANブリッジデバイスを交換してクロステストを試みてください。
CANデバイスファームウェア更新リファレンス
このセクションは、すでにCANネットワークに接続できており、CAN経由でメインボードまたはツールボードのファームウェアを更新する必要があるシナリオ向けです。製品ごとにファームウェア名やコンパイル方法が異なりますので、まず対応する製品のチュートリアルに従ってファームウェアをコンパイルしてください。
準備
- 製品のチュートリアルに従って新しいファームウェアをコンパイルします。
- デバイスのCAN UUIDが検索可能であること、または
printer.cfgにそのデバイスのcanbus_uuid:が記入されていることを確認します。 - Klipperサービスを停止します:
sudo systemctl stop klipper
更新の実行
以下のコマンドの<CAN_UUID>を実際のデバイスIDに置き換えてください。
システムバージョンに応じて対応するコマンドを選択してください。
- FlyOS-FAST 1.3.8以降、または2026年4月9日以降にKlipperを更新したシステム:
python3 ~/klipper/lib/katapult/flashtool.py -u <CAN_UUID>
- 旧バージョンのシステム、つまりFlyOS-FAST 1.3.8より前、または2026年4月9日より前にKlipperを更新していないシステム:
python3 ~/klipper/lib/canboot/flash_can.py -u <CAN_UUID>
-uの後には必ずスペースを入れ、その後ろにCAN UUIDを記入してください。
CAN Flash Success というメッセージが表示されれば、通常は書き込み成功です。
更新後の操作
更新が完了したら、Klipperを再起動します:
sudo systemctl start klipper
更新後に接続できない場合は、CAN IDを再検索し、printer.cfgのcanbus_uuid:が正しいかどうかを確認してください。
最終確認リスト
CAN IDが見つからない、またはKlipperがCANデバイスに接続できない場合は、以下の手順を順に確認してください:
can0がシステムに認識されている。bitrateがファームウェアコンパイル時に設定したCANレートと一致している。qlenまたはtxqueuelenが1024である。- CAN-HとCAN-Lが逆に接続されていない。
- CANバス両端の終端抵抗が正しい。
- ツールボードまたはメインボードへの電源供給が正常である。
- ファームウェアの通信方式が正しく選択されている。
printer.cfgで実際に検索されたcanbus_uuid:を使用している。- 同じ
[mcu]内でserial:とcanbus_uuid:の両方が有効になっていない。