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