Raspberry Pi Zero Wで車両のCAN情報を読み出す

2022/04/03

ラズパイ


2021年12月号のインターフェースに車両ネットワーク特集が記載されており、CAN通信について記載があったため、車両からCAN情報を読み出してみたくなりました。
今回は手持ちのラズパイ ZERO WとCAN HATを新たに購入して実装しました。

※車両のOBDカプラに接続するという行為は通信を妨害してしまい、故障が入ってしまう可能性もあります。(例えばCANのH-Lを短絡させて通信できなくしてしまったり、余計なCAN情報を流してしまったりなど)

作業する際は細心の注意を払ったうえで、自己責任でお願いします。

ハードウェアの準備

今回購入したOBDカプラ及びCAN HAT

今回下記のものを購入しました。
(今回は自分で作りたいから上記サイトで購入しましたが、ピンの最小購入単位が100個なので、ちょっと使うだけならamazonで完成品を買った方が安いです。。。多分下記のものを買えば大丈夫です。)


・ラズパイ用のCAN Hat



ラズパイにCAN HATを取り付ける

購入したカプラとCAN HATを使って下記のようなものを作りました。

OBDカプラのピンアサインについてですが、こちらのサイトを参考にさせていただきました。(OBD2(CAN)で自動車と通信(ハード編))
OBD2(CAN)で自動車と通信(ハード編)より引用

この画像はメスカプラから見た画像なので、今回のオスカプラを作るときは裏から見た時にどこにCAN_H/Lが来るかを考えて作りました。

また、今回はバッテリ電源を使わないため、4番ピンと6番ピンは配線していません。

補足ですが、最初配線をツイストせずに1.5 mくらいの線で作成したらCANモニタができなかったので、CANモニタが出来なかった人はツイスト線で短く作るといいかもしれません。


ラズパイ側の準備

今回購入したCAN Hatのユーザマニュアルがこちらに載っているため、マニュアルを参考に進めていきます。

ユーザーマニュアルのページにデモコードがあるのですが、デモコードを使うために事前準備が必要です。
こちらのページに事前にインストールする必要があるライブラリが載っているので、インストールしていきます。

今回はpython3を使用するので、下記ライブラリをインストールしました。
(ターミナル上で下記コマンドを入力します。)
sudo pip3 install numpy
sudo apt-get install libopenjp2-7

sudo apt install libtiff(マニュアルにはこれもインストールとあったが見当たらず)

sudo apt install libtiff5

sudo apt-get install libatlas-base-dev
sudo apt-get update
sudo apt-get install python3-pip
sudo pip3 install RPi.GPIO
sudo pip3 install smbus
sudo apt-get install python-pip
sudo pip install python-can
次にターミナルに
sudo vi /boot/config.txt
を入力してconfig.txtを次のように編集します。この文を追加することでラズパイのSPI端子をMCP2515(CANトランシーバ)との接続に割り当てられます。
(dtparam=spi=on と書かれている箇所の下に次のように追加します。)
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=12000000,interrupt=25,spimaxfrequency=2000000
ちなみにCAN HATのロット?によって水晶発振子の周波数が違うみたいで、8MHzの発信子を使っている場合は次の文章を追加します。
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25,spimaxfrequency=1000000

水晶発振子の周波数はCAN HATに載ってる下記の素子を見ればわかります。(画像は参考です。)
https://akizukidenshi.com/catalog/g/gP-01765/


設定ファイルの編集が終わったら再起動します。
sudo reboot 
再起動したら初期設定がうまくいってるか確認します。
dmesg | grep -i '\(can\|spi\)'
コマンドを実行した結果がこちらになります。

spi ** succesfullyと出ているため問題なくインストールできております。
(インストールがうまくいってない場合、Cannot initialize MCP2515 ** というメッセージが出るみたいです。)

CAN通信ができるか確認してみる。

実際に車両のOBDカプラに接続する前にMCP2515との接続確認をします。
こちらのサイトを参考にしました。

$ sudo ip link set can0 type can bitrate 500000 loopback on
$ sudo ifconfig can0

その後、以下のコマンドを実行して、受信したコマンドを表示します。

$ candump can0

次に、もう一つコンソールを立ち上げ、以下のコマンドを実行します。

$ cansend can0 123#1122334455667788

dumpしたコンソールに

pi@raspberrypi:~ $ candump can0
  can0  123   [8]  11 22 33 44 55 66 77 88
  can0  123   [8]  11 22 33 44 55 66 77 88
  can0  123   [8]  11 22 33 44 55 66 77 88
  can0  123   [8]  11 22 33 44 55 66 77 88

が表示されたらMCP2515との接続は確認できています。



