CAN BUSはなんですか?ArduinoでCAN BUSモジュールを使いましょう!

CAN BUSを聞いたことがあったけど、それを理解していない?この記事が次のような方面でCAN BUSについて紹介します!

  • CAN BUSはなんですか?
    • CAN BUS配線原理図
    • CAN BUSプロトコルの速度と範囲
    • CAN BUSメッセージ
  • CAN BUSプロトコルを使う原因
  • CAN BUS vs OBD2
  • SeeedのCAN BUS製品
  • ArduinoでCAN BUSモジュールを使いましょう
  • CAN BUSを利用してできること

CAN BUSはなんですか?

CAN-BUS シールドV2, シリアル CAN-BUSモジュール,
  • CAN はコントローラーエリアネットワークの代表として、 ホストコンピューターなしで自動車の中でマイクロコントローラーとデバイスが相互に通信できるように使用されます。
    それで、制御とデータ取得ができます。それらのデバイスも電子制御装置(ECU)と呼ばれて、車両の全ての部品間の通信を可能にさせます。
    • 自動車CAN BUSシステム中のECUはエネルギー制御装置、エアバッグ、オーディオシステム等のような機能を持っています。 現代の車で最大70個のECUを見つけることができます。
    • 簡単に言えば、 CAN BUSは車両の中で連結されたECUの組を含んでいます。それらのECUが 放送に基づいて互いと通信します。各ECUは各放送を傍受するが、それに反応するかどうかは個々に決定します。
  • CANは工業と自動車アプリケーションのために設計されたシリアル通信バスです。たとえば、それらが車両、農業用具、工業環境等に見られます。
    • どうしてUART、SPIおよび I2Cなどほかの通信周辺機器を使わないでしょうか。
    • UART、SPIおよび I2Cなどのような通信プロトコルと比べて、CAN BUS通信プロトコルは自動車のスロットル位置のような重要なデータを送るのに用いられる標準的な自動車通信プロトコルなので、それを使用するの信頼性がより高いです。 ミスコミュニケーションやデータの損失が起こったら、深刻な故障を引き起こす可能性もあります。
Ref: Volkspage
  • CAN BUSプロトコルがなかったら、自動車の電子モジュールが直接、ポイントツーポイントのアナログ信号線を使用して、互いに通信しなければならない。それで、 各モジュールが通信のために一つの直接のワイヤーを必要としています。したがって、単なる時間をかかるだけではなくて、上の写真のように、電線が多すぎてめちゃくちゃになる恐れもあります。
Ref: Volkspage
  • CAN BUSがあれば、上の写真のように、 ネットワークの各ノードをメインダッシュボードに接続する単一の多重ワイヤーを用いて、電子デバイスを相互に通信可能にすることで、それらのすべての配線の必要をなくします。
    • 多重ワイヤおよびアーキテクチャは、単一のワイヤで信号を統合して、 ネットワーク全体に伝送することを可能にさせます。それと同時に、車両の各電子モジュールがセンサーやアクチュエーターからデータを受け取ることを確保します。 それで、ユーザーが2線バスを通して、自動車の中の任意の数のECUを接続することができます。
    • また、ソフトウェアを介していくつかの機能を追加することもできます。さらに、 ECUが別のECUからデータを使うことができて、 複数のデバイスに同じセンサーをインストールする必要性をなくします。
  • このCAN BUSシステムを用いて、制御装置のような電子モジュールまたは車輪角度センサーなどのインテリジェントセンサーをネットワーク化させることができます。

CAN BUS配線原理図

  • このCAN BUSプロトコルが上記のように二つの双方向データ伝送のワイヤーからなります。それらは
    • CAN_H (CAN高)
    • CAN_L (CAN低)
  • これらのワイヤーは差動線として機能しています。つまり、 0または1のいずれかのCAN信号が2つの線の間の電位差によって表されます。
    • たとえば、もしこの差が正で、ある最小電圧より大きいの場合、1にイコールします。もしこの差が負なら、0にイコールします。
  • 上の写真の通り、CAN端末にとって、シングルの120 Ohmが常にCANネットワークの二つの端に使用されています。

CAN BUSプロトコルのスピードと範囲

  • CAN BUSプロトコルの通信スピードの範囲は10kpbs から1Mbpsまでです。
    • このスピードは使われるワイヤーの長さによって変わります。短くなればなるほど通信スピードが速くなります。
    • たとえば、 長さが40メートルの場合、スピードが1Mbpsです。長さが1000メートルなら、そのスピードが50kpbsになります。
  • ノード距離は一般的0.3 メートル/ 1フート以下にします。

