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:
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();
}
}
