ESP32でCAN通信をする
ここ5年くらいMaker界隈を賑わせているマイコンESP32ですが,内部にSJA1000というCANコントローラを持っており,CANトランシーバーICを外付けしてあげることでCAN通信ができることを知りました.
そこで今回は,ESP32にMCP2562というCANトランシーバーICを外付けしてCANの信号を吐かせ,ロジアナとオシロで確認するところまでやってみました.
CANとは
Controller Area Networkの略で,車載用途によく使われていらしい.差動信号で通信させるためノイズに強く,信頼性が高いらしい.
細かい仕様は他サイトに譲ります.
ESP32とMCP2562の配線
ESP32とMCP2562は下図の用に配線しました.
この図には描かれていませんが,実際にはノイズ低減用のパスコンを5V・3.3VとGNDの間に入れました.
実際にブレッドボード上に配線したものが下図になります.
プログラム
今回,ESP32に書き込むファームウェアはArduinoで開発しました.
Arduinoには標準でCANのライブラリが用意されていないため,自分で導入する必要があります.
今回はこちらのライブラリを用いました.
github.com
このライブラリのexamples内にあるCANSender.inoをベースに,以下のプログラムを作成しました.
これをESP32に書き込み,実行しました.
デコードしてみた
せっかくなので,どのような通信が行われているのかをオシロで見てみることにしました.
おおー、差動になっとる。 pic.twitter.com/qx2AW1w4ET
— しろいし🔔 (@siroyanTech) 2021年1月27日
これはCAN_HとCAN_Lの波形を見ています.きちんと差動信号になっていますね.
こちらのオシロには,CANのデコード機能がついていないため,実際に通信の内容を見ることはできません.
そこで,こちらのロジアナとSigrokというオープンソースのソフトウェアを使って見てみることにしました.実際に取得した波形がこちらです.
上が実際の波形で,下がその波形を基にCANをデコードしたものになります.
「HELLO」の文字列がASCIIコードになって送信されていることが分かりました.やったー!
最後に
今回は,ESP32とMCP2562というCANトランシーバーを使ってCAN通信をさせ,実際に通信内容をデコードすることができました.
ESP32はこの他にも様々な機能が存在します.300円のマイコンなのに恐るべし.