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

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

ただいまの
回答率

87.77%

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 5,340

score 67

車両の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が表示されません。
ソースは以下の通りです。

// ライブラリヘッダのインクルード
#include <mcp_can.h>
#include <SPI.h>

//設定値
#define CS_PIN  (10) // CSを10ピンとする(変更可能)
#define INT_PIN (9)  // INTを9ピンとする(変更可能)

long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];

MCP_CAN CAN0(CS_PIN);      

void setup() {
    Serial.begin(115200);
    CAN0.begin(CAN_STDID, CAN_500KBPS, MCP_8MHZ); // CANの通信速度を500kbpsにする 
    pinMode(INT_PIN, INPUT); // 割り込みのためのピンを設定
    CAN0.setMode(MCP_NORMAL);
    Serial.println("MCP2515 Library Receive Example...");
}

byte data[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

void loop(){
    //受信
    if(!digitalRead(INT_PIN)) {  // 受信割り込みが発生したら、CANデータをReadする
        CAN0.readMsgBuf(&rxId, &len, rxBuf);
        Serial.print("ID: ");
        Serial.print(rxId, HEX);
        Serial.print("  Data: ");
        for(int i = 0; i<len; i++) {
            if(rxBuf[i] < 0x10) {
                Serial.print("0");
            }
            Serial.print(rxBuf[i], HEX);
            Serial.print(" ");
        }
        Serial.println();
    }
}

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

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

イメージ説明

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

端子 OBD-IIピン D-SUB9ピン
GND 5 2
CAN-H 6 3
CAN-L 14 5

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)決めうちですがこれで良いのでしょうか。
ネットで拾ったコードを試す前にライブラリに付属のサンプルスケッチで試してみては?

// CAN Receive Example
//

#include <mcp_can.h>
#include <SPI.h>

long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
char msgString[128];                        // Array to store serial string

#define CAN0_INT 2                              // Set INT to pin 2
MCP_CAN CAN0(10);                               // Set CS to pin 10


void setup()
{
  Serial.begin(115200);

  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK)
    Serial.println("MCP2515 Initialized Successfully!");
  else
    Serial.println("Error Initializing MCP2515...");

  CAN0.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.

  pinMode(CAN0_INT, INPUT);                            // Configuring pin for /INT input

  Serial.println("MCP2515 Library Receive Example...");
}

void loop()
{
  if(!digitalRead(CAN0_INT))                         // If CAN0_INT pin is low, read receive buffer
  {
    CAN0.readMsgBuf(&rxId, &len, rxBuf);      // Read data: len = data length, buf = data byte(s)

    if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
    else
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);

    Serial.print(msgString);

    if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for(byte i = 0; i<len; i++){
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
        Serial.print(msgString);
      }
    }

    Serial.println();
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/22 23:35

    ご連絡が遅くなって大変申し訳ございません。
    ご丁寧にありがとうございます。

    >車両との配線は自作でしょうか。
    自作です。D-sub9のメスーメスでつなげています。
    ピンの配列は異なってます。
    自分はPIN5, 3, 2 のストレートでつないだケーブルを使っております。


    ソース使わせていただきます。
    結果は報告させていただきます。

    ご回答ありがとうございました。

    キャンセル

0

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

接続図

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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/27 14:56

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

    キャンセル

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

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る