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

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

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

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

Q&A

3回答

9410閲覧

ArduinoでCAN受信

hirapan

総合スコア10

Arduino

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

1グッド

1クリップ

投稿2019/01/31 05:10

前提・実現したいこと

ECUとArduinoを用いて、CAN通信を行うプログラムを作成しています。
ここで、Arduino側でCAN受信プログラムを作成していますが、正しく受信できません。

発生している問題・エラーメッセージ

作成したプログラムでは、データの中身を受信することが出来ません。
(以下参照)

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

該当のソースコード

Arduino

1//CAN受信 2//受信画面をシリアルで送信 3 4#include <mcp_can.h> 5#include <SPI.h> 6 7//設定値 8#define CS_PIN (10) 9#define INT_PIN (9) 10 11long unsigned int rxId; 12unsigned char len =0; 13unsigned char rxBuf[8]; 14 15MCP_CAN CAN0(CS_PIN); 16 17void setup() { 18 // put your setup code here, to run once: 19 Serial.begin(9600); 20 CAN0.begin(CAN_STDID, CAN_500KBPS, MCP_8MHZ); // CANの通信速度を500kbpsにする 21 pinMode(INT_PIN,INPUT); 22 CAN0.setMode(MCP_NORMAL); //?? 23 Serial.println("CAN受信テスト"); 24} 25 26void loop() { 27 // put your main code here, to run repeatedly: 28 if(!digitalRead(INT_PIN)) 29 { 30 CAN0.readMsgBuf(&rxId,&len,rxBuf); 31 //rxId = CAN0.getCanId(); 32 Serial.print("ID: "); 33 Serial.print(rxId, HEX); 34 Serial.print(" Data: "); 35 for(int i = 0; i<len; i++) 36 { 37 if(rxBuf[i] < 0x10) 38 { 39 Serial.print("0"); 40 } 41 Serial.print(rxBuf[i], HEX); 42 Serial.print(" "); 43 } 44 Serial.println(); 45 } 46}

試したこと

mcp_can.h の中身などを調査。
CANの調査。
Seeed社のサイトの調査。
http://wiki.seeedstudio.com/CAN-BUS_Shield_V2.0/

補足情報(FW/ツールのバージョンなど)

Arduino UNO, seeed製 CAN-BUS Shield を使用。
ECU側で送信できることは確認済み。
ターミナルブロックがワンタッチ式で使い方に若干不安あり。

サイトなどを読み、少し変えて動かしてみたものになります。
プログラムの十分な理解はまだ出来ていません。

bochan2👍を押しています

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

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

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

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

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

y_waiwai

2019/01/31 05:18

ECUってだけでは意味不明です。詳しい型番を提示しましょう。 んで、Arduinoのなにを使ってますか? また、回路図も必要です
guest

回答3

0

まず、部分部分でデバッグできるようにしてはどうでしょうか?

スケッチ例を確認して、どのようにすればエラーの確認ができるかわかると思います。
ここに示す方法もスケッチ例からのコピペです。

あなた⇒

Serial.begin(9600); CAN0.begin(CAN_STDID, CAN_500KBPS, MCP_8MHZ); // CANの通信速度を500kbpsにする

提案例⇒

Serial.begin(9600); Serial.print("Begin CAN Training => "); // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled. if(CAN1.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) Serial.println("MCP2515 No.1 Initialized Successfully!"); else Serial.println("Error Initializing MCP2515 No.1..."); CAN1.setMode(MCP_NORMAL); // Change to normal mode to allow messages to be transmitted コード

あなた⇒

if(!digitalRead(INT_PIN)) { 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();

提案例⇒

if(!digitalRead(INT_PIN1)) // If CAN2_INT pin is low, read receive buffer { CAN2.readMsgBuf(&CAN2Id, &len, rxBuf); // Read data: len = data length, buf = data byte(s) if((CAN2Id & 0x80000000) == 0x80000000) // Determine if ID is standard (11 bits) or extended (29 bits) sprintf(msgString, " Extended ID: 0x%.8lX ", (CAN2Id & 0x1FFFFFFF)); else sprintf(msgString, " Standard ID: 0x%.3lX ", CAN2Id); Serial.print("Message Recieved Successfully! =>"); Serial.println(msgString); sprintf(msgString, "DLC: %1d Data:", len); Serial.print(msgString); //Serial.print(" DLC: %1d Data:", len); if((CAN2Id & 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); } }

投稿2019/07/07 01:05

HiroPokeHero

総合スコア45

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

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

0

CAN0.beginの返り値はCAN_OKですか?
多分違うと思います。

私も同じ環境でCAN通信をしていますが、引数は(CAN_500KBPS, MCP_16MHZ);の2つで行っています。
あなたの第一引数についてはよくわかりません。。。

CANシールドの銀色部分に16.00と書かれていると思います。
それがクロック周波数なので引数をMCP_16MHZとしてください。

自分も初心者なので詳しいことはわかりませんが、これで解決すると思います。

投稿2019/05/04 20:53

Alyn

総合スコア50

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

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

0

まず手順が少し足らないと思います。
気になる部分は参考のページリンク内容
の右側のAPIの説明の部分に
INT8U MCP_CAN :: checkReceive(void);
でまず受信の確認。
INT32U MCP_CAN :: getCanId(void)
で送信先のIDの取得。

この辺と思われます。
まずは一読を。

投稿2019/02/02 03:38

MasahikoHirata

総合スコア3747

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問