Problème compréhension programme can bus

Bonjour , je suis en train d’utiliser le can bus avec arduino pour mon projet de fin d’année.
Le projet est de pouvoir communiquer entre deux arduino par can bus avec un émetteur qui envoi un message et un récepteur qui lis se message pour éxecuter une action .Je bloque sur une partie du programme que j’ai trouvé si quelqu’un peut me donner quelque informations cela pourrait grandement m’aider
Je vous joins la partie de programme
[code
for(int i = 0; i<len; i++)
{
Serial.print(buf*);]*
Merci d’avance

hello
ton code utilise && qui est un AND pour des "booléan", hors ton if fait ce AND entre
LEDON ( variable? booléen? ) et i qui est déclaré integer au début de la boucle for!!!!!
de plus le i ne vaudra 0 que pour le 1er passage de la boucle!!!

ce bout de code (si court ) n'est pas sérieux.

mets nous ton code entier et pas avec des textes en italique

de plus va lire ici pour savoir poster un code entre balises

Désolé c’est la première fois ou je post sur le forum, donc je vous met maintenant le code complet

#include <Canbus.h>
#include <defaults.h>
#include <global.h>
#include <mcp2515.h>
#include <mcp2515_defs.h>

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


// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int LED1=5;//led 1 en broche 5
const int LED2=6;//led 2 en broche 6
const int LED3=7;//led 3 en broche 7
boolean ledON=LOW;
boolean ledoff=HIGH;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
    Serial.begin(115200);
    pinMode(LED1,OUTPUT);//led 1 en sortie
    pinMode(LED2,OUTPUT);//led 2 en sortie
    pinMode(LED3,OUTPUT);//led 3 en sortie
START_INIT:

    if(CAN_OK == CAN.begin(CAN_500KBPS))                   // init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init ok!");//Si can ok alors moniteur serie écrit "CAN BUS Shield init ok!"
    }
    else
    {
        Serial.println("CAN BUS Shield init fail");//Sinon il ecrit "CAN BUS Shield init fail" et "Init CAN BUS Shield again"
        Serial.println("Init CAN BUS Shield again");
        delay(100);//tempo de 100ms
        goto START_INIT;
    }
}


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

    if(CAN_MSGAVAIL == CAN.checkReceive())    // Si il ya des donné et qu'elle sont vérifié
    {
        CAN.readMsgBuf(&len, buf);            // alors reception des données sur le noeud,  len: longueur tram, buf: contenu du message

        unsigned char canId = CAN.getCanId(); //obtenir l'id can du noeud "envoyé"
        
        Serial.println("-----------------------------"); //le moniteur série ecrit "----------------"
        Serial.println("get data from ID: "); // le moniteur série ecrit "get data from id:"
        Serial.println(canId);                //le moniteur série écrit l'id 

        for(int i = 0; i<len; i++)            // print the data
        {
            Serial.print(buf[i]);
            Serial.print("\t");
            if(ledON && i==0)
            {
             
              digitalWrite(LED1,HIGH);
      
              delay(500);
              ledON=LOW;
              }
            else if((!(ledON)) && i==1){
              
              digitalWrite(LED1,LOW);
              ledON=HIGH;
              
              }
              
               }
        Serial.println();
    }
}

Bonjour,

Tu as des raisons de bloquer sur ce bout de code tarabiscoté.
D’après ce que j’ai compris l’auteur veut faire pulser la led à l’affichage du premier caractère. Pour ça il allume la led à l’affichage du 1er caractère, attend 500ms et l’éteint à l’affichage du 2eme caractère.
Ceci peut être fait beaucoup plus simplement.

   for (int i = 0; i < len; i++)         // print the data
   {
     Serial.print(buf[i]);
     Serial.print("\t");
     if (i == 0)
     {
       digitalWrite(LED1, HIGH);
       delay(500);
       digitalWrite(LED1, LOW);
     }
   }

J’ajoute quand même que c’est une mauvaise idée de mettre un delay() dans l’affichage du message, ça risque de te faire perdre des messages CAN.

Merci pour votre modification elle ma permis de un peu mieux comprendre ,
je vous explique en détail se que je souhaite faire
J'ai 3 bouton poussoir sur mon arduino émeteur qui envoi chacun un code différent , et 3 led sur l'arduino récepteur.
Ce que je voudrais :
a l'appui du bp 1 j'envoie le code 1 qui allume la led 1
si j'appuie de nouveau sur ce même bp la led s'éteint

