Skip to main content

CAN-BUSシールド V1.2

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

CAN-BUSは、長距離通信、適度な通信速度、高い信頼性のため、一般的な産業用バスとして使用されています。これは、現代の工作機械、例えば自動車診断バスなどでよく見られます。

このCAN-BUSシールドは、MCP2515 CANバスコントローラー(SPIインターフェース付き)とMCP2551 CANトランシーバーを採用しており、Arduino/SeeeduinoにCAN-BUS機能を提供します。OBD-II変換ケーブルを追加し、OBD-IIライブラリをインポートすることで、車載診断デバイスやデータロガーを構築する準備が整います。

バージョン

このドキュメントは以下の製品バージョンに適用されます:

バージョンリリース日購入方法
CAN BUSシールド V1.02012年10月14日
CAN BUSシールド V1.12013年8月10日
CAN BUSシールド V1.22015年1月5日
CAN BUSシールド V2.02017年8月1日

CAN BUSシールド V1.2の新機能

  • PCBAの裏面にパッドを追加
  • 終端抵抗を120オームに変更

代替選択肢

もしプロジェクトがスペース制限を受けており、CAN-BUS以外の機能が不要な場合は、Arduino互換でよりコンパクトかつコスト効率の高いGrove CAN-BUSモジュールがあります。詳細はこちらをご覧ください。

このシールドを車に接続したい場合

車のデータを読み取ったり制御したりしたい場合は、OBD>DB9ケーブルが利用可能です。このケーブルを使用すると、OBDコネクタとDB9コネクタへの接続が簡単になります。このケーブルは、OBDコネクタを備えたすべてのデバイスで動作します。電源スイッチを追加することで、満足感のあるクリック感が得られます。

USB-CANアナライザー

CANバスをデバッグするためのCANバスアナライザーが必要な場合は、このUSB-CANアナライザーをお勧めします。

特徴


  • CAN V2.0Bを実装し、最大1 Mb/sの速度をサポート
  • SPIインターフェースの速度は最大10 MHz
  • 標準(11ビット)および拡張(29ビット)データおよびリモートフレーム
  • 優先順位付きメッセージストレージを備えた2つの受信バッファ
  • 工業標準のDB-9コネクタ
  • LEDインジケータ
note

CAN BUS ShieldはArduino UNO(ATmega328)、Arduino Mega(ATmega1280/2560)、Arduino Leonardo(ATmega32U4)で正常に動作します。

