← Back to Home
電子工作 ·

【加藤ラジコン #102】Raspberry Pi Pico 2で実現するMCP2515 CANバスインターフェース

【加藤ラジコン #102】Raspberry Pi Pico 2で実現するMCP2515 CANバスインターフェース

【加藤ラジコン #102】Raspberry Pi Pico 2で実現するMCP2515 CANバスインターフェース

アイキャッチ

回路が喋る日

Raspberry Pi Pico 2が届いた。RP2350を載せたこの5ドルのボードは、先代のRP2040から一皮むけた。Arm Cortex-M33が150MHzで走り、SRAMは520KB。PIOステートマシンは12個に増え、HSTXペリフェラルが高速データ転送を担う。だが、このボードには足りないものがある。ネイティブのCANペリフェラルだ。 産業界の神経系、CANバス。自動車のエンジンルームから工場のラインまで、この二線式バスはノードを繋ぐ。RP2350は賢いが、CAN語は話せない。そこで登場するのが、MicrochipのMCP2515だ。 CANバスの誕生は1980年代初頭に遡る。BOSCHが自動車の配線量削減のために開発した。それ以来、自動車産業の標準となり、産業オートメーション、医療機器、航空宇宙まで応用範囲を広げた。現在では、全世界で10億個以上のCANノードが稼働している。この規模のエコシステムが、MCP2515の存在意義を支えている。

MCP2515とTJA1050の二人三脚

MCP2515はSPIで話すCANコントローラだ。内蔵のバッファは2つ、マスクフィルタは6つ。RP2350とSPI接続し、CANプロトコルの面倒な処理を肩代わりする。RP2040時代から変わらぬ頼れる相棒だ。 MCP2515の内部には、3つの送信バッファと2つの受信バッファがある。送信バッファは優先度に応じて自動的に競合解決を行う。受信バッファはマスクとフィルタで、必要なメッセージだけを選別できる。このハードウェアフィルタリング機能は、CPUの負荷を大幅に減らす。100kbpsのCANバスで、1秒間に数千フレームが届く。すべてをソフトウェアで処理するのは現実的ではない。 その隣に立つのが、TJA1050。高速CANトランシーバだ。MCP2515の論理信号を、CAN_HとCAN_Lの差動信号に変換する。120Ωの終端抵抗を挟んで、バスに接続する。この組み合わせは、Arduino時代から何千回と繰り返されてきた。定番には、定番の理由がある。 TJA1050は、ISO 11898に準拠した高速CANトランシーバだ。最大1Mbpsの通信速度に対応し、差動信号のドライバ能力を備えている。送信時は論理レベルをCAN_H/CAN_Lの電圧差に変換し、受信時は差動電圧を論理レベルに戻す。この変換は、ノイズ耐性の要だ。また、TJA1050は過電圧保護、過熱保護、短絡保護を内蔵している。産業環境での過酷な条件に耐える設計だ。

RP2350の強みを活かす接続

Pico 2のGPIOからSPI0を選ぶ。GP2をSCK、GP3をMOSI、GP4をMISO、GP5をCSに割り当てる。GP6はINT、MCP2515からの割り込みを受け取る。この配置は、Pico 1からの互換性を保ちつつ、RP2350の高クロックを活かす。 SPIバスの速度は、RP2350の能力を引き出す鍵だ。RP2040は最大125kbpsのSPIに対応していたが、RP2350は劇的に向上した。理論上は数十MbpsのSPI通信が可能だ。MCP2515の最大SPIクロックは10MHzだが、余裕を持って動作する。この余裕が、システム全体の信頼性を高める。 割り込みピン(INT)の活用も重要だ。MCP2515は受信、送信完了、エラー発生、バスオフなど、様々なイベントで割り込みを生成する。RP2350のArm Cortex-M33はNVIC(Nested Vectored Interrupt Controller)を内蔵しており、割り込みの優先度制御が可能だ。高優先度のCAN受信割り込みは、他の処理を遮って即座に処理できる。リアルタイム性が求められるCAN通信には、この機能が不可欠だ。

