Canbus with Arduino Uno and MCP2515

I have the transmitter

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

const int spiCS = 10; // CS pin connected to CAN module
const int potPin = A0; // Analog pin connected to potentiometer

MCP_CAN CAN(spiCS); // Set CS pin

void setup() {
  Serial.begin(9600);
  
  while (!Serial);

  Serial.println("Initializing MCP2515...");
  if (CAN.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) {
    Serial.println("MCP2515 Initialized Successfully!");
  } else {
    Serial.println("Error Initializing MCP2515 Module");
    while (1);
  }
}

void loop() {
  int potValue = analogRead(potPin); // Read potentiometer value
  byte buf[8] = {highByte(potValue), lowByte(potValue)}; // Create message buffer with potentiometer value

  Serial.print("Potentiometer Value: ");
  Serial.println(potValue);

  // Send message with ID 0x123 and potentiometer value
  if (CAN.sendMsgBuf(0x123, 0, 2, buf) == CAN_OK) {
    Serial.println("Message Sent Successfully!");
  } else {
    Serial.println("Error Sending Message");
  }

  delay(1000); // Adjust delay as needed
}

and the seriel output of it is smthn like that
Initializing MCP2515...

Entering Configuration Mode Successful!

Setting Baudrate Successful!

MCP2515 Initialized Successfully!

Potentiometer Value: 606

Message Sent Successfully!

and the receiving code is =


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <mcp_can.h>

const int spiCS = 10; // CS pin connected to CAN module

MCP_CAN CAN(spiCS); // Set CS pin
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address to 0x27

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("Initializing LCD...");
  lcd.init(); // Initialize LCD
  lcd.backlight(); // Turn on backlight
  Serial.println("LCD Initialized!");

  Serial.println("Entering Configuration Mode...");
  if (CAN.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) {
    Serial.println("CAN BUS Initialized Successfully!");
  } else {
    Serial.println("Error Initializing MCP2515 Module");
    while (1);
  }
  
  Serial.println("Starting to Set Mask...");
  CAN.init_Mask(0, 0, 0x7FF);
  Serial.println("Mask Set Successfully!");
  
  Serial.println("Starting to Set Filter...");
  CAN.init_Filt(0, 0, 0x123); // Setting filter to accept messages with ID 0x123
  Serial.println("Filter Set Successfully!");
}

void loop() {
  unsigned char len = 0;
  unsigned char buf[8];
  unsigned long id;
  
  int canReceiveStatus = CAN.checkReceive(); // Check if message available
  Serial.print("CAN Receive Status: ");
  Serial.println(canReceiveStatus);
  
  if (canReceiveStatus == CAN_MSGAVAIL) { // Message available
    CAN.readMsgBuf(&id, &len, buf); // Read message into buffer
    Serial.print("Received Message ID: ");
    Serial.println(id, HEX);
    
    if (id == 0x123) { // Check if message ID is correct
      int potValue = (buf[0] << 8) | buf[1]; // Reconstruct analog value from received data
      Serial.print("Received Potentiometer Value: ");
      Serial.println(potValue);
      
      lcd.clear(); // Clear LCD screen
      lcd.setCursor(0, 0);
      lcd.print("Pot Value: ");
      lcd.setCursor(0, 1);
      lcd.print(potValue); // Display potentiometer value
      Serial.println("Potentiometer Value Displayed on LCD!");
    }
  } else {
    Serial.println("No Message Received");
  }
  
  delay(100000); // Adjust delay as needed
}

output of it is
CAN Receive Status: 4

No Message Received
Can you see any problem here Use code tags to format code for the forum

Welcome. This is probably a hardware problem. Since you are using Cory Fowler's library there are send and receive code units, load just those and connect as indicated in the library. If those do not work find out why because anything else will only confuse the possible answer. It is like running, you must walk first.

To receive packets you need to have the interrupt pin connected, check you've got pin 22 to INT on the CAN Bus board and see if it then works.

If @sijones suggestion does not solve your problem post an annotated schematic showing how everything is connected. Show all connections, power, ground, and power sources.

I believe you can also define the PIN using:

#define CAN0_INT 13                              // Set INT to pin 13

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.