送信側のコンソール画面
**@raspberrypi:~ $ cansend can0 123#1122334455667788

受信側のコンソール画面
**@raspberrypi:~ $ sudo ip link set can0 type can bitrate 500000 loopback on
**@raspberrypi:~ $ sudo ifconfig can0 up
**@raspberrypi:~ $ candump can0
  can0  123   [8]  11 22 33 44 55 66 77 88


引用元のサイトにも記載がありましたが、candumpが動かない場合はcan0デバイスがダウンしているため、
$ sudo ifconfig can0 up
も実行してます。

車両のOBDカプラからCAN情報を読み出してみる

CAN HATのマニュアルにはデモコードがあるので、まずはそれを実行してみます。
)

先ほど作ったハードを車両のOBDカプラに接続してデモコードを実行したところ下記のような結果になりました。(車両のOBDカプラは運転席の足元あたりにあることが多いですが、メーカ車種によって異なるため、場所が分からなければ調べてください)
デモコード実行結果

ID:0039というものだけが1つだけモニタ出来ました。デモコードの中身をきちんと読んでませんが少し改良が必要かもしれません。次回改良しようと思います。
(CANが読み出せないという方は車両がIGONしてないか、最初の方に書いた通り配線が長すぎて正しく信号を伝送できてないかもしれません。)
(2021/11/04 追記)
デモコードの中身を見たら1つのIDしか表示しないコードとなってました。
少し改良すればずっとモニタ出来るようになるので、次回の記事で紹介したいと思います。


次に下記参考サイトに記載されていた方法を試しました。
実際に車両のOBD2コネクタに接続して、以下のコマンドを実行すると、車両に流れるCAN信号を受信することができます。
信号が流れていない場合は、IGをONにしてください。

$ sudo ip link set can0 type can bitrate 500000
$ candump can0
実行した結果次のようになりました。(どんなデータが流れているか不明なため、データ部には意図的にモザイクをかけてます。)
きちんと読み出しができてそうです。

(補足)ラズパイとPCの接続について

今まで家のネットワーク経由でラズパイにアクセスしていたのですが、車両の中はネットワークが届かないため、接続方法を調べるのに苦労してしまいました。。。
調べてみるとイーサネットケーブルを使う方法やシリアル通信を使う方法などがあったのですが、今回はノートPCをアクセスポイントとする方法を使って接続しました。(下記サイトを参考にしました。)

(2022/04/05追記)
外部ネットワークから接続する方法については別途記事を作成しました。
外出先などからリモートでアクセスしたい場合はこちらも参照お願いします。

(補足)CAN情報を読み出す方法について

今回は直接OBDカプラに流れているCANを読み出しましたが、他にも診断機コマンドを使うという方法があります。(詳しくは下記サイトなどを参考にしてください。)

今回私は直接CANを読み出しましたが、流れているCANの情報はメーカによって異なります。例えばID158はホンダだと○○という情報だが、トヨタだと××という情報になるなど。
診断機コマンドで読み出せる情報はメーカーに寄らず、共通の仕様なので診断機コマンドを使った方が応用が利きやすいです。

また、私の車は古いのでOBDカプラに接続して色々な情報を見ることが出来ますが、ゲートウェイというCAN転送機能を使用したネットワーク構成を取ってる車両もあるみたいです。(もしかしたら将来的な話で現在流通している車両にはないのかもしれないですが。。。)

推定にはなりますが、こういった車両の場合外部に余計な情報を流さないようにすると思うので直接CANの情報を読み出すことが出来ず、診断機コマンドじゃないと情報が読み出せないかもしれません。

(補足)python-canのバージョンについて

2022/06/28時点でpython-canの最新バージョンは4.0.0なのですが、この後の記事以降のコードは3.3.4で実装されています。公式ドキュメントSocketCANを確認するとsocketcan_ctypesというのが最新バージョンで廃止されているみたいです。
後々修正予定ですが、私のコードにはsocketcan_ctypeを使用しているため、実行時にエラーが発生します。

もしエラーが発生した場合はバージョン違いによるものが考えられます。



まとめ

今回はラズパイ Zero WとCAN HATを使って車両のOBDカプラからCANを読み出しました。
次回はCANのデータを解析し、アクセル開度などのデータを取得していきたいです。






自己紹介

はじめまして 社会人になってからバイクやプログラミングなどを始めました。 プログラミングや整備の記事を書いていますが、独学なので間違った情報が多いかもしれません。 間違っている情報や改善点がありましたらコメントしていただけると幸いです。

X(旧Twitter)

フォローお願いします!

ラベル

ブログ アーカイブ

QooQ