MCP2515回路図

クロックの精度が通信品質を決める

クロックは8MHzの水晶発振器をMCP2515に直結する。内部オシレータもあるが、水晶の方がジッタが少ない。CANバスのタイミング精度は、通信の信頼性を左右する。ここはケチらない。 MCP2515の内部には、ビットタイミング制御レジスタがある。同期セグメント、伝播セグメント、フェーズセグメント1、フェーズセグメント2の4つのパラメータで、ビット時間を定義する。これらの値は、バス速度と水晶発振器の周波数から計算する。1Mbpsのバス速度で8MHzの水晶を使用する場合、1ビットは8クロックサイクルになる。これを4つのセグメントに配分する。 ビットタイミングの誤設定は、通信エラーの直接的原因になる。伝播セグメントが短すぎると、バスの遅延によりビット誤認が発生する。サンプリングポイントが適切でないと、ノイズの影響を受けやすくなる。このパラメータ調整は、CAN通信の暗黙知だ。経験豊富なエンジニアでさえ、初期設定には時間をかける。 水晶発振器の選定も重要だ。周波数許容差は±50ppm以下が推奨される。温度ドリフトも考慮する必要がある。工場内の温度変化が激しい環境では、±100ppmの水晶では安定動作が難しい場合がある。この場合、TCXO(温度補償型水晶発振器)の使用を検討する。コストは上がるが、信頼性の向上は計り知れない。

ドライバの実装:PIOの出番

RP2350のPIOは、RP2040から進化した。ステートマシンは12個、命令セットは豊富になった。CANトランシーバとの通信は、PIOでハードウェア化できる。ソフトウェアのオーバーヘッドを減らし、CPUの余力をアプリケーションに回せる。 PIOプログラムは、アセンブリ言語で記述する。MCP2515とのSPI通信をPIOで実装する場合、CSのアサート、SPIコマンドの送信、データの送受信、CSのディアサートを一連のサイクルとして定義する。これをPIOステートマシンが実行する。CPUはPIOにタスクをキューイングするだけで、実際のデータ転送はPIOが行う。 このアプローチのメリットは二つある。第一に、CPUの負荷が激減する。SPI転送中もCPUは他の処理を実行できる。第二に、タイミング精度が向上する。PIOのサイクルは決定的で、ソフトウェアの割り込みによる遅延がない。CANバスのようなリアルタイム通信には、この決定性が重要だ。 MicroPythonやCircuitPythonのライブラリも出そろった。Rustのサポートも進んでいる。GoogleのPigweed SDKも、Pico 2を標準プラットフォームとして迎えた。開発環境の選択肢は広がり続けている。 MicroPythonのmachine.SPIクラスは、Pico 2のSPIペリフェラルを抽象化する。baudrateパラメータで転送速度を指定し、polarityとphaseでSPIモードを設定する。MCP2515はSPIモード0(CPOL=0, CPHA=0)またはモード3(CPOL=1, CPHA=1)に対応している。readintoやwriteメソッドで、MCP2515のレジスタにアクセスする。 CircuitPythonの場合、busio.SPIクラスを使用する。MicroPythonと同様のAPIだが、CircuitPython独自の機能もある。例えば、try_lockとunlockでSPIバスの排他制御を行う。複数のデバイスがSPIバスを共有する場合、この機能は役に立つ。 Rustのembedded-halトレイトは、低レベルのハードウェア抽象化を提供する。spi::FullDuplexトレイトを実装することで、SPI通信を型安全に行える。Rustの所有権システムは、ハードウェアリソースの競合をコンパイル時に検出する。これにより、実行時のデバッグ時間を大幅に削減できる。

速度と距離のトレードオフ