pouvez vous m'orienter pour que je puisse faire mes deux dernier bouton tout seul ?
je vous met mon code "émetteur"

const int SPI_CS_PIN = 10;
const int BP=3;// bp1 en broche 3
const int BP2=4;//bp2 en broche 4
const int BP3=5;//bp3 en broche 5
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
    Serial.begin(115200);
    pinMode(BP,INPUT);//bp en entrée
    pinMode(BP2,INPUT);//bp2 en entrée
    pinMode(BP3,INPUT);//bp3 en entrée

START_INIT:

    if(CAN_OK == CAN.begin(CAN_500KBPS))// init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init ok!");
    }
    else
    {
        Serial.println("CAN BUS Shield init fail");
        Serial.println("Init CAN BUS Shield again");
        delay(100);
        goto START_INIT;
    }
}

unsigned char bp1[8] = {0, 1, 2, 3, 4, 5, 6, 7};
unsigned char bp2[8] = {0, 0, 0, 0, 0, 0, 0, 1};
unsigned char bp3[8] = {1, 1, 1, 1, 1, 1, 1, 0};

void loop()
{int test = digitalRead(BP);//test est égal à l'etat du bp1
int testt = digitalRead(BP2);//test est égal à l'etat du bp2
int testtt = digitalRead(BP3);//test est égal à l'etat du bp3
   
if(test==HIGH)
CAN.sendMsgBuf(0x00, 0, 8, bp1);// envoyé données:  id = 0x00, tram standars car 0, longueur de la tram = 8, bp1: contenu du message
    delay(100);                       // send data per 100ms

if(testt==HIGH)
CAN.sendMsgBuf(0x01, 0, 8, bp2);// envoyé données:  id = 0x01, tram standars car 0, longueur de la tram = 8, bp2: contenu du message
    delay(100);

if(testtt==HIGH)
CAN.sendMsgBuf(0x02, 0, 8, bp3);// envoyé données:  id = 0x02, tram standars car 0, longueur de la tram = 8, bp3: contenu du message
    delay(100);
      
}

ton code est incomplet
il manque les librairies

va voir tu trouvera la librairie et ses exemples

ah mince mes librairie sont installé mais je pensais ne pas devoir les induire dans mon code ici
donc je vous le remet , desolé encore je suis nouveaux

#include <Canbus.h>
#include <defaults.h>
#include <global.h>
#include <mcp2515.h>
#include <mcp2515_defs.h>

// demo: CAN-BUS Shield, send data
#include <mcp_can.h>
#include <SPI.h>

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int BP=3;// bp1 en broche 3
const int BP2=4;//bp2 en broche 4
const int BP3=5;//bp3 en broche 5
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
    Serial.begin(115200);
    pinMode(BP,INPUT);//bp en entrée
    pinMode(BP2,INPUT);//bp2 en entrée
    pinMode(BP3,INPUT);//bp3 en entrée

START_INIT:

    if(CAN_OK == CAN.begin(CAN_500KBPS))// init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init ok!");
    }
    else
    {
        Serial.println("CAN BUS Shield init fail");
        Serial.println("Init CAN BUS Shield again");
        delay(100);
        goto START_INIT;
    }
}

unsigned char bp1[8] = {0, 1, 2, 3, 4, 5, 6, 7};
unsigned char bp2[8] = {0, 0, 0, 0, 0, 0, 0, 1};
unsigned char bp3[8] = {1, 1, 1, 1, 1, 1, 1, 0};

void loop()
{int test = digitalRead(BP);//test est égal à l'etat du bp1
int testt = digitalRead(BP2);//test est égal à l'etat du bp2
int testtt = digitalRead(BP3);//test est égal à l'etat du bp3
   
if(test==HIGH)
CAN.sendMsgBuf(0x00, 0, 8, bp1);// envoyé données:  id = 0x00, tram standars car 0, longueur de la tram = 8, bp1: contenu du message
    delay(100);                       // send data per 100ms

if(testt==HIGH)
CAN.sendMsgBuf(0x01, 0, 8, bp2);// envoyé données:  id = 0x01, tram standars car 0, longueur de la tram = 8, bp2: contenu du message
    delay(100);

if(testtt==HIGH)
CAN.sendMsgBuf(0x02, 0, 8, bp3);// envoyé données:  id = 0x02, tram standars car 0, longueur de la tram = 8, bp3: contenu du message
    delay(100);
      
}

