質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

4回答

11035閲覧

CAN BUS シールドを使った通信が出来ない

izuki_y

総合スコア65

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2019/05/18 06:13

車両のCAN信号を読む為にArduinoで使えるCAN BUS シールドを購入しました。

SFE-DEV-13262
https://www.switch-science.com/catalog/2493/

構成図はこんな感じです。
イメージ説明

ソフトはArduionoが無償で提供してくれているAPI使いました。
https://github.com/Seeed-Studio/CAN_BUS_Shield

しかし

ID: 0 Data: ID: 0 Data: ID: 0 Data: ID: 0 Data: ID: 0 Data:

と表示されたままCANが表示されません。
ソースは以下の通りです。

C

1// ライブラリヘッダのインクルード 2#include <mcp_can.h> 3#include <SPI.h> 4 5//設定値 6#define CS_PIN (10) // CSを10ピンとする(変更可能) 7#define INT_PIN (9) // INTを9ピンとする(変更可能) 8 9long unsigned int rxId; 10unsigned char len = 0; 11unsigned char rxBuf[8]; 12 13MCP_CAN CAN0(CS_PIN); 14 15void setup() { 16 Serial.begin(115200); 17 CAN0.begin(CAN_STDID, CAN_500KBPS, MCP_8MHZ); // CANの通信速度を500kbpsにする 18 pinMode(INT_PIN, INPUT); // 割り込みのためのピンを設定 19 CAN0.setMode(MCP_NORMAL); 20 Serial.println("MCP2515 Library Receive Example..."); 21} 22 23byte data[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; 24 25void loop(){ 26 //受信 27 if(!digitalRead(INT_PIN)) { // 受信割り込みが発生したら、CANデータをReadする 28 CAN0.readMsgBuf(&rxId, &len, rxBuf); 29 Serial.print("ID: "); 30 Serial.print(rxId, HEX); 31 Serial.print(" Data: "); 32 for(int i = 0; i<len; i++) { 33 if(rxBuf[i] < 0x10) { 34 Serial.print("0"); 35 } 36 Serial.print(rxBuf[i], HEX); 37 Serial.print(" "); 38 } 39 Serial.println(); 40 } 41}

回路図は以下のようになっております。
イメージ説明

D-SUB9のピン配列はこちらを参考にしました。

イメージ説明

D-SUB9のピンの配列はこのようにしました
イメージ説明

ご存知の方がおりましたら是非ご回答をお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

終端処理が正しく出来てなかったのが原因だったようです。

https://monoist.atmarkit.co.jp/mn/articles/2006/15/news014.html
https://e2e.ti.com/blogs_/japan/b/analog/posts/can-1-can

MCP2515 CAN バス モジュール TJA1050を2台接続で通信出来てたのは、
1:1だったから終端処理が無くても動作していただけの事だったようです。

投稿2021/06/24 12:51

izuki_y

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2021/06/27 05:56

他の回答にベストアンサーがついていますが、こちらが原因だったということであればベストアンサーを変更してください。
guest

0

ベストアンサー

私の使っているCANモジュールをは、ほぼ同じ見た目のものですが、以下で使えています。
if (CAN0.begin(MCP_ANY, CAN_1000KBPS, MCP_16MHZ) == CAN_OK)
CAN_500KBPSやMCP_8MHZにすると正しくデータが受信できなくなったりします。
こちらも色々試してみてください。

投稿2021/03/20 07:07

otomika

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

MCP2515 CAN バス モジュール TJA1050を2台、Arudinoを2台購入してやってみたら問題なく通信できました。

接続図

SFE-DEV-13262を使えなかったのは、pin配が間違っていたりするのかな?

投稿2019/08/19 03:38

izuki_y

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

D-SUB9のピン配列はこちらを参考にしました。
D-SUB9のピンの配列はこのようにしました

車両との配線は自作でしょうか。
表に書かれているOBD-IIは車両側OBD-IIコネクタの端子番号ではなく、市販されているOBD-II<->D-SUB9ケーブルのD-SUB9側ピン配置です。
車両側OBD-IIコネクタとの接続は以下のとおりですが正しいピンに接続されていますか。

端子OBD-IIピンD-SUB9ピン
GND52
CAN-H63
CAN-L145

OBD-IIコネクタピン配置

ソフトはArduionoが無償で提供してくれているAPI使いました。
https://github.com/Seeed-Studio/CAN_BUS_Shield

これとは別のMCP_CAN_libを使用したコードに見えますが…
CAN0.begin()の第1引数にCAN_STDIDを指定していますが、MCP_ANYかMCP_STDEXTです。
MCP_STDEXTと値がたまたま一致していますが…
第3引数にMCP_8MHZを指定されていますが、回路図によると16MHzなのでMCP_16MHZとしてください。
StandardID(11bit)決めうちですがこれで良いのでしょうか。
ネットで拾ったコードを試す前にライブラリに付属のサンプルスケッチで試してみては?

C

1// CAN Receive Example 2// 3 4#include <mcp_can.h> 5#include <SPI.h> 6 7long unsigned int rxId; 8unsigned char len = 0; 9unsigned char rxBuf[8]; 10char msgString[128]; // Array to store serial string 11 12#define CAN0_INT 2 // Set INT to pin 2 13MCP_CAN CAN0(10); // Set CS to pin 10 14 15 16void setup() 17{ 18 Serial.begin(115200); 19 20 // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled. 21 if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) 22 Serial.println("MCP2515 Initialized Successfully!"); 23 else 24 Serial.println("Error Initializing MCP2515..."); 25 26 CAN0.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data. 27 28 pinMode(CAN0_INT, INPUT); // Configuring pin for /INT input 29 30 Serial.println("MCP2515 Library Receive Example..."); 31} 32 33void loop() 34{ 35 if(!digitalRead(CAN0_INT)) // If CAN0_INT pin is low, read receive buffer 36 { 37 CAN0.readMsgBuf(&rxId, &len, rxBuf); // Read data: len = data length, buf = data byte(s) 38 39 if((rxId & 0x80000000) == 0x80000000) // Determine if ID is standard (11 bits) or extended (29 bits) 40 sprintf(msgString, "Extended ID: 0x%.8lX DLC: %1d Data:", (rxId & 0x1FFFFFFF), len); 41 else 42 sprintf(msgString, "Standard ID: 0x%.3lX DLC: %1d Data:", rxId, len); 43 44 Serial.print(msgString); 45 46 if((rxId & 0x40000000) == 0x40000000){ // Determine if message is a remote request frame. 47 sprintf(msgString, " REMOTE REQUEST FRAME"); 48 Serial.print(msgString); 49 } else { 50 for(byte i = 0; i<len; i++){ 51 sprintf(msgString, " 0x%.2X", rxBuf[i]); 52 Serial.print(msgString); 53 } 54 } 55 56 Serial.println(); 57 } 58}

投稿2019/07/11 16:57

編集2019/07/11 18:42
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

izuki_y

2019/07/22 14:35

ご連絡が遅くなって大変申し訳ございません。 ご丁寧にありがとうございます。 >車両との配線は自作でしょうか。 自作です。D-sub9のメスーメスでつなげています。 ピンの配列は異なってます。 自分はPIN5, 3, 2 のストレートでつないだケーブルを使っております。 ソース使わせていただきます。 結果は報告させていただきます。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問