CAN bus no arduino

Teste a placa adaptadora CAN bus MCP2515 usada na comunicação entre 2 arduinos nano.

 

O teste foi efectuado com base no tutorial disponível em:

https://www.electronicshub.org/arduino-mcp2515-can-bus-tutorial/

Hardware para teste CAN bus no arduino

Para realizar o teste é necessário 2 adaptadores CAN bus MCP2515 e 2 arduinos. Cada um dos pares funciona respectivamente como transmissor ou receptor, executando programas diferentes.

Ligações entre Arduino e o adaptador CAN bus

As ligações são conforme o diagrama copiado do site com o tutorial e apresentado abaixo.

Software para teste CAN bus no arduino

O programa de teste faz uso de um biblioteca para efectuar a gestão do protocolo CAN bus acessível através do interface SPI.

A biblioteca está disponível no seguinte endereço:

https://github.com/Seeed-Studio/CAN_BUS_Shield

Existe um programa para o transmissor e outro para o receptor. Ambos estão disponíveis abaixo e correm cada um no respectivo micro controlador.

Arduino CAN bus Transmitter Code

#include 
#include 

const int spiCSPin = 10;
int ledHIGH    = 1;
int ledLOW     = 0;

MCP_CAN CAN(spiCSPin);

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

    while (CAN_OK != CAN.begin(CAN_500KBPS))
    {
        Serial.println("CAN BUS init Failed");
        delay(100);
    }
    Serial.println("CAN BUS Shield Init OK!");
}

unsigned char stmp[8] = {ledHIGH, 1, 2, 3, ledLOW, 5, 6, 7};
    
void loop()
{   
  Serial.println("In loop");
  CAN.sendMsgBuf(0x43, 0, 8, stmp);
  delay(1000);
}

Arduino CAN bus Receiver Code

#include 
#include "mcp_can.h"

const int spiCSPin = 10;
const int ledPin = 2;
boolean ledON = 1;

MCP_CAN CAN(spiCSPin);

void setup()
{
    Serial.begin(115200);
    pinMode(ledPin,OUTPUT);

    while (CAN_OK != CAN.begin(CAN_500KBPS))
    {
        Serial.println("CAN BUS Init Failed");
        delay(100);
    }
    Serial.println("CAN BUS  Init OK!");
}


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

    if(CAN_MSGAVAIL == CAN.checkReceive())
    {
        CAN.readMsgBuf(&len, buf);

        unsigned long canId = CAN.getCanId();

        Serial.println("-----------------------------");
        Serial.print("Data from ID: 0x");
        Serial.println(canId, HEX);

        for(int i = 0; i<len; i++)
        {
            Serial.print(buf[i]);
            Serial.print("\t");
            if(ledON && i==0)
            {

                digitalWrite(ledPin, buf[i]);
                ledON = 0;
                delay(500);
            }
            else if((!(ledON)) && i==4)
            {

                digitalWrite(ledPin, buf[i]);
                ledON = 1;
            }
        }
        Serial.println();
    }
}