CAN メッセジー

  • CAN BUSプロトコルがどのように動作するのを完全に理解するには、ネットワークに送られたフレームを見てみましょう。
  • CANメッセージは多くのセグメントを含んでいます。 しかし、2つの主なセグメントはCAN BUS でメッセージを送るのを助ける識別子とデータとなります。
  • この識別子はCANネットワークでCANデバイスを識別することに使用されています。そして、データは1つのデバイスから別のデバイスへ送られなければならないセンサーまたは制御データとなります。
  • この識別子とCAN IDの長さは使用されるCANプロトコルの型に応じて、11または29ビットです。
    • 標準的CAN = 11 bit
    • 拡張したCAN = 29 CAN
  • データは0から8バイトまでです。

CAN BUSプロトコルを使う原因

CAN BUSプロトコルを使用するのは次のようにいくつかの優越点と利点があります:

低コスト

  • ECUはシングルCANインターフェースを介して通信します。直接のアナログ信号線などと比べて、エラーや重量およびコストなどを減らします。
  • アナログ、デジタル信号と共有媒体上での伝送を統合した多重線を備えて、必要とするワイヤーの数を減らしました。

集中型

  • CAN BUSがネットワークに接続されている電子デバイスの集中型なコントロールをサポートしているから、 これが全てのECUで中央エラー診断と設定することができます。
  • エラー処理もCANプロトコルに組み込まれています。それで、ノードが送信中のエラーをチェックすると同時に自身のエラーカウンターを維持することができます。たとえば、このプロトコルがビットエラーやACKエラー、フォームエラー、CRCエラーなどの異なるエラー検出機能を支持しています。

柔軟性がある

  • CANに接続する全てのECUがすべての送信メッセージを受信することができるので、それが関連しているかどうかやそれに応じて動作しているかどうかを決定することができます。
  • このCAN BUSプロトコルもメッセージベースの通信プロトコルです。中には、バスのノードが識別情報を持ちません。
  • 上記の特徴を持って、 簡単にノードを追加または削除および変更することができます。
  • 初心者にとって、 重要なプログラミングオーバーヘッドなしにCAN BUSネットワークで新たな電子デバイスを統合することが簡単になります。

ロバスト

  • 通信プロトコルを選ぶとき、耐久性と信頼性が非常に重要な要素です。自分の通信プロトコルが自己持続できて、維持しなくても長い間で使用できることを望んでいます。
  • CAN BUSなら、このシステムが電気擾乱と電磁干渉に対してロバストなので、自動車にとって理想的な選択になります。

効率的

  • CANメッセージフレームはIDによって優先順位を付けます。その中の最優先事項はバスアクセスを得るが、フレームは中断されません。
  • フラッシュプログラミングのために、より少なくて簡単な配線で時間を節約することができます。

CAN BUS vs OBD2

CAN BUSと言えば、 必ずOBD2のようなそれに関するほかの「より高い層プロトコル」を言及します。 それらは同じではありません!

OBD-II CAN Bus GPS開発キット
  • CANの標準には、8バイトを超えるメッセージの扱う方法や生データをデコードする方法を指定していません。そのため、与えられたネットワークのECUの間のデータの通信方式をさらに指定する標準化されたプロトコルのセットは開発されました。OBD2はその中の一つです。
  • オンボード診断用のOBDは、車に組み込まれた自己診断システムです。OBD2は(多くの)異なるバスシステムの一つを使って、診断データを車からまたは車に転送することができます。
  • 一つ簡単なアナロジーを使って、その二つを区別することができます。 OBD2は話す言語のようで、CANは電話のような通信デバイスに当たります。しかし、その場合、話す内容は車両とその健康状況です。
  • OBD2についてもっと知りたいなら、 OBDのWikiページをご参照ください。

Seeed CAN BUSの製品

CAN-BUSシールドV2 

  • このCAN-BUSシールドは SPIインターフェース付けのMCP2515CAN BusコントローラーとMCP2551 CANトラシーバーを採用して、Arduino/SeeeduinoCAN-BUS機能を与えます。 OBD-II変換ケーブルを追加し、OBD-IIライブラリをインポートすることによって、オンボード診断デバイスまたはデータロガーを構築することができるようになります。
  • CAN BUSシールドと車の交流をより便利にさせるために、これは一つのSPIインターフェース付けのMCP2515 CAN-BUSコントローラーとMCP2551 CANトラシーバーを備えて、Arduino/SeeeduinoにCAN-BUS機能を与えます。
  • 製品特徴:
    • 1 Mb/sに達する高速なCAN V2.0B実行速度
    • 産業標準である9 pin sub-D コネクタ
    • 選択可能なOBD-IIとCAN スタンダードピンアウト
    • 変更可能なチップ選択ピン、TFカードスロット用のCS pin、INT pin
    • CAN_HとCAN_Lを簡単に接続できるネジ留め式端子
    • Arduino Uno ピン ヘッダー 
    • Grove コネクタが2つ (I2C とUART)
    • 10 MHzに達するSPI インタフェース  
    • スタンダード (11 bit)と拡張された (29 bit) データおよびリモートフレーム
    • 優先メッセージストレージを備えた2つの受信バッファ 

