
無線通信のプロトコルである「BLE」(Bluetooth Low Energy)を使ってiPhoneと電子回路を繋げて遊んでいます。
ここで「Koshian」ってBLE無線モジュールで遊んでいます。
このモジュールは金額が1,000円程度とお手軽なこと。小さなモジュールで回路の場所を圧迫ないこと。あとは、I/OやI2CやUART等の通信も備えており、それがiPhoneアプリから制御できるっていうのがこのモジュールの面白いところです。
去年の5月にOBD2のCAN通信の電子回路を自作しています(
Ver.1)。今回この「Koshian」BLEモジュールを使って「CAN通信」の回路を作り直してみました。それに加えて、「CAN通信」の内容が回覧できるiPhoneアプリも作ってみました。
去年の10月くらいからのんびりと回路の構想やアプリのライブラリを作ってきてようやく形になってきたのでご紹介…。
回路基本構成は、「Koshian」BLEモジュール。「PIC16F1705」マイコン。「MCP2515」CANコントローラー。「MCP2551」CANトランシーバーの4つの石から構成されています。
電源は「MCP2551」は5V。それ以外は3.3Vを供給しており2つの電源が共有しています。まずはブレッドボードで電子部品の仮組みをしてテストを行っています。
iPhoneアプリからCANコントローラへのデータ経路としては…
①iPhoneアプリで「Koshian」BLEモジュールに向けて命令を出す。ここの通信はBLE4.0の規格に準拠した通信で当然無線です。データはCANコントローラのコマンドそのものを送信するようにしています。
②「Koshian」は受信したデータを「PIC16F1705」マイコンへ送信する。通信はI2C通信でデータ送信されます。
③「PIC16F1705」マイコンは受信したデータをそのまま「MCP2515」CANコントローラへ送信する。ここの通信はSPI通信です。マイコンはI2Cで受信したデータをCANコントローラで読めるSPI通信に変換して横流ししているだけの仕事です。
④「MCP2515」CANコントローラは受信データを「MCP2551」CANトランシーバを通して車両へ情報のリクエストを送ります。
ってな感じで「BLE」「I2C」「SPI」「CAN」と通信の違った規格を経て車両情報を取得しています。
本当は「Koshian」BLEモジュールはSPIにも対応しており上記の②をすっ飛ばして「Koshian」と「MCP2515」を直接SPIで制御するのがマイコン分の1つの石がなくなりスマートになると当初は目論んでいました。
どうも「Koshian」の標準にあるSPIのライブラリの動きが「MCP2515」に合わないらしく通信が途切れる現象があって直接通信を断念してます。
「Koshian」のファームウェアを更新する手もありますが、そこまでしなくても…って気になって結局マイコンでの制御に逃げています。
この制御方法は前回作った
Ver.1.0の回路と比較して回路のデバッグやアプリの作り込みがかなりシンプルになります。
前回作成した回路は取得する車両情報は全て回路内のマイコン内でプログラミングされる構成で、マイコンがCAN通信を取り仕切っていました。
なので、何かバグがあると車に付いている回路内のマイコンを取ってプログラムを書き換えて修正後、テストを繰り返していました。今回の回路はマイコンはあくまでもデータの横流しのみのプログラムであり変更はありません。iPhoneアプリが全てを取り仕切っているのでデバッグも容易です。
実際にブレッドボードでテストを行い動きに問題はなかったのでとりあえずユニバーサル基板に配線して試作回路を作ってみました。
同時にiPhoneアプリを作成してみました。
「OBD2Viwer」って名前にしました。前回「Koshian」を
味見した時には、ネットで公開していたObjective-C用ライブラリをブリッジを使ってSwiftで使っていました。
今回はObjective-CのコードをSwiftにコードを全て書き換えてネイティブSwiftとなるようにライブラリを作り変えています(これに時間がかかった…w)。
「MCP2515」CANコントローラ用のライブラリも作成してiPhone側のアプリで全て変更できるように作り込みを行っています。
アプリの目的は、「MCP2515」内のレジスタの読込と書換。とCAN通信のデータ確認だけのソフトなので、UITableViewを使ったいたってシンプルな画面構成としています。
所有しているAudi用の中身をハックする目的で作ったので、ISO15765に準拠した11bit標準CAN IDでMode01のみに絞ったCAN通信ができます。
同じCAN通信でも、日本ではK-Lineやホンダなんかは拡張フォーマットを使っていたりと様々なフォーマットを使っているみたい。別で所有しているスクラム(エブリー)は繋げてみると何か通信はしているけど違う結果が返ってくる(まだよくみてないけど…)。
欧州系の車にはこのアプリを使える対応車両は多いのではないかな?(試してないけど…)
お暇ならアプリの動きをどうぞ…。
このように、「CAN ID」と「PID」をリクエストするだけで車両データのレスポンスが確認できるアプリにしています。
「CAN ID」はネットワークで言うところのIPアドレスみたいなイメージで、11bit標準CAN IDではECUの数に合わせ「0x7E0〜0x7E7」までのIDが指定できます。所有のAudi TTには「0x7E0」と「0x7E1」の2つのリクエストに対してレスポンスが返ってきます。
ちなみに、レスポンスされるCAN IDはリクエストのCAN-IDに8を足した「0x7E8〜0x7EF」が返ってきます。
「PID」はMode01ではデータにあらかじめIDが振り分けられており動画では、「エンジン回転数」は0x0C。「コントロール電圧」は0x42。「水温計」は0x05のデータを取得しています。
PIDには各々換算式がありそのレスポンスデータによって車両情報が換算できます。
巷では「ELM327」なる同様なモジュールが安価に売っていることは知っています。中国のネット通信で買えば5ドルとか…。こっちをハックした方が早いんじゃない?って突っ込まれそうですね。実際に今回のようにコントローラやマイコンやBLEモジュールを買うだけで1,500円はかかります…。
「でも!自作に意味あり!」って私は信じてます。
何はともあれ、この回路とiPhoneアプリのライブラリでこれからは簡単にOBD2メータが作れるようになると思います。まずは「Koshian」モジュールが使用に耐えられる性能を発揮するかを確認して暇があればメーターアプリを作ってみようと思います。
暇あるかな〜w やるかな〜w