Tu peux traiter ton problème d'allumage/extinction à l'émission ou à la réception.
Je pense qu'il est plus simple de le traiter à la réception.

Tout d'abord à l'émission il faut envoyer le message uniquement quand tu appuies sur le bouton et non tant que le bouton est appuyé.
Ce qui donne pour le premier bouton:

 static int testPrecedent = LOW;
  int test = digitalRead(BP);//test est égal à l'etat du bp1

  if (test == HIGH && testPrecedent == LOW)
   CAN.sendMsgBuf(0x00, 0, 8, bp1);// envoyé données:  id = 0x00, tram standars car 0, longueur de la tram = 8, bp1: contenu du message

  testPrecedent=test;
  delay(10);                       // pour le traitement anti rebond

J'ai fait un traitement basique pour savoir si le bouton vient d'être enfoncé, tu peux aussi utiliser La librairie boutons poussoirs de notre ami bricoleau.

A la réception tu fais basculer l'état de la led suivant l'id reçu

 switch (canId)
  {
    case 0x00:
      if (digitalRead(LED1)==LOW)
        digitalWrite(LED1,HIGH);
      else
        digitalWrite(LED1,LOW);
      break;
// case 0x01 ...      
  }

Attention: LED1 est utilisé pour l'affichage de la réception du message CAN. Soit il faut supprimer cet affichage soit utiliser une autre led.

Voilà il ne te restes plus qu'à faire de même pour les autres boutons.
Bonus: plutôt que de dupliquer le code pour tous le boutons, tu peux t’entraîner à utiliser une boucle for.

Merci à vous cela fonctionne , or mes led émettent seulement une impulsion or je veux qu'elle reste allumé et qu'elle s'éteigne lors que je renvoi le même message
je vous donne un exemple pour une led :

=>J'appuie sur bp1
=>arduino émetteur envoi code 1
=>arduino récepteur reçoit code 1 et allume la led
=>J'"appui sur bp1
=>envoi code 1
=>arduino récepteur reçoit code 1 et éteint ma led

en gros ma à la reception du message ma led reste allumé jusqu'à la prochaine réception de ce message

C'est ce que c'est supposé faire.
Tu as bien fait attention a ça?

Attention: LED1 est utilisé pour l'affichage de la réception du message CAN. Soit il faut supprimer cet affichage soit utiliser une autre led.

euh non pas vraiment , je ne vois pas trop comment faire ... je suis debutant et je trouve que commencer par du can bus est très compliqué pour moi, mais bon je suis obligé...
Il y a encore deux point que je ne comprend pas ,
que signifie la fonction static int testPrecedent = LOW;
et comment supprimé cette affichage pour la led1?

met en commentaires l’action sur led1 lors de l’affichage de la trame can car il utilise aussi LED1

  for (int i = 0; i < len; i++)         // print the data
  {
    Serial.print(buf[i]);
    Serial.print("\t");
    if (i == 0)
    {
//       digitalWrite(LED1, HIGH);
//       delay(500);
//       digitalWrite(LED1, LOW);
    }
  }

J’ai fais tout ça mais mes deux autres led reste allumé 3 seconde et s’éteigne , pouvez vous me dire pourquoi elle ne reste pas allumé ? je vous met mon code recepteur:

// demo: CAN-BUS Shield, receive data with check mode
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13


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


// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int LED1=5;
const int LED2=6;
const int LED3=7;
boolean ledON=1;
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
    Serial.begin(115200);
    pinMode(LED1,OUTPUT);//
    pinMode(LED2,OUTPUT);//
    pinMode(LED3,OUTPUT);//

START_INIT:

    if(CAN_OK == CAN.begin(CAN_500KBPS))                   // init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init ok!");//
    }
    else
    {
        Serial.println("CAN BUS Shield init fail");//
        Serial.println("Init CAN BUS Shield again");//
        delay(100);//
        goto START_INIT;
    }
}


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

    if(CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
    {
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

        unsigned char canId = CAN.getCanId();
        
        Serial.println("-----------------------------");
        Serial.println("get data from ID: ");
        Serial.println(canId);

        for(int i = 0; i<len; i++)    // print the data
        {
            Serial.print(buf[i]);
            Serial.print("\t");
         switch (canId)//Test les conditions pour les differents id reçu
  {
    case 0x00://Dans le cas ou on obtien l'id 0x00
      if (digitalRead(LED1)==LOW)//Si l'état de la led est à 0
        //{digitalWrite(LED1,HIGH);//alors led1 High
       // delay(500);}
      //else
        //digitalWrite(LED1,LOW);//sinon led1 Low
      break;
       case 0x01://Dans le cas ou l'on obtient l'id 0x01
      if (digitalRead(LED2)==LOW)//si l'état de la led est a 0
        {digitalWrite(LED2,HIGH);//alors led2 HIGH
        delay(500);}
      else
        digitalWrite(LED2,LOW);//SINON led2 LOW
     break;
       case 0x02://Dans le cas ou l'on obtient l'id 0x02
      if (digitalRead(LED3)==LOW)//si l'état de la led est a 0
        {digitalWrite(LED3,HIGH);//alors led3 HIGH
        delay(500);}
      else
        digitalWrite(LED3,LOW);//sinon led3 LOW
      break;
   
  }
              
              
        }
        Serial.println();
    }
}