CAN BUSとArduinoの入門

必要な部品

手順

Step 1:ハードウェアを接続する

  • まず、各 CAN-BUSシールドをSeeeduino V4.2に接続して、 次のように二つのジャンパーワイヤーを介して二つのCAN-BUSシールドを接続します。(CAN_H to CAN_H and CAN_L to CAN_L)

Step 2: ソフトウェアを設定する

  • ここでCAN BUS用のライブラリーをダウンロードして、ダウンロード完了した後そのライブラリーをArduino IDEにインストールします。
  • Arduinoライブラリーのインストール方法が知らない場合、 こちらの説明をご参照ください。
  • 一つのノードは (ノードの意味はSeeeduino +CAN_BUSシールドです) マスターとして機能して、もう一つはスレーブとして機能します。マスターは常にスレーブにデータを伝送します。
  • send サンプルを開いて(File > Examples > CAN_BUS_Shield-master >send)次のようにマスターにアップロードします:
  • その後、 receive_checkサンプルを開いて(File > Examples > CAN_BUS_Shield-master > receive_check) 、スレーブにアップロードします。

Step 3: 結果を見る

  • Arduino IDE(スレーブ)のシリアルモニターを開いて、マスターからのデータが見えます。それは以下のようになります:

Step 4: APIs (アプリケーションプログラムインターフェース)

このソフトウェアのAPIsのために、次のことができる:

ボーレートを設定する
  • この関数はCAN Busシステムのボーレートの初期化に使用されます。使用可能なボーレートは次のとおりです。
#define CAN_5KBPS    1
#define CAN_10KBPS   2
#define CAN_20KBPS   3
#define CAN_25KBPS   4
#define CAN_31K25BPS 5
#define CAN_33KBPS   6
#define CAN_40KBPS   7
#define CAN_50KBPS   8
#define CAN_80KBPS   9
#define CAN_83K3BPS  10
#define CAN_95KBPS   11
#define CAN_100KBPS  12
#define CAN_125KBPS  13
#define CAN_200KBPS  14
#define CAN_250KBPS  15
#define CAN_500KBPS  16
#define CAN_666kbps  17
#define CAN_1000KBPS 18
受信マスクとフィルターを設定する
  • 目標デバイスからデータを得ることを保証するコントローラーチップには2つの受信マスクレジスターと5つのフィルターレジスターがあります。それらは多数のノードからなる大規模ネットワークにおいて特に役立ちます。
  • これらのマスクとフィルターレジスターを利用するために2つの関数を提供します。それらは:

マスク

init_Mask(unsigned char num, unsigned char ext, unsigned char ulData);

フィルター

init_Filt(unsigned char num, unsigned char ext, unsigned char ulData);
  • numは使用するレジスターを表します。マスクのために0または1を記入して、フィルターのために0から5までを記入します。
  • extはフレームの状態を表します。0はそれが標準的なフレーム用のマスクまたはフィルターを意味します。1はそれが拡張したフレーム用のを表します。
  • ulDataはフィルタのマスクの内容を表します。
受信をチェックする
  • MCP2515は ソフトウェアは受信されたフレームをチェック するポーリングモードで動作できます。または、追加されたピンでフレームが受信されたかまたは送信完了したことという信号を送ります。
  • 次の関数を使って受信されたフレームをポールします。
INT8U MCP_CAN::checkReceive(void);

この関数は、フレームが到着した場合に1に返して、何も到着しなければ0になります。

CAN IDの取得
  • データが到着した場合、次の関数を使って「送る」ノードのCAN ID を取得することができます。
INT32U MCP_CAN::getCanId(void)
データを送る
CAN.sendMsgBuf(INT8U id, INT8U ext, INT8U len, data_buf);

これはバスでデータを送る関数です。その中には :

  • idはデータがどこから送られることを表示します。
  • extはフレームの状態を表示します。‘0’ は標準的なフレームを意味して、 ‘1’ は拡張されたフレームを表します。
  • lenはフレームの長さを表示します。
  • data_bufはこのメッセージの内容にあたります。

