๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

CAN (Controller Area Network) ์ด๋ž€? with Arduino UNO R4 WIFI ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป IoT (Embedded)/Arduino

CAN (Controller Area Network) ์ด๋ž€? with Arduino UNO R4 WIFI

์ง•์ง•์•ŒํŒŒ์นด 2023. 11. 30. 17:02
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” LUFT-AQUILA  ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

 

โญ CAN (Controller Area Network)

์ฐจ๋Ÿ‰ ๋‚ด์—์„œ ํ˜ธ์ŠคํŠธ ์ปดํ“จํ„ฐ ์—†์ด ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ ์žฅ์น˜๋“ค์ด ์„œ๋กœ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ํ‘œ์ค€ ํ†ต์‹  ๊ทœ๊ฒฉ

๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ

 

๐ŸŒณ ํŠน์ง•

1๏ธโƒฃ ์‹œ๋ฆฌ์–ผ ํ†ต์‹  ๊ธฐ๋ฐ˜, ๊ฐ™์€ ๋ฒ„์Šค๋ผ์ธ ํ†ตํ•ด ์ „์†ก ๋ฐ ์ˆ˜์‹ 

2๏ธโƒฃ Multi-Master, ํ†ต์‹  ๋ฒ„์Šค๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋“ค์ด ๊ณต์œ ํ•œ๋‹ค

3๏ธโƒฃ ๊ฐ„๋‹จํ•˜๊ณ  ๋…ธ์ด์ฆˆ์— ๊ฐ•ํ•˜๋‹ค

twist pair ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, CANH ์™€ CAHL ์˜ 2๊ฐœ ์„ ์œผ๋กœ ํ†ต์‹ ํ•œ๋‹ค

4๏ธโƒฃ ID ๊ฐ’ ์ด์šฉํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋งค๊ธด๋‹ค

ECU ๋Š” ๊ณ ์œ ํ•œ ID ๋ฅผ ๊ฐ€์ง„๋‹ค

ID๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค

์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ ID๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค

๋‚˜๋จธ์ง€๋Š” ๋‹ค์Œ bus cycle ์— ์žฌ์ „์†กํ•œ๋‹ค

5๏ธโƒฃ CSMA (Carrier Sense Multiple Access) & CS/CD

6๏ธโƒฃ ์ตœ๋Œ€ 8byte, ๋น„๋™๊ธฐ์‹ ์ง๋ ฌ, ์ฃผ์†Œ์ง€์ • X

7๏ธโƒฃ transceiver ์„ ํ†ตํ•ด ์ฐจ๋™์‹ ํ˜ธ๋ฅผ MCU ๊ฐ€ ์ดํ•ด๊ฐ€๋Š” ๋””์ง€ํ„ธ ์‹ ํ˜ธ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค

8๏ธโƒฃ ์–‘ ๋๋‹จ์— 120 ์ €ํ•ญ์„ ์—ฐ๊ฒฐํ•œ๋‹ค

์ž„ํ”ผ๋˜์Šค ๋งค์นญ์œ„ํ•ด ์ข…๋‹จ ์ €ํ•ญ์€ ํ•„์ˆ˜์ด๋‹ค

9๏ธโƒฃ CAN ์€ GND ๊ฐ€ ์—†๋‹ค

CANH์™€ CANL ์ „์••์ฐจ๋กœ ์‹ ํ˜ธ (์ฐจ๋™ ์‹ ํ˜ธ) ๋ฅผ ๋งŒ๋“ ๋‹ค

์ „์••์ฐจ ์—†์œผ๋ฉด LOW

์ „์••์ฐจ ์žˆ์œผ๋ฉด HIGH

๐Ÿ”Ÿ ๋ฐ์ดํ„ฐ ํ•„๋“œ

 

 

๐ŸŒณ CODE

์ฐธ๊ณ ๋กœ ์ € arduino ๋Š” arduino uno r4 wifi ์ด๋‹ค

can ํ†ต์‹ ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค

// CAN_WRITE

//#include <R7FA2A1AB.h>
#include <Arduino_CAN.h>

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

// ์บ” ํ†ต์‹ ์—์„œ ์†ก์‹ ๋˜๋Š” ๋ฉ”์„ธ์ง€๋Š” ID๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ตœ๋Œ€ 8๋ฐ”์ดํŠธ์˜ ๋ฐ์ดํ„ฐ
// ๋ฉ”์„ธ์ง€๋Š” ๋ฒ„์Šค์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ œ์–ด๊ธฐ์—๊ฒŒ ์ „์†ก
static uint32_t const CAN_ID = 0x23;

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

void setup()
{
  // TRNG

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

  // CAN ๋น„ํŠธ ์ „์†ก๋ฅ ๊ณผ ์ดˆ๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  // CAN ํŠธ๋žœ์‹œ๋ฒ„๊ฐ€ ์—†์œผ๋ฉด ๋‹ค๋ฅธ CAN ์žฅ์น˜์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์—†์Œ! BR_125k (125000), BR_250k (250000), BR_500k(500000), BR_1000k (1000000)  """
  if (!CAN.begin(CanBitRate::BR_500k))
  {
    Serial.println("CAN.begin(...) failed.");
    for (;;)
    {
    }
  }
}

static uint32_t msg_cnt = 0;

void loop()
{
  //  ๋งค๋ฒˆ ์ฆ๊ฐ€ํ•˜๋Š” CAN ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑ
  /* 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));
  // CAN ๋ฉ”์‹œ์ง€ ๋ณด๋‚ผ ๊ฐ์ฒด(CanMsg) : CAN_ID, ํฌ๊ธฐ ๋ฐ ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ
  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);
}

 

/*
  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_500k))
  {
    Serial.println("CAN.begin(...) failed.");
    for (;;) {}
  }
}

void loop()
{
  // ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
  if (CAN.available())
  {
    // ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ๊ธฐ
    CanMsg const msg = CAN.read();
    Serial.println(msg);
  }
}

 

728x90
๋ฐ˜์‘ํ˜•
Comments