Ton switch est mal placé. Il ne doit pas être fait à chaque caractère, mais à chaque message.
Comme ceci

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

    if (CAN_MSGAVAIL == CAN.checkReceive())           // check if data coming
    {
      CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

      unsigned char canId = CAN.getCanId();

      Serial.println("-----------------------------");
      Serial.println("get data from ID: ");
      Serial.println(canId);

      for (int i = 0; i < len; i++) // print the data
      {
        Serial.print(buf[i]);
        Serial.print("\t");
      }
    }
    Serial.println();

    switch (canId)//Test les conditions pour les differents id reçu
    {
      case 0x00://Dans le cas ou on obtien l'id 0x00
        if (digitalRead(LED1) == LOW) //Si l'état de la led est à 0
          digitalWrite(LED1, HIGH); //alors led1 High
        else
          digitalWrite(LED1, LOW); //sinon led1 Low
        break;
      case 0x01://Dans le cas ou l'on obtient l'id 0x01
        if (digitalRead(LED2) == LOW) //si l'état de la led est a 0
          digitalWrite(LED2, HIGH); //alors led2 HIGH
        else
          digitalWrite(LED2, LOW); //SINON led2 LOW
        break;
      case 0x02://Dans le cas ou l'on obtient l'id 0x02
        if (digitalRead(LED3) == LOW) //si l'état de la led est a 0
          digitalWrite(LED3, HIGH); //alors led3 HIGH
        else
          digitalWrite(LED3, LOW); //sinon led3 LOW
        break;

    }
  }
}

J’ai apporté les modifications à mon programme mais plusieurs problèmes sont survenu:
-dans mon moniteur série ma fonction Serial.println("-----------------------------"); s’affiche à coté de mon 7 à la place de se mettre en dessou.
Ensuite quand j’appui en continu sur un bp cela m’envoi des messages en continu dans le moniteur serie
et je n’ai plus aucune led qui s’allume
je vous join mes deux programme
emetteur :

#include <Canbus.h>
#include <defaults.h>
#include <global.h>
#include <mcp2515.h>
#include <mcp2515_defs.h>

// demo: CAN-BUS Shield, send data
#include <mcp_can.h>
#include <SPI.h>

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int BP=3;// bp1 en broche 3
const int BP2=4;//bp2 en broche 4
const int BP3=5;//bp3 en broche 5

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
    Serial.begin(115200);
    pinMode(BP,INPUT);//bp en entrée
    pinMode(BP2,INPUT);//bp2 en entrée
    pinMode(BP3,INPUT);//bp3 en entrée

START_INIT:

    if(CAN_OK == CAN.begin(CAN_500KBPS))// init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init ok!");
    }
    else
    {
        Serial.println("CAN BUS Shield init fail");
        Serial.println("Init CAN BUS Shield again");
        delay(100);
        goto START_INIT;
    }
}

unsigned char bp1[8] = {0, 1, 2, 3, 4, 5, 6, 7};
unsigned char bp2[8] = {0, 0, 0, 0, 0, 0, 0, 1};
unsigned char bp3[8] = {1, 1, 1, 1, 1, 1, 1, 0};