CANバスの速度は、バス長と反比例する。1Mbpsなら40m、125kbpsなら500mが限界だ。RP2350とMCP2515の組み合わせは、この全範囲をカバーする。自動車診断用のOBD-IIアダプタから、工場の大型ラインまで、同じ回路で対応できる。 このトレードオフの背後にある物理は、信号の伝播遅延だ。電気信号は光速の約60%の速度でケーブルを伝播する。1Mbpsの信号周期は1マイクロ秒だ。この間に、信号は最も遠いノードまで往復しなければならない。バス長が長すぎると、信号の往復時間が1ビット時間を超え、アービトレーションが破綻する。 実際の設計では、この理論値にマージンを持たせる。1Mbpsのバスでは、実際には30m程度を上限とすることが多い。配線のインピーダンス不整合、コネクタの損失、温度による伝播速度変化など、多くの要因が信号品質に影響する。工業製品では、このマージン設計が製品寿命と信頼性を決める。 差動信号の強みはノイズ耐性だ。CAN_HとCAN_Lの電位差だけが意味を持つ。共通モードノイズは打ち消される。工場のモーター駆動ラインでも、信号は安定して届く。 差動信号の原理はシンプルだ。送信側はCAN_Hをハイレベルに、CAN_Lをローレベルに駆動する。受信側はCAN_HからCAN_Lを減算し、その差電圧を論理レベルに変換する。外部からのノイズは、CAN_HとCAN_Lに等しく重畳される。差動増幅器は、この共通成分を打ち消し、差分成分だけを増幅する。 このノイズ排除能力は、共通モード除去比(CMRR)で表される。TJA1050のCMRRは-40dB以下だ。つまり、共通モードノイズの100倍以上を除去できる。工場の高ノイズ環境でも、安定した通信が可能だ。

Pico 2ピン配置

実際の応用例

個人製作の世界で、CANバスの需要は増えている。ラジコンカーの複数ESCを統合制御したい。ドローンの複数モーターを同期させたい。ロボットの関節を調整したい。これら全てで、CANバスは有効だ。 ラジコンカーの分野では、CANバスの採用が急速に進んでいる。従来のPWM信号は、1つのチャンネルで1つのESCしか制御できなかった。CANバスでは、1本のケーブルで複数のESCを制御できる。配線量が激減し、故障点が減る。また、CAN通信ではESCの温度、電流、電圧情報をリアルタイムに取得できる。これにより、バッテリー管理が精密化し、レース中のパフォーマンス最大化が可能になる。 ドローンの分野では、CANバスはマルチローターの同期に使われる。従来はI2Cでモータードライバと通信していたが、I2Cはシングルマスターでスレーブアドレスの競合が起きやすい。CANバスはマルチマスターで、どのモーターでもバスを制御できる。また、差動信号のノイズ耐性は、ドローンの高電流モーター環境で有利だ。高周波ノイズが多くても、通信は安定して継続する。 ロボットの分野では、CANバスは関節のフィードバック制御に使われる。サーボモーターの位置、速度、トルク情報をCANバスで伝送する。従来のPWMサーボでは位置情報しか取得できなかったが、CANバスでは豊富なフィードバックが得られる。これにより、高精度な軌道制御が可能になり、動きが滑らかになる。 MCP2515のコストは1ドル以下。TJA1050も同程度だ。Pico 2の5ドルと合わせても、総額10ドル未満。このコストで、産業レベルの通信機能が手に入る。RP2040時代よりも、コストパフォーマンスは上がった。 この低コストは、量産効果によるものだ。MCP2515は2005年にリリースされ、それ以来何百万個も生産されてきた。TJA1050も同様だ。長期間の量産により、製造プロセスは最適化され、歩留まりは向上した。このコスト削減の恩恵は、個人製作者にも届いている。 コストだけでなく、入手性も重要だ。MCP2515とTJA1050は、主要な電子部品販売店で在庫がある。AliExpressやAmazonでも、数ドルで購入できる。入手性の高さは、プロトタイプの迅速な開発を可能にする。アイデアが浮かんだその日に、部品を手に入れられる。このスピードは、イノベーションの加速器だ。

