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

CAN-BUSは、長距離通信、適度な通信速度、高い信頼性を持つため、一般的な産業用バスです。自動車診断バスなど、現代の工作機械でよく見られます。
このCAN-BUS Shieldは、MCP2515 CAN Busコントローラー(SPIインターフェース付き)とMCP2551 CANトランシーバーを採用しており、Arduino/SeeeduinoにCAN-BUS機能を提供します。OBD-II変換ケーブルを追加し、OBD-IIライブラリをインポートすることで、車載診断デバイスやデータロガーを構築する準備が整います。
バージョン
このドキュメントは以下の製品バージョンに適用されます:
バージョン | リリース日 | 購入方法 |
CAN BUS Shield V1.0 | 2012年10月14日 | |
CAN BUS Shield V1.1 | 2013年8月10日 | |
CAN BUS Shield V1.2 | 2015年1月5日 | |
CAN BUS Shield V2.0 | 2017年8月1日 |
代替選択肢
もしプロジェクトがスペース制限を受けており、CAN-BUS以外の機能が不要な場合、Arduino互換でよりコンパクトかつコスト効率の高いGrove CAN-BUSモジュールがあります。詳細はこちらをご覧ください。
このシールドを車に接続したい場合
車のデータを読み取ったり制御したい場合、OBD>DB9ケーブルが利用可能です。このケーブルを使用すると、OBDコネクタとDB9コネクタへの接続が簡単になります。このケーブルはOBDコネクタを備えたすべてのデバイスで動作します。電源スイッチを追加すると、満足のいくクリック感が得られます。
USB-CANアナライザー
CAN BusをデバッグするためのCAN Busアナライザーが必要な場合は、このUSB-CANアナライザーをお勧めします。
特徴
- CAN V2.0Bを実装し、速度は最大1 Mb/sに対応
- SPIインターフェースの速度は最大10 MHzに対応
- 標準(11ビット)および拡張(29ビット)データおよびリモートフレーム
- 優先順位付きメッセージストレージを備えた2つの受信バッファ
- 工業規格のDB-9コネクタ
- LEDインジケータ
CAN BUS Shieldは、Arduino UNO(ATmega328)、Arduino Mega(ATmega1280/2560)、Arduino Leonardo(ATmega32U4)で正常に動作します。
ハードウェア概要
- DB9インターフェース - DBG-OBDケーブルを介してOBDIIインターフェースに接続します。
- V_OBD - OBDIIインターフェース(DB9から)から電力を供給します。
- LEDインジケータ:
- PWR: 電源
- TX: データ送信時に点滅
- RX: データ受信時に点滅
- INT: データ割り込み
- 端子 - CAN_HおよびCAN_L
- Arduino UNOピンアウト
- シリアルGroveコネクタ
- I2C Groveコネクタ
- ICSPピン
- IC - MCP2551、高速CANトランシーバー(データシート)
- IC - MCP2515、SPIインターフェースを備えたスタンドアロンCANコントローラー(データシート)
1つのネットワークで2つ以上のCAN Bus Shieldを使用する場合は、インピーダンスを考慮する必要があります。PCB上のP1をナイフで切断するか、PCB上のR3を取り外してください。
ピンマップ
FREEピンは他の用途に使用可能です。
DB9&OBDiiインターフェース
CSピン
新しいバッチのCAN-BUS Shield V2を製造する際、背面パッドの配線がPCB内部に埋め込まれました。外部からはパッド間の配線が見えなくなっていますが、内部ではまだ接続されています。パッドの配線を変更したい場合は、まずPCB内の配線を切断する必要があります。
V1.2のSPI_CSピンはデフォルトでD9に接続されています。D10に変更したい場合は、以下の手順に従ってください。
- ステップ1: PCBAの裏側を確認すると、CSという名前のパッドが見つかります。
- ステップ2: パッド9と中央パッドの間の配線を切断します。
- ステップ3: 中央パッドとパッド10をはんだ付けします。
カッターナイフを使用する際は注意してください。自分やPCBAを傷つける可能性があります。
SPIピン
SPIピン(SCK、MISO、MOSI)はデフォルトでICSPピンにルーティングされています。ただし、一部のボードではSPIピンがD11〜D13に配置されています。この場合、PCBAに変更を加える必要があります。PCBAの裏側を確認すると、MOSI、MISO、SCKという3つのパッドがあり、デフォルトではAに接続されています。必要に応じてBに変更できます。
Arduino UNO、Arduino Mega、Arduino Leonardo、その他のAVRベースのArduinoボードでは、デフォルト設定で正常に動作します。
SPIピンを変更する際は注意してください。自分やPCBAを傷つける可能性があります。
はじめに
CAN-BUS Shield の動作を示す簡単な例を以下に示します。この例では、CAN-BUS Shield を 2 つと Arduino または Seeeduino が必要です。
この例は Arduino IDE バージョン 1.6.9 を使用して構築されています。
STEP1: 必要なもの
名前 | 機能 | 数量 | リンク |
CAN-BUS Shield | CAN バス通信 | 2 | リンク |
Seeeduino V4.2 | コントローラー | 2 | リンク |
STEP2: ハードウェア接続
各 CAN-BUS Shield を Seeeduino V4.2 に挿入し、2 本のジャンパー線で 2 つの CAN-BUS Shield を接続します。以下の画像のように接続してください。
CAN_H を CAN_H に、CAN_L を CAN_L に接続してください。
STEP3: ソフトウェア
Arduino ライブラリのインストール方法 の手順に従って、CAN BUS Shield ライブラリをインストールしてください。
- Seeed_Arduino_CAN Arduino ライブラリをこちらからダウンロードしてください。
ダウンロードしたライブラリを Arduino IDE にインストールします。
ノードのうち 1 つ(ノードとは Seeeduino + CAN_BUS Shield を指します)がマスターとして動作し、もう 1 つがスレーブとして動作します。マスターはスレーブにデータを継続的に送信します。
コードをアップロードする前は、各ノードがマスターとして動作可能です。
send の例 (ファイル > Examples > Seeed_Arduino_CAN > send) を開き、マスターにアップロードしてください。
または以下のコードを Arduino IDE にコピーしてアップロードしてください:
#include <SPI.h>
#include "mcp2515_can.h"
/*SAMD core*/
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
#define SERIAL SerialUSB
#else
#define SERIAL Serial
#endif
const int SPI_CS_PIN = 9;
mcp2515_can CAN(SPI_CS_PIN); // CS ピンを設定
void setup() {
SERIAL.begin(115200);
while(!Serial){};
while (CAN_OK != CAN.begin(CAN_500KBPS)) { // CAN バスを初期化 : ボーレート = 500k
SERIAL.println("CAN BUS Shield 初期化失敗");
SERIAL.println("CAN BUS Shield を再初期化します");
delay(100);
}
SERIAL.println("CAN BUS Shield 初期化成功!");
}
unsigned char stmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
void loop() {
// データ送信: ID = 0x00, 標準フレーム, データ長 = 8, stmp: データバッファ
stmp[7] = stmp[7] + 1;
if (stmp[7] == 100) {
stmp[7] = 0;
stmp[6] = stmp[6] + 1;
if (stmp[6] == 100) {
stmp[6] = 0;
stmp[5] = stmp[6] + 1;
}
}
CAN.sendMsgBuf(0x00, 0, 8, stmp);
delay(100); // 100ms ごとにデータを送信
SERIAL.println("CAN BUS sendMsgBuf 成功!");
}
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 はデータを格納する場所です。
7. init_CS
Arduinoで2つのCAN-BUSシールドを使用する場合に非常に便利です。CS_CANピンを選択するための機能を提供しています。CS_CANピンの使用方法がわからない場合は、CS_CANピンをご覧ください。
void MCP_CAN::init_CS(byte _CS)
- _CS は選択するピンを表します。(9または10)
新しいボーレートを生成する
以下に示すように、よく使用されるボーレートを多数提供しています:
#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は必要なボーレート
#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
車両のCAN-BUSをハックする
すべての電子機能はTIPM(完全統合型パワーモジュール)に接続されています。例えば、ドアをロックするソレノイドや窓を巻き上げるミニモーターなどです。
各ノード(例:窓や電動ドアロックを制御するスイッチポッド)からメッセージがCANに送信されます。TIPMが有効なメッセージを検出すると、ドアをロックしたり、ライトを点灯したりといった動作を行います。
FAQ
Q1: 他のCANデバイスからデータを取得できません。
- 接続が正しいか確認してください。
- ボーレートの設定が正しいか確認してください。
Q2: シリアルモニターに「Init Fail」と表示されます。
- CSピンの設定がコードと一致しているか確認してください。CAN Bus Shield V1.1/1.2の場合、CSピンはD9に接続されています。それ以外の場合はD10に接続されています。
オンライン回路図ビューア
リソース
- [PDF]CAN-BUS Shield V2.0 回路図
- [Eagle]CAN-BUS Shield V2.0の回路図とPCB
- [ライブラリ]CAN-BUS Shield用Arduinoライブラリ
- [データシート]MCP2515データシート
- [データシート]MCP2551データシート
- [デモ]OBDデモ
- [ツール]MCP2515ボーレートツール
- [ツール]USB-CANアナライザー
- [ケーブル]DB9からOBD2ケーブル
- [図面]CAN BUS Shield v2.0のPDF図面
- [図面]CAN BUS Shield v2.0のDXF図面
技術サポートと製品ディスカッション
弊社製品をお選びいただきありがとうございます!製品の使用体験がスムーズになるよう、さまざまなサポートを提供しています。お客様の好みやニーズに応じた複数のコミュニケーションチャネルをご用意しています。