Bonjour à tous,
J'ai pour projet de transmettre des données capteurs via un bus CAN entre deux cartes Arudino. L'une étant une Arduino mega 2560 et l'autre une Uno elego R3.
Le module BUS CAN étant le mcp2515.
Dans un premier temps j'essaie simplement d'envoyer un message puis, lorsque j'arriverai à l'envoyer je changerai ce message par mes données capteurs.
J'ai câblé mes deux cartes et mes deux modules BUS CAN comme le montre la figure-ci :
Les pins sont reliés comme-ci :
Module CAN | Arduino Mega 2560 | Arduino uno
SCK | 52 | 13
SO | 50 | 12
SI | 51 | 11
CS | 53 | 10
INT | 2 | 2
Voici le code que j'ai réalisé en m'aidant de certains exemples disponibles :
- Partie emission :
#include <SPI.h> //Library for using SPI Communication
#include <mcp2515.h> //Library for using CAN Communication
struct can_frame canMsg1; //pot message
MCP2515 mcp2515(10); // port CLK carte Arduino UNO
void setup()
{
Serial.begin(9600);
SPI.begin(); //Begins SPI communication
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS,MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz
mcp2515.setNormalMode();
canMsg1.can_id = 0xAA; //Id CAN : 0xAA
canMsg1.can_dlc = 2; //longueur données CAN : 2
}
void loop()
{
Serial.print(canMsg1.can_id);
canMsg1.data[0] = 12; //Valeur envoyée sur data[0]
canMsg1.data[1]= 987; // Valeur envoyée sur data [1]
mcp2515.sendMessage(&canMsg1); //Sends the CAN message
delay(200);
}
- Partie réception :
#include <SPI.h> //Library for using SPI Communication
#include <mcp2515.h> //Library for using CAN Communication
#include <Wire.h>
struct can_frame canMsg1;
MCP2515 mcp2515(53); // Port CS Arduino Mega
void setup() {
delay(1000);
SPI.begin(); //Begins SPI communication
Serial.begin(9600); //Begins Serial Communication at 9600 baudrate
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS,MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz
mcp2515.setNormalMode(); //Sets CAN at normal mode
}
void loop()
{
if (mcp2515.readMessage(&canMsg1) == MCP2515::ERROR_OK) // To receive data (Poll Read)
{
if(canMsg1.can_id==0xAA)
{
int x = canMsg1.data[0];
Serial.println(x);
delay(200);
}
}
delay(20);
}
Lorsque j'analyse mon port série (à l'aide du logiciel MODICOM), je constate que je transmets bien mon message, cependant je ne le reçois pas, la condition if (mcp2515.readMessage(&canMsg1) == MCP2515::ERROR_OK) n'est jamais à '1'.
J'ai essayé d'autres librairies et toujours le même problème. J'ai également essayé de mettre une masse commune mais cela ne m'a pas permis de me debloquer,
Pensez-vous que cela peut venir du fait que ça ne soit pas les mêmes types de carte Arduino ?
Je me demande également si cela ne vient pas de la pin INT, car je n'y touche pas du tout dans mon programme
Je publie donc ce sujet pour savoir si quelqu'un aurait une idée ou une piste pour essayer de résoudre cette issue,
En vous remerciant pour le temps que vous consacrerez à ce topic,