void loop(){
static int testPrecedent = LOW;
int test = digitalRead(BP);//test est égal à l'etat du bp1
int testt = digitalRead(BP2);//test est égal à l'etat du bp2
int testtt = digitalRead(BP3);//test est égal à l'etat du bp3
 
  

  if (test == HIGH && testPrecedent == LOW)
   CAN.sendMsgBuf(0x00, 0, 8, bp1);// envoyé données:  id = 0x00, tram standars car 0, longueur de la tram = 8, bp1: contenu du message
 testPrecedent=test;
  delay(10);                   // pour le traitement anti rebond



  if (testt == HIGH && testPrecedent == LOW)
CAN.sendMsgBuf(0x01, 0, 8, bp2);// envoyé données:  id = 0x01, tram standars car 0, longueur de la tram = 8, bp2: contenu du message
    testPrecedent=testt;
    delay(10);


  if (testtt == HIGH && testPrecedent == LOW)
CAN.sendMsgBuf(0x02, 0, 8, bp3);// envoyé données:  id = 0x02, tram standars car 0, longueur de la tram = 8, bp3: contenu du message
    testPrecedent=testtt;
    delay(10);
      
}

et recepteur :

#include <Canbus.h>
#include <defaults.h>
#include <global.h>
#include <mcp2515.h>
#include <mcp2515_defs.h>

// demo: CAN-BUS Shield, receive data with check mode
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13


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


// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int LED1=5;
const int LED2=6;
const int LED3=7;
int canId;
boolean ledON=1;
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
    Serial.begin(115200);
    pinMode(LED1,OUTPUT);//
    pinMode(LED2,OUTPUT);//
    pinMode(LED3,OUTPUT);//

START_INIT:

    if(CAN_OK == CAN.begin(CAN_500KBPS))                   // init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init ok!");//
    }
    else
    {
        Serial.println("CAN BUS Shield init fail");//
        Serial.println("Init CAN BUS Shield again");//
        delay(100);//
        goto START_INIT;
    }
}



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

    if (CAN_MSGAVAIL == CAN.checkReceive())           // check if data coming
    {
      CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

      unsigned char canId = CAN.getCanId();

      Serial.println("-----------------------------");
      Serial.println("get data from ID: ");
      Serial.println(canId);

      for (int i = 0; i < len; i++) // print the data
      {
        Serial.print(buf[i]);
        Serial.print("\t");
        }
    }
 
    switch (canId)//Test les conditions pour les differents id reçu
    {
    case 0x00://Dans le cas ou on obtien l'id 0x00
    if (digitalRead(LED1) == LOW) //Si l'état de la led est à 0
    //  digitalWrite(LED1, HIGH); //alors led1 High
    //else
    //  digitalWrite(LED1, LOW); //sinon led1 Low
    break;
      case 0x01://Dans le cas ou l'on obtient l'id 0x01
        if (digitalRead(LED2) == LOW) //si l'état de la led est a 0
          digitalWrite(LED2, HIGH); //alors led2 HIGH
        else
          digitalWrite(LED2, LOW); //SINON led2 LOW
        break;
      case 0x02://Dans le cas ou l'on obtient l'id 0x02
        if (digitalRead(LED3) == LOW) //si l'état de la led est a 0
          digitalWrite(LED3, HIGH); //alors led3 HIGH
        else
          digitalWrite(LED3, LOW); //sinon led3 LOW
        break;
        
 Serial.println();
    }
  }

Ps : Kamill je vous ai envoyé un message

J’ai fais les modifications sur mon programmes mais mes led ne s’allume toujours pas quand je reçoit un message , je ne sait pas si ça viens de mon câblage ou des mes programme
pour ce qui est du câblage de mes led : la patte la plus longue est relié à une resistance (bien calculé) , la resistrance à la borne 6(pour la led 2) et pour la patte la plus courte au gnd
je vous met les programmes pour savoir si le probleme viens de mon cablage ou du programme
-code emetteur

#include <Canbus.h>
#include <defaults.h>
#include <global.h>
#include <mcp2515.h>
#include <mcp2515_defs.h>

// demo: CAN-BUS Shield, send data
#include <mcp_can.h>
#include <SPI.h>

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int BP = 3; // bp1 en broche 3
const int BP2 = 4; //bp2 en broche 4
const int BP3 = 5; //bp3 en broche 5

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
  Serial.begin(115200);
  pinMode(BP, INPUT); //bp en entrée
  pinMode(BP2, INPUT); //bp2 en entrée
  pinMode(BP3, INPUT); //bp3 en entrée

START_INIT:

  if (CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k
  {
    Serial.println("CAN BUS Shield init ok!");
  }
  else
  {
    Serial.println("CAN BUS Shield init fail");
    Serial.println("Init CAN BUS Shield again");
    delay(100);
    goto START_INIT;
  }
}