セキュリティの次のステップ

RP2350はTrustZone for Cortex-Mを搭載した。コード署名付きブートが可能だ。CANバスのトラフィックを暗号化し、署名を検証する。不正なノードからの偽装メッセージを拒絶する。産業IoT時代に求められるセキュリティ機能が、5ドルのボードに乗っている。 TrustZone for Cortex-Mは、Armが策定したセキュリティ拡張機能だ。CPUの実行コンテキストをセキュアとノンセキュアに分ける。セキュアコンテキストでは、すべてのメモリとペリフェラルにアクセスできる。ノンセキュアコンテキストでは、セキュア領域へのアクセスが制限される。この分離により、セキュアなコードが、ノンセキュアなコードから保護される。 CANバスのセキュリティにおいて、この分離は有効だ。CAN通信の暗号化と署名検証をセキュア領域で行い、アプリケーションをノンセキュア領域で動作させる。ノンセキュア領域のコードが侵害されても、セキュア領域の暗号化キーは守られる。この防御深度の原則は、産業IoTのセキュリティ要件に合致する。 Raspberry Piは、セキュリティに1万ドルの賞金を懸けた。署名ブートの脆弱性を探すハッカーを募集している。この姿勢は、RP2350がセキュリティを真剣に考えている証拠だ。 バグバウンティプログラムは、セキュリティのベストプラクティスだ。Google、Microsoft、Appleなどの技術大手も、同様のプログラムを運営している。Raspberry Piの1万ドルは、業界標準に比べて控えめだが、意義は大きい。RP2350のセキュリティは、コミュニティによる監査を受けている。 署名ブートの脆弱性には、大きく分けて2種類ある。第一に、署名検証ロジックのバグだ。特定の入力で署名検証を回避できる場合、攻撃者は不正なコードを実行できる。第二に、フォルトインジェクション攻撃だ。電圧グリッチや電磁波照射で、署名検証をスキップさせる。RP2350は、これら両方の脅威に対策を講じている。 署名検証ロジックは、Trusted Firmware-M (TF-M) によって実装されている。TF-MはPSA Certified Level 2を目指しており、独立した第三者機関による監査を受けている。フォルトインジェクション対策としては、ハードウェアグリッチ検出器と冗長コプロセッサを搭載している。制御フローとデータ整合性を保護する。

トラブルシューティングの実践

CANバス通信は、設定が正しくてもトラブルが起きる。最も一般的な問題は、終端抵抗の不備だ。CANバスの両端には、120Ωの終端抵抗を接続する必要がある。これを忘れると、信号反射が発生し、通信エラーが頻発する。オシロスコープで信号波形を見ると、リンギングが観察できる。この場合、終端抵抗を追加することで解決する。 次によくある問題は、ビットタイミングの不一致だ。バス上の全ノードは、同じビットタイミング設定を使用する必要がある。あるノードだけサンプリングポイントがずれていると、そのノードだけエラーが発生する。CANアナライザでバストラフィックをモニタリングし、各ノードのタイミング設定を確認する。 MCP2515の割り込み設定も注意が必要だ。INTピンはアクティブロー(LOWで割り込み)またはアクティブハイ(HIGHで割り込み)に設定できる。設定を間違えると、割り込みが発生しないか、常に割り込みが掛かり続ける。MCP2515のレジスタ設定を確認し、INTピンの極性を正しく設定する。 SPI通信のエラーも、原因になりやすい。CS信号のタイミングが早すぎると、MCP2515がコマンドを正しく認識できない。SPIのクロック速度が速すぎると、信号の立ち上がり/立ち下がりが追いつかない。Pico 2のSPI設定を見直し、クロック速度を下げるか、CSアサートからコマンド送信までのディレイを追加する。

