Help us understand the problem. What is going on with this article?

Raspberry PiでOBD-II (CAN)の情報を取得するための基板を自作する

車の自己診断情報から、エンジン回転数や燃費情報などをRaspberry Piを使って取得する方法を紹介します

ここでは、その前段階として車のOBD-II端子とRaspberry PiのSPIインタフェースを繋ぐためのCAN-SPI変換基板と、OBD-IIケーブルを作るための手順を書いています

手軽に済ますにはELM327を使うのが良いと思いますが、以下のような懸念が考えられます

  • 偽物が出回っている
  • 電波を使うのでセキュリティーホールになり得る

せっかく買ったのに使えなかったという話も聞きますが、中にはエンジンや各種装置の警告灯が付くようになってディーラーに行く羽目になったという痛々しい体験談もあるようです。また、(運よく?)使えたとしても、見ず知らずの誰かが勝手にペアリングして悪さをすることも考えられます

その点、自作すれば

  • チップが偽物である可能性は低い
  • ケーブル接続なのでセキュリティー面では安心

なにより、博打に掛けるより自分でやった方が楽しいでしょう!

前提

ここで作成する基板は車のOBD-II端子のCANとRaspberry PiのSPI端子を繋ぐための物です。そのため、車両側にCANのインタフェースがあることが必要となります。ほとんどの最近の車(2001年以降)にはOBD-II端子は付いていますが、中には古い規格のK-LINEしか付いていなかったり、TOYOTA CANのように独自の形式を使ったりする場合もあります

当方で所有している車はマツダ アテンザ(LDA-GJ2FP)ですので、標準的なCANとなっていますが、標準的なCANではない場合はここで紹介する手順は使えないかもしれません。接続する車両がどうなっているかはGoogle等で検索してご確認ください

材料

基板を作るための材料です

  • CAN Controller MCP2515 ×1
  • CAN Transceiver MCP2551 ×1
  • OBD-II コネクタ ×1
  • 水晶発振子 16MHz ×1
  • セラミックコンデンサ 15pF ×2 (※)
  • セラミックコンデンサ 0.1μF ×2
  • 抵抗 10kΩ ×3
  • ユニバーサル基板 ×1

※ 参考にしたサイトでは16pFと書かれていましたが、売っていなかったので近い容量の15pFにしました

MCP2515とMCP2551は、アールエスコンポーネンツから購入しました。色々種類はありますが、ユニバーサル基板に実装するのでPDIPのものを選びます。注文の数量単位に注意してください。

その他の材料は、一般的な電子部品の店で用意できるかと思います

回路図

image

汚い手書きですみません(笑

見苦しいようでしたら、ネットに探せば沢山転がってますので、そちらを参考にしてください

実装例

回路図の通りに配線して、作ったのが以下になります

image

image

ケーブルも作り、Raspberry Piと接続します

image

ケーブルは何か補強手段を考えなければなりません。

OBD-II端子の6番ピンにCAN-H、14番ピンにCAN-Lを繋ぎます

Raspberry Pi の設定

/boot/config.txt に以下の設定を追加します

/boot/config.txt
dtparam=spi=on
dtoverlay=mcp2515-can0-overlay,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay

config.txtを変更したら、Raspberry Piを再起動します

参考: パラメータの意味

oscillatorに水晶発振子の周波数、interruptに割込み用のGPIOピンを指定します。なお、MCP2515のCSをRaspberry PiのCE1(26番)に繋いだ場合はcan0をcan1に変更します

以下のREADMEより
https://github.com/raspberrypi/firmware/tree/master/boot/overlays

Name:   mcp2515-can0
Info:   Configures the MCP2515 CAN controller
Load:   dtoverlay=mcp2515-can0,<param>=<val>
Params: oscillator               Clock frequency for the CAN controller (Hz)

        spimaxfrequency          Maximum SPI frequence (Hz)

        interrupt                GPIO for interrupt signal

再起動後にdmesgでspiと、CANコントローラーのメッセージが出ていることを確認します

$ dmesg | egrep -i "can|spi"
[    4.395870] spi spi0.0: setting up native-CS0 as GPIO 8
[    4.410355] spi spi0.1: setting up native-CS1 as GPIO 7
[    4.575067] CAN device driver interface
[   43.732558] IPv6: ADDRCONF(NETDEV_CHANGE): can0: link becomes ready
[  250.245517] can: controller area network core (rev 20120528 abi 9)
[  250.265265] can: raw protocol (rev 20120528)

上のメッセージが見つからない場合は、config.txtを再確認してください

lsmodを実行するとCAN関連とmcp251xのドライバが読み込まれていることがわかります

$ lsmod
Module                  Size  Used by
can_raw                 7204  1
can                    27599  1 can_raw
ipv6                  343236  36
fuse                   82598  1
i2c_dev                 6108  0
8192cu                528485  0
mcp251x                 8668  0
can_dev                 9607  1 mcp251x
i2c_bcm2708             5062  0
bcm2835_rng             1824  0
spi_bcm2835             7216  0
bcm2835_gpiomem         3023  0
uio_pdrv_genirq         2986  0
uio                     8228  1 uio_pdrv_genirq

補足: カーネルパッチについて

別のサイトでは、カーネルにパッチを当てて再構築する手順を紹介しているものがありますが、新しいLinuxではその手順は不要になっています。パッチも古いもので最近のLinux 4.xでは当てられないと思います

カーネルのバージョンを確認するには、unameコマンドを使います

実行例

# uname -r
4.1.15-v7+

can-utilの用意

https://github.com/linux-can/can-utils

[Clone or Download] → [Download ZIP]をクリックして、ソースコード一式をダウンロードします

ダウンロードしたZIPファイルを解凍します

$ unzip can-utils-master.zip

ソースコードをコンパイルします

$ ./autogen.sh 
$ ./configure
$ make

CANインタフェースの動作確認

CANインタフェースをループバックモードでリンクアップにします

# ip link set can0 type can bitrate 500000 loopback on
# ip link set can0 up

ターミナルを2つ用意し、can-utilsのディレクトリに入ります

$ cd can-utils-master

1つのターミナルでcandumpを実行し、もう1つのターミナルでcansendを実行します

■ターミナル1

$ ./candump any,0:0,#FFFFFFFF

■ターミナル2

$ ./cansend can0 123#1234ABCD

candumpを実行したターミナルで、以下のようにメッセージが表示されます

$ ./candump any,0:0,#FFFFFFFF 
  can0  123   [4]  12 34 AB CD
  can0  123   [4]  12 34 AB CD

車に繋いでみる

車のOBD-II端子に自作したケーブルを繋いで、candumpを実行してみます

# ip link set can0 type can bitrate 500000
# ip link set can0 up
# ./can-utils-master/candump any,0:0,#FFFFFFFF

上手くいけば、以下のように車から受信したデータが流れます

image

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした