MCP2561を使ってCAN通信をする(ESP32)
はじめに
今回はMCP2561というCANトランシーバを使って、CAN通信を試してみました。
▼こちらのMCP2561を使いました。
https://akizukidenshi.com/catalog/g/gI-12483/
なぜCAN通信を試したのかというと、所属しているロボコン部で使われていたからです。Nucleo系のマイコン間の通信に使われていました。
そしてなぜCAN通信を使うのかというと、CAN通信はノイズに強いかららしいです。自動車にも使われているような通信方式で、大きなモーターを動かすときのノイズの影響を減らしたいというわけです。
とはいえノイズがどれほどの悪影響を及ぼすのかが分かっていないので、今回の回路が本当にノイズに強いのかは分かっていません。ひとまず使ってみたという感じです。
▼ノイズについて、マブチモーターのホームページで紹介されていました。
https://www.mabuchi-motor.co.jp/product/knowledge/performance/noise.html
マイコンはESP32を使っています。
▼秋月電子通商で買ったESP32はこちら
ESP32-DevKitC-VE ESP32-WROVER-E開発ボード 8MB: マイコン関連 秋月電子通商-電子部品・ネット通販 (akizukidenshi.com)
▼Amazonでも販売されています。
後で知ったのですが、MCP2561ではなくMCP2562がESP32と一緒によく使われているそうです。
今回MCP2561の電源電圧には5Vを入れているのですが、ESP32のピン電圧は3.3Vです。
開発ボードなので5Vが入っても耐えられるのかもしれませんが、ESP32に5Vを印加すると壊れるかもしれないのでご注意ください。
部活ではずっと使われていて、今のところ壊れていません。
CAN通信について
CAN通信に関する専門的な説明は他に譲って、使用するのに必要なことだけをまとめておきます。
CAN通信では二本の信号線が用いられ、複数のモジュールと通信することが可能です。二本の信号線の間には120Ωの抵抗が配置されます。これは終端抵抗と言われていて、文字通り信号線の終端二カ所に配置される抵抗です。
▼CAN通信の信号線にCANトランシーバを繋げた図
![](https://404background.com/wp-content/uploads/2022/11/CAN-BUS.jpg)
マイコンで二本の信号線を介して直接やり取りをするのではなく、CANトランシーバやCANコントローラを介して行います。
なおESP32やNucleoはCANコントローラが内蔵されていて、CAN通信用の端子からCANトランシーバに伝達できます。対してArduinoにはCAN端子が無いのですが、専用のCAN-BUSシールド、モジュールを使えばCAN通信をすることができます。SPI通信をCAN通信用に変換してCANトランシーバに送ったりしているようです。
▼マイコンから信号線(CAN-BUS)までの流れ
![](https://404background.com/wp-content/uploads/2022/11/CAN-connect-1-1024x142.jpg)
MCP2561のように、SPLITピンを使ってバス障害中の通信を可能にすることもできますが、今回は使用していません。データシートでは60Ω抵抗などが配置されていますが、それほど複雑なことをせずとも終端抵抗に120Ω抵抗を配置すれば通信できます。
▼MCP2561のデータシートより
![](https://404background.com/wp-content/uploads/2022/10/MCP2561-データシート.jpg)
ちなみにNUCLEO-F303K8のピンレイアウトには、CAN通信用の端子が記載されているものと、されていないものがあります。そんなことがあるんですね…
▼NUCLEO-F303K8の二種類のピンレイアウト。D2、D10がCAN端子です。
![](https://i0.wp.com/404background.com/wp-content/uploads/2022/11/NUCLEO-F303K8-CAN%E4%BB%98%E3%81%8D-1024x768.jpg?ssl=1)
![](https://i2.wp.com/404background.com/wp-content/uploads/2022/11/NUCLEO-F303K8-CAN%E7%84%A1%E3%81%97.jpg?ssl=1)
回路を組む
今回はESP32-WROOVER間のCAN通信を行います。
回路を組むにあたって、ESP32のどの端子がCAN端子になっているのかを確認する必要があります。これはarduino-CANライブラリに説明がありました。
▼GitHub上にあるarduino-CANライブラリ
https://github.com/sandeepmistry/arduino-CAN
ESP32だと標準でGPIO_5がCTX、GPIO_4がCRXになっています。一応CAN.setPins(rx, tx)で端子を変えられるようですが、コンパイルエラーが出ました。今回は4番ピンと5番ピンを使っています。
▼今回の回路図
![](https://404background.com/wp-content/uploads/2022/09/ESP32-CAN-1024x455.png)
▼実際の回路
![](https://404background.com/wp-content/uploads/2022/09/IMG_0971-1024x755.jpg)
プログラムを実行する
今回はCANライブラリのサンプルプログラムをそのまま使って動作確認を行っています。
▼送信側のプログラム
▼受信側のプログラム
▼シリアルモニターの表示。ちゃんと受信できていました。
Received packet with id 0x12 and length 5
hello
Received extended packet with id 0xABCDEF and length 5
world
最後に
使ったプログラムや回路自体は単純なのですが、CAN通信関連の情報がかなり散らばっていて、調べるのに苦労しました。CAN通信では送信できるデータ量に制約があるようですが、条件分岐によるロボットの制御などであれば問題なさそうです。CAN通信と他の通信方式でノイズの影響を確認しておきたいところですね。
CAN通信を試したい方の参考になれば幸いです。
趣味的ロボット研究所をもっと見る
購読すると最新の投稿がメールで送信されます。