Arduino UNO R4 WiFi CAN Bus

UNO R4 WiFiのCANバスを使い、メッセージを送信する方法を学びます。


AUTHOR: Karl Söderby


このチュートリアルでは、Arduino UNO R4 WiFiボードのCANコントローラの使い方を学びます。CANコントローラーは、UNO R4 WiFiのマイクロコントローラー(RA4M1)に搭載されています。CANは、主に自動車業界で使われているシリアルプロトコルです。

i
CANコントローラーが動作するには、外部のトランシーバーが必要です。命令とハードウェアの例はこのチュートリアルに記載しています。

目的

この記事では、以下を学びます。

  • 内蔵CANライブラリの概要
  • ボードをCANトランシーバーモジュールに接続する方法
  • 2つのArduino間でのCANメッセージの送信

必要なハードウェアとソフトウェア

*このチュートリアルでは、SN65HVD230ブレイクアウトモジュールを使います。

Contoller Area Network(CAN)

CANバスはCAN highとCAN lowの2つの配線を使います。UNO R4 WiFiでは、以下のピンです。

  • D13/CANRX0 (受信)
  • D10/CANTX0(送信)

他のCANデバイスと通信するには、トランシーバーモジュールが必要です。このチュートリアルでは、SN65HVD230ブレイクアウトモジュールを使います。これを接続するには、以下のセクションの回路を参照してください。

このチュートリアルでは、2つのUNO R4 WiFiデバイス間でCANメッセージを送信する簡単な例を使います。既存のCANデバイスをUNO R4 WiFiに接続することもできます。

回路

CANトランシーバーを接続するには、以下の表と回路図に従ってください。

UNO R4 WiFi CANトランシーバー
D13(CANRX0) CANRX
D10(CANTX0) CANTX
3.3V VIN
GND GND

その後、CANトランシーバー間で、以下のように接続します。

CAN Transceiver 1 CAN Transceiver 2
CANH(HIGH) CANH(HIGH)
CANL(LOW) CANL(LOW)

コード例

以下のコード例は、双方のUNO R4 WiFiボードにアップロードする必要があります。1台がメッセージを送信し、もう1台がメッセージを受信します。これらのコード例は、Renesas coreで利用可能で、Arduino IDEを使っていれば、「ファイル > スケッチ例 > Arduino_CAN > CANWrite/CANRead」でアクセスできます。

利用するライブラリはコアに含まれているので、コアをインストールすれば、追加のライブラリをインストールする必要はありません。

ライブラリをインストールするには、CAN.begin(CanBitRate::BR_250k)を使ってください。CANビットレートは以下から選択してください。

  • BR_125k (125000)
  • BR_250k (250000)
  • BR_500k (500000)
  • BR_1000k (1000000)

CAN Write

CANメッセージを送信するには、CanMsgオブジェクトを作成します。そこには、CAN_IDとサイズ、メッセージデータが含まれます。以下の例はそのオブジェクトを作成する方法です。

1
2
3
uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};
memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));
CanMsg msg(CAN_ID, sizeof(msg_data), msg_data);

CANメッセージを作成したら、CAN.write()メソッドを使って送信できます。以下の例は、loop()が実行されるたびに増加するCANメッセージを作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
  CANWrite

  Write and send CAN Bus messages

  See the full documentation here:
  https://docs.arduino.cc/tutorials/uno-r4-wifi/can
*/

/**************************************************************************************
 * INCLUDE
 **************************************************************************************/

#include <Arduino_CAN.h>

/**************************************************************************************
 * CONSTANTS
 **************************************************************************************/

static uint32_t const CAN_ID = 0x20;

/**************************************************************************************
 * SETUP/LOOP
 **************************************************************************************/

void setup()
{
  Serial.begin(115200);
  while (!Serial) { }

  if (!CAN.begin(CanBitRate::BR_250k))
  {
    Serial.println("CAN.begin(...) failed.");
    for (;;) {}
  }
}

static uint32_t msg_cnt = 0;

void loop()
{
  /* Assemble a CAN message with the format of
   * 0xCA 0xFE 0x00 0x00 [4 byte message counter]
   */
  uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};
  memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));
  CanMsg const msg(CanStandardId(CAN_ID), sizeof(msg_data), msg_data);

  /* Transmit the CAN message, capture and display an
   * error core in case of failure.
   */
  if (int const rc = CAN.write(msg); rc < 0)
  {
    Serial.print  ("CAN.write(...) failed with error code ");
    Serial.println(rc);
    for (;;) { }
  }

  /* Increase the message counter. */
  msg_cnt++;

  /* Only send one message per second. */
  delay(1000);
}
i
ソースコードは、Githubにもあります。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
  CANWrite

  Write and send CAN Bus messages

  See the full documentation here:
  https://docs.arduino.cc/tutorials/uno-r4-wifi/can
*/

/**************************************************************************************
 * INCLUDE
 **************************************************************************************/

#include <Arduino_CAN.h>

/**************************************************************************************
 * CONSTANTS
 **************************************************************************************/

static uint32_t const CAN_ID = 0x20;

/**************************************************************************************
 * SETUP/LOOP
 **************************************************************************************/

void setup()
{
  Serial.begin(115200);
  while (!Serial) { }

  if (!CAN.begin(CanBitRate::BR_250k))
  {
    Serial.println("CAN.begin(...) failed.");
    for (;;) {}
  }
}

static uint32_t msg_cnt = 0;

void loop()
{
  /* Assemble a CAN message with the format of
   * 0xCA 0xFE 0x00 0x00 [4 byte message counter]
   */
  uint8_t const msg_data[] = {0xCA,0xFE,0,0,0,0,0,0};
  memcpy((void *)(msg_data + 4), &msg_cnt, sizeof(msg_cnt));
  CanMsg const msg(CanStandardId(CAN_ID), sizeof(msg_data), msg_data);

  /* Transmit the CAN message, capture and display an
   * error core in case of failure.
   */
  if (int const rc = CAN.write(msg); rc < 0)
  {
    Serial.print  ("CAN.write(...) failed with error code ");
    Serial.println(rc);
    for (;;) { }
  }

  /* Increase the message counter. */
  msg_cnt++;

  /* Only send one message per second. */
  delay(1000);
}

CAN Read

送信されたCANメッセージを受信するには、CAN.read()でメッセージを読む前に、CAN.available()でデータが利用可能か確認します。

i
ソースコードは、Githubにもあります。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
  CANRead

  Receive and read CAN Bus messages

  See the full documentation here:
  https://docs.arduino.cc/tutorials/uno-r4-wifi/can
*/

/**************************************************************************************
 * INCLUDE
 **************************************************************************************/

#include <Arduino_CAN.h>

/**************************************************************************************
 * SETUP/LOOP
 **************************************************************************************/

void setup()
{
  Serial.begin(115200);
  while (!Serial) { }

  if (!CAN.begin(CanBitRate::BR_250k))
  {
    Serial.println("CAN.begin(...) failed.");
    for (;;) {}
  }
}

void loop()
{
  if (CAN.available())
  {
    CanMsg const msg = CAN.read();
    Serial.println(msg);
  }
}

まとめ

このチュートリアルでは、UNO R4 WiFiで利用可能なCANバスの使い方を示し、Arduino_CANライブラリを使って、データを送受信する方法を示しました。

このボードの詳細は、Arduino UNO R4 WiFiの文書を参照してください。

オリジナルのページ

https://docs.arduino.cc/tutorials/uno-r4-wifi/can

最終更新日

November 12, 2023

inserted by FC2 system