ハードウェア概要


  1. DB9インターフェース - DBG-OBDケーブルを介してOBDIIインターフェースに接続します。
  2. V_OBD - OBDIIインターフェース(DB9から)から電力を供給します。
  3. LEDインジケータ:
    • PWR: 電源
    • TX: データ送信時に点滅
    • RX: データ受信時に点滅
    • INT: データ割り込み
  4. 端子 - CAN_HおよびCAN_L
  5. Arduino UNOピンアウト
  6. シリアルGroveコネクタ
  7. I2C Groveコネクタ
  8. ICSPピン
  9. IC - MCP2551、高速CANトランシーバー(データシート
  10. IC - MCP2515、SPIインターフェースを備えたスタンドアロンCANコントローラー(データシート
caution

1つのネットワークで2つ以上のCAN Bus Shieldを使用する場合は、インピーダンスを考慮する必要があります。 PCB上のP1をナイフで切るか、PCB上のR3を取り外してください。

ピンマップ

note
FREEピンは他の用途に使用可能です。

DB9&OBDiiインターフェース

CSピン

V1.2のSPI_CSピンはデフォルトでD9に接続されています。D10に変更したい場合は、以下の手順に従ってください。

  • ステップ1: PCBAの裏側を確認すると、CSという名前のパッドが見つかります。

  • ステップ2: パッド9と中央パッドの間のワイヤを切断します。

  • ステップ3: 中央パッドとパッド10をハンダ付けします。

caution

ボックスカッターを使用する際は注意してください。自分やPCBAを傷つける可能性があります。

SPIピン

SPIピン(SCK、MISO、MOSI)はデフォルトでICSPピンにルーティングされています。ただし、一部のボードではSPIピンがD11〜D13に配置されています。この場合、PCBAに変更を加える必要があります。PCBAの裏側を見ると、MOSI、MISO、SCKという3つのパッドがあり、デフォルトではAに接続されています。必要に応じてBに変更できます。

note

Arduino UNO、Arduino Mega、Arduino Leonardo、その他のAVRベースのArduinoボードでは、デフォルト設定で正常に動作します。

caution

SPIピンを変更する際は注意してください。自分やPCBAを傷つける可能性があります。

はじめに


CAN-BUS Shieldの動作を示す簡単な例を以下に示します。この例では、2つのCAN-BUS ShieldとArduinoまたはSeeeduinoが必要です。

note

この例はArduino IDEバージョン1.6.9で構築されています。

STEP1: 必要なもの

名前機能数量リンク
CAN-BUS ShieldCAN Bus通信2リンク
Seeeduino V4.2コントローラー2リンク
ジャンパーワイヤ接続2リンク

STEP2: ハードウェア接続

各CAN-BUS ShieldをSeeeduino V4.2に挿入し、2つのCAN-BUS Shieldをジャンパーワイヤで接続します。以下の画像のように接続します。

note
CAN_HをCAN_Hに、CAN_LをCAN_Lに接続してください。

STEP3: ソフトウェア

Arduinoライブラリのインストール方法の手順に従ってCAN BUS Shieldライブラリをインストールしてください。

以下のボタンをクリックしてライブラリをダウンロードしてください。

ダウンロードしたライブラリをArduino IDEにインストールしてください。

1つのノード(ノードとはSeeeduino + CAN_BUS Shieldを指します)はマスターとして動作し、もう1つはスレーブとして動作します。マスターはスレーブにデータを継続的に送信します。

note

コードがアップロードされる前は、各ノードがマスターとして動作できます。

送信の例を開きます(ファイル > Examples > CAN_BUS_Shield-master > send)そしてマスターにアップロードします。 受信確認の例を開きます(ファイル > Examples > CAN_BUS_Shield-master > receive_check)そしてスレーブにアップロードします。

STEP4: 結果を確認

Arduino IDEのシリアルモニターを開きます(スレーブ)。マスターから送信されたデータを確認できます。

API


1. ボーレートの設定

この関数は、CANバスシステムのボーレートを初期化するために使用されます。

利用可能なボーレートは以下の通りです:

#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. 受信マスクとフィルタの設定

コントローラチップには 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 はマスクまたはフィルタの内容を表します。

3. 受信確認

MCP2515は、受信フレームをソフトウェアで確認するポーリングモードで動作するか、追加のピンを使用してフレーム受信や送信完了を通知することができます。

以下の関数を使用して受信フレームをポーリングします。

INT8U MCP_CAN::checkReceive(void);

この関数はフレームが到着した場合に 1 を返し、何も到着しない場合は 0 を返します。

4. CAN IDの取得

データが到着した場合、以下の関数を使用して「送信」ノードのCAN IDを取得できます。

INT32U MCP_CAN::getCanId(void);

5. データ送信

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); // メッセージ 'stmp' をバスに送信し、他のデバイスにこれは 0x00 からの標準フレームであることを通知します。

6. データ受信

以下の関数は「受信」ノードでデータを受信するために使用されます:

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

しかし、必要な通信速度が見つからない場合があります。その場合、必要なボーレートを計算するためのソフトウェアを提供しています。

こちらをクリックしてソフトウェアをダウンロードしてください。このソフトウェアは中国語ですが、使い方は簡単なので問題ありません。

note

このソフトウェアはWindowsシステムのみ対応しています。もし開けない場合は、[email protected]までお気軽にお問い合わせください。

ソフトウェアを開き、必要なボーレートを設定し、簡単な設定を行った後、計算をクリックしてください。

すると、cfg1、cfg2、cfg3というデータが得られます。

次に、ライブラリにコードを追加する必要があります。

mcp_can_dfs.hを開き、約272行目に以下のコードを追加してください:

#define MCP_16MHz_xxxkBPS_CFG1 (cfg1)    // xxxは必要なボーレート
#define MCP_16MHz_xxxkBPS_CFG2 (cfg2)
#define MCP_16MHz_xxxkBPS_CFG3 (cfg3)

次に、約390行目に以下のコードを追加してください:

#define CAN_xxxKBPS NUM       // xxxは必要なボーレート、NUMは他の通信速度と異なる番号

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;

これで必要なボーレートを使用できるようになります。また、新しい通信速度を使用した場合は、GitHubでプルリクエストを送ってください。他のユーザーのためにライブラリに追加します。

プロジェクト


CAN-BUSシールドを使用して素晴らしいプロジェクトを作りたい場合、以下のプロジェクトを参考にしてください。

Volkswagen CAN BUS Gaming

PCでリアルなダッシュボードを使った車/トラックシミュレーターをプレイしたいと思ったことはありませんか?私もです!Arduino UnoとSeeed CAN Bus Shieldを使用して、VW Polo 6RのダッシュボードをCAN Busで制御しようとしています。Silas Parkerにインスパイアされました。SeppとIs0-Mickの素晴らしいサポートに感謝します!

車両のCAN-BUSをハックする

現代の車両はすべてCAN-BUS(Controller Area Network)を搭載しています。車内のさまざまなデバイスからバッテリーへの膨大な配線を使用する代わりに、より賢いシステムを利用しています。

すべての電子機能はTIPM(完全統合型電力モジュール)に接続されています。例えば、ドアをロックするソレノイドや窓を巻き上げるミニモーターなどです。

各ノード(例:窓や電動ドアロックを制御するスイッチポッド)からメッセージがCANに送信されます。TIPMが有効なメッセージを検出すると、ドアをロックしたり、ライトを点灯したりといった動作を行います。

FAQ


Q1: 他のCANデバイスからデータを取得できません。

  • 接続が正しいか確認してください。
  • ボーレートの設定が正しいか確認してください。

Q2: シリアルモニターに「Init Fail」と表示されます。

  • CSピンの設定がコードと一致しているか確認してください。CAN Bus Shield V1.1/1.2の場合、CSピンはD9に接続されています。それ以外の場合はD10に接続されています。

Q3. その他の問題がある場合、技術サポートはどこで受けられますか。

  • Seeed Forumに質問を投稿することができます。

リソース


技術サポート & 製品ディスカッション

弊社製品をお選びいただきありがとうございます!お客様が弊社製品をスムーズにご利用いただけるよう、さまざまなサポートを提供しております。お客様のご希望やニーズに応じた複数のコミュニケーションチャネルをご用意しています。

Loading Comments...