unsigned char bp1[8] = {0, 1, 2, 3, 4, 5, 6, 7};
unsigned char bp2[8] = {0, 0, 0, 0, 0, 0, 0, 1};
unsigned char bp3[8] = {1, 1, 1, 1, 1, 1, 1, 0};

void loop() {
  static int testPrecedent1 = LOW;
  static int testPrecedent2 = LOW;
  static int testPrecedent3 = LOW;

  int test1 = digitalRead(BP);//test est égal à l'etat du bp1
  if (test1 == HIGH && testPrecedent1 == LOW)
    CAN.sendMsgBuf(0x00, 0, 8, bp1);// envoyé données:  id = 0x00, tram standars car 0, longueur de la tram = 8, bp1: contenu du message
  testPrecedent1 = test1;

  int test2 = digitalRead(BP2);//test est égal à l'etat du bp2
  if (test2 == HIGH && testPrecedent2 == LOW)
    CAN.sendMsgBuf(0x01, 0, 8, bp2);// envoyé données:  id = 0x01, tram standars car 0, longueur de la tram = 8, bp2: contenu du message
  testPrecedent2 = test2;

  int test3 = digitalRead(BP3);//test est égal à l'etat du bp3
  if (test3 == HIGH && testPrecedent3 == LOW)
    CAN.sendMsgBuf(0x02, 0, 8, bp3);// envoyé données:  id = 0x02, tram standars car 0, longueur de la tram = 8, bp3: contenu du message
  testPrecedent3 = test3;

  delay(20);
}

code recepteur :

#include <Canbus.h>


// demo: CAN-BUS Shield, receive data with check mode
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13


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


// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int LED1 = 5;
const int LED2 = 6;
const int LED3 = 7;
int canId;
boolean ledON = 1;
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
  Serial.begin(115200);
  pinMode(LED1, OUTPUT); //
  pinMode(LED2, OUTPUT); //
  pinMode(LED3, OUTPUT); //

START_INIT:

  if (CAN_OK == CAN.begin(CAN_500KBPS))                  // init can bus : baudrate = 500k
  {
    Serial.println("CAN BUS Shield init ok!");//
  }
  else
  {
    Serial.println("CAN BUS Shield init fail");//
    Serial.println("Init CAN BUS Shield again");//
    delay(100);//
    goto START_INIT;
  }
}


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

  if (CAN_MSGAVAIL == CAN.checkReceive())           // check if data coming
  {
    CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

    unsigned char canId = CAN.getCanId();

    Serial.println("-----------------------------");
    Serial.println("get data from ID: ");
    Serial.println(canId);

    for (int i = 0; i < len; i++) // print the data
    {
      Serial.print(buf[i]);
      Serial.print("\t");
    }
  }
  

  switch (canId)//Test les conditions pour les differents id reçu
  {
    case 0x00://Dans le cas ou on obtien l'id 0x00
      if (digitalRead(LED1) == LOW) //Si l'état de la led est à 0
        //digitalWrite(LED1, HIGH); //alors led1 High
      //else
        //digitalWrite(LED1, LOW); //sinon led1 Low
      break;
    case 0x01://Dans le cas ou l'on obtient l'id 0x01
      if (digitalRead(LED2) == LOW) //si l'état de la led est a 0
        digitalWrite(LED2, HIGH); //alors led2 HIGH
      else
        digitalWrite(LED2, LOW); //SINON led2 LOW
      break;
    case 0x02://Dans le cas ou l'on obtient l'id 0x02
      if (digitalRead(LED3) == LOW) //si l'état de la led est a 0
        digitalWrite(LED3, HIGH); //alors led3 HIGH
      else
        digitalWrite(LED3, LOW); //sinon led3 LOW
      break;
Serial.println();
  }
}

La patte le plus longue est l'anode, donc elle est bien cablée.
Est ce que tu reçois bien les messages? Qu'est ce qui s'affiche sur le moniteur série?

oui je reçoit très bien les messages ( une bonne chose !)
quand j'appui sur bp1 il m'envoi message 1
quand j'appui sur bp2 il m'envoi le message 2
etc

Qu'est ce qui s'affiche sur le moniteur série en réception?

D'après le programme tu devrais avoir qqchose comme:
get data from ID: ........

Voila se qui est ecrit une fois que j'ai appuyé sur mes 3 boutons en commencent par le 1
"CAN BUS SHIELD INIT OK !

get data from id :
0
0 1 2 3 4 5 6 7------------------
get data from id :
1
0 0 0 0 0 0 0 1------------------
get data from id :
2
1 1 1 1 1 1 1 0----------------