たとえば、 「送る」 の例には、次のことがある:

unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};
CAN.sendMsgBuf(0x00, 0, 8, stmp); //send out the message 'stmp' to the bus and tell other devices this is a standard frame from 0x00.
データを受け取る
  • 次の関数は「受信」ノードでデータを受け取ることに使用されます。
CAN.readMsgBuf(unsigned char len, unsigned char buf);

マスクとフィルターが設定されていた場合、この関数はマスクとフィルターの要求を満たすフレームだけを得ます。

  • lenはデータの長さを表示します。
  • bufはデータを保存する場所を表します。
新しいボーレートを生成する

次のように、頻繁に使用される数多くのボーレートを提供します。

#define CAN_5KBPS    1
#define CAN_10KBPS   2
#define CAN_20KBPS   3
#define CAN_25KBPS   4
#define CAN_31KBPS   5
#define CAN_33KBPS   6
#define CAN_40KBPS   7
#define CAN_50KBPS   8
#define CAN_80KBPS   9
#define CAN_83KBPS   10
#define CAN_95KBPS   11
#define CAN_100KBPS  12
#define CAN_125KBPS  13
#define CAN_200KBPS  14
#define CAN_250KBPS  15
#define CAN_500KBPS  16
#define CAN_666KBPS  17
#define CAN_1000KBPS 18

しかし、自分が求めたいレートを見つからない可能性もあります。ここでは、必要なボーレートを計算するためのソフトウェアを提供します。

 こちらをクリックして、そのソフトウェアをダウンロードします。それは中国語版ですが、使用するのは非常に簡単です。これは簡単に使用するために翻訳されたインターフェースです。

  • ソフトウェアを開いて、ボーレートをほしいのを設定して、いくつかの簡単な設定をして、計算をクリックします。
  • そして、cfg1、 cfg2と cfg3などのデータを得ます。
  • ライブラリーにいくつかのデータを追加する必要があります。
  • mcp_can_dfs.hを開いて、およそライン 272で次のコードを追加します。
#define MCP_16MHz_xxxkBPS_CFG1 (cfg1)    // xxx is the baud rate you need
#define MCP_16MHz_xxxkBPS_CFG2 (cfg2)
#define MCP_16MHz_xxxkBPS_CFG3 (cfg2)
  • 続いて、ライン 390のところで次のコードを追加します:
#define CAN_xxxKBPS NUM       // xxx is the baudrate you need, and NUM is a number, you need to get a different from the other rates.
  • mcp_can.cppを開いて、関数 mcp2515_configRate(およそライン190)に移動して、次のコードを追加します:
case (CAN_xxxKBPS):
    cfg1 = MCP_16MHz_xxxkBPS_CFG1;
    cfg2 = MCP_16MHz_xxxkBPS_CFG2;
    cfg3 = MCP_16MHz_xxxkBPS_CFG3;
    break;

それでは、必要とするボーレートを使うことができますT!

CAN BUSシードを使って、 ArduinoでCAN BUSをインターフェースする方法はもう勉強しました。ここでは、いくつかのCAN BUS入門プロジェクトも紹介しましょう!

CAN BUSプロジェクトアイディア

Volkswagen CAN BUS ゲーム

PCで本当のダッシュボードを持って、車/トラックシミュレーターをプレイすることを想像したことがありませんか。このCAN BUSシールドがあれば、それが現実になります。このプロジェクトには、 Arduino Uno とSeeed CAN Busシールドを使って、 CAN Busを介してVW Polo 6Rダッシュボードを制御することを試します。

必要な部品

興味があれば、 SeeedStudio Communityで詳細な手順をご参照ください!

車をハッキングする

Ref: mviljoen2

現代の車は、100万線が車の様々なデバイスからバッテリーに前後に実行するの代わりに、CAN-BUSコントローラーエリアネットワークを備えています。それで、よりインテリジェントシステムが利用できます。各ノード(windowsまたは電子ドアロックを制御するIEスイッチポッド)から、CANを通してメッセージを放送します。TIPMが有効なメッセージを検出すると、それはドアをロックし、ライトのスイッチするなどのようなそれに応じて反応をします。 CAN BUSシールドを持って、自分の車をハッキングすることもできます。

必要な部品

興味があれば、mvilijoen2 on Instructablesで詳細な手順をご参照ください。

まとめ

これらのCAN BUSプロトコルの基本的な知識を持って、車のデータ/メッセージを分析することもできるし、車をハッキングすることもできます。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です