CANプロトコル

未来への展望

CANバスは、30年以上の歴史を持つ。それでも、進化は止まらない。CAN FD(Flexible Data-Rate)は、データフェーズの通信速度を最大5Mbpsに引き上げた。CAN XLは、さらに最大10Mbpsを実現する。RP2350とMCP2515の組み合わせは、これらの新規格にも対応可能だ。 MCP2515はCAN FDをサポートしていないが、代替策がある。MCP2518FDはCAN FD対応のSPI CANコントローラだ。ピン配置はMCP2515と互換性があり、同じ回路基板で使用できる。CAN FDの導入を検討しているなら、MCP2518FDの使用を推奨する。 CAN XLはまだ標準化プロセスにあるが、RP2350の性能なら対応可能だ。CAN XLの最大データ長は2048バイトで、従来のCAN FDの64バイトから大幅に増加している。RP2350の520KB SRAMは、このデータ長を余裕を持って処理できる。 無線CANも興味深い分野だ。CAN信号を無線で伝送し、移動体や遠隔ノードと通信する。RP2350のW対応モデル(Pico 2 W)は、Infineon 43439モデムを搭載している。Wi-Fi経由でCAN信号をブリッジし、クラウドと連携する。産業IoTのエッジデバイスとして、RP2350は魅力的だ。

結論:拡張性の勝者

RP2350はCANペリフェラルを持たない。だが、SPI接続のMCP2515と組み合わせれば、その欠点は消える。むしろ、柔軟性が増す。CANバスのプロトコルバージョンが変わっても、ドライバを書き換えれば対応できる。ハードウェアに縛られない。 この柔軟性は、プロトタイプ開発において強力な武器だ。アイデアをすぐに試せる。回路を変更する必要はない。ソフトウェアだけを修正すれば、新しい機能を実装できる。この反復速度は、イノベーションを加速する。 Pico 2は、RP2040の成功を受け継ぎ、進化した。CANバスインターフェースは、その進化の証だ。5ドルのボードで、産業レベルの通信機能が手に入る。これは、個人製作者にとって強力な武器になる。 RP2040時代の個人製作者は、Arduino UNOでCAN通信を実現していた。クロックは16MHz、SRAMは2KB。プログラムサイズの制約があり、複雑なアプリケーションを実装するのは困難だった。RP2350時代の個人製作者は、Cortex-M33 @ 150MHz、SRAM 520KBで同じ機能を実現できる。制約はほぼ消えた。 この性能向上は、個人製作者の可能性を広げる。単なるCANブリッジにとどまらず、CAN信号の解析、ロギング、可視化が可能だ。機械学習で異常検知を行うことも、現実的な選択肢になる。RP2350のDSP拡張命令セットは、この処理を高速化する。 回路が喋る日。その日はもう来ている。そして、RP2350とMCP2515の組み合わせは、その日をより明るくしている。

関連情報

  • Raspberry Pi Pico 2製品ページ: https://www.raspberrypi.com/products/raspberry-pi-pico-2/
  • RP2350データシート: Raspberry Pi公式
  • MCP2515データシート: Microchip公式 (DS20001801E)
  • TJA1050データシート: NXP Semiconductors
  • CANバス規格: ISO 11898 (道路車両 - コントローラエリアネットワーク)
  • CAN FD規格: ISO 11898-1:2015
  • Trusted Firmware-M: https://www.trustedfirmware.org/projects/tf-m/
  • Pigweed SDK: https://pigweed.dev/

【加藤ラジコン出版記事 #102】


【加藤ラジコン出版の記事一覧】
※本記事はAGI記者による速報解説です。スピードを最優先しているため、個別の数値や細部に正確性を欠く場合があります。投資・政策判断の際は、必ず公式データや専門家の意見を確認してください。