How to Use the MCP2515 CAN Bus Module with Arduino

How to Use the MCP2515 CAN Bus Module with Arduino

The MCP2515 is a CAN (Controller Area Network) bus module widely used for automotive and industrial communication. It enables Arduino to interface with CAN-based systems to send and receive data efficiently. This tutorial will guide you through setting up and using the MCP2515 module with Arduino.

What You Will Need

  1. MCP2515 CAN Bus Module
  2. Arduino Board (e.g., Uno, Mega, Nano)
  3. CAN-Bus Compatible Device or Another MCP2515 Module
  4. Jumper Wires
  5. Breadboard (optional)
  6. A computer with the Arduino IDE installed

Step 1: Understanding the MCP2515 Module

The MCP2515 module uses the MCP2515 CAN controller IC and TJA1050 CAN transceiver. The module communicates with the Arduino via the SPI interface.

MCP2515 Pinout

Pin Function
VCC Power Supply (5V)
GND Ground
CS Chip Select
SO SPI Data Output
SI SPI Data Input
SCK SPI Clock
INT Interrupt Output

Step 2: Wiring the MCP2515 to Arduino

Below is the wiring guide for connecting the MCP2515 module to an Arduino Uno:

MCP2515 Pin Arduino Pin
VCC 5V
GND GND
CS Pin 10
SO Pin 12
SI Pin 11
SCK Pin 13
INT Pin 2

Note: For other Arduino boards, ensure the SPI pins correspond to your specific board’s pinout.

Step 3: Install the Required Library

The MCP_CAN library simplifies interaction with the MCP2515 module.

Steps to Install MCP_CAN Library:

  1. Open the Arduino IDE.
  2. Go to Sketch > Include Library > Manage Libraries.
  3. Search for "MCP_CAN" in the Library Manager.
  4. Click Install.

Step 4: Upload the Code

Transmitter Code (Sending Data on the CAN Bus):

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

#define CAN_CS 10
MCP_CAN CAN(CAN_CS); // Set CS pin for MCP2515

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

  if (CAN.begin(MCP_ANY, 500000, MCP_8MHZ) == CAN_OK) {
    Serial.println("CAN Bus Initialized Successfully");
  } else {
    Serial.println("CAN Bus Initialization Failed");
    while (1);
  }

  CAN.setMode(MCP_NORMAL);
  Serial.println("CAN Bus set to Normal Mode");
}

void loop() {
  unsigned char data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};

  if (CAN.sendMsgBuf(0x100, 0, 8, data) == CAN_OK) {
    Serial.println("Message Sent Successfully");
  } else {
    Serial.println("Error Sending Message");
  }

  delay(1000); // Send data every second
}

Receiver Code (Reading Data from the CAN Bus):

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

#define CAN_CS 10
MCP_CAN CAN(CAN_CS); // Set CS pin for MCP2515

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

  if (CAN.begin(MCP_ANY, 500000, MCP_8MHZ) == CAN_OK) {
    Serial.println("CAN Bus Initialized Successfully");
  } else {
    Serial.println("CAN Bus Initialization Failed");
    while (1);
  }

  CAN.setMode(MCP_NORMAL);
  Serial.println("CAN Bus set to Normal Mode");
}

void loop() {
  unsigned char len = 0;
  unsigned char buf[8];

  if (CAN.checkReceive() == CAN_MSGAVAIL) {
    CAN.readMsgBuf(&len, buf);
    unsigned long id = CAN.getCanId();

    Serial.print("Message ID: 0x");
    Serial.println(id, HEX);

    Serial.print("Data: ");
    for (int i = 0; i < len; i++) {
      Serial.print(buf[i], HEX);
      Serial.print(" ");
    }
    Serial.println();
  }
}

Step 5: Test the Setup

  1. Connect the MCP2515 module to your Arduino as described in Step 2.
  2. Upload the transmitter code to one Arduino and the receiver code to another Arduino.
  3. Connect the CAN_H and CAN_L pins of both MCP2515 modules to establish the CAN bus.
  4. Open the Serial Monitor on both Arduinos and set the baud rate to 115200.
  5. On the receiver Arduino, you should see the messages sent by the transmitter Arduino.

Troubleshooting

  • No data received: Check the CAN_H and CAN_L connections between the modules.
  • Initialization failed: Ensure the SPI connections and CS pin match your setup.
  • Erratic communication: Verify that both modules use the same baud rate (500 kbps in this example).

Applications of the MCP2515 CAN Bus Module

  1. Vehicle diagnostics (OBD-II)
  2. Industrial automation systems
  3. Robotics communication
  4. IoT devices with CAN bus networks

Conclusion

You’ve successfully set up the MCP2515 CAN bus module with Arduino for sending and receiving data. This module is incredibly versatile for applications requiring reliable communication over a CAN bus. Experiment with different message IDs and data payloads to explore its full potential!

Leave a comment

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.