Aquisition de données BUS-Can sur port OBD2

Bonjours a tous,

Comme l’indique le titre , je souhaite faire l’acquisition de plusieurs données Can sur mon véhicule , pour ensuite pouvoir les retransmettre sur un petit afficheur LCD 2.4" .

Pour cela j’utilise un arduino Mega 2560, un shield MCP2515 Tja1050 , un écran LCD Nextion .

Je suis totalement débutant dans le monde de l’arduino et de sa programmation .
Pour le moment j’en suis au point ou j’arrive a me connecter au réseau CAN, en passant par 2 câbles PT_CAN présent derrière l’écran de mon véhicule et obtenir tous un tas de données qui sont mélanger.

J’ai des ID standars 11 bits et des ID étendu 29bits .

J’aimerais filtrer c’est données pour ne recevoir par exemple uniquement le 0x0AA qui correspond au régime moteur .

Ou encore le 0x1D0 : Température moteur .

Mais voila j’ai du mal avec les Mask et filter dans le sketch , et lorsque j’essaie de filtrer c’est 2 ID ( 0x0AA et 0x1D0) je n’obtiens plus aucune données.

Si un spécialiste de la programmation pouvait jeter un œil a mon sketch pour me dire se qu’il en pense.
Je lui en serais reconnaissant .

//Essaie filtre ID can BMW serie 5 E60
//0x0AA  Régime moteur , Byte 4&5= RPM formule ((Byte[5]x256)+Byte[4])/4= RPM
//0x1D0  Temp   moteur , Byte 0= ?°C   formule   Byte[0]-48= temp liquide refroid °C
    

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

unsigned char Flag_Recv = 0;
long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
char msgString[128];          

#define CAN0_INT 2 
MCP_CAN CAN0(53);

//---------------------------------  SETUP  -------------------------
void setup()
{
   Serial.begin(115200);
  
  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)
    Serial.println("MCP2515 Initialized Successfully!");
  else
    Serial.println("Error Initializing MCP2515...");
  
  CAN0.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.

  pinMode(CAN0_INT, INPUT);                            // Configuring pin for /INT input
  
  Serial.println("MCP2515 Library Receive Example...");

    //Set filter masks
    CAN0.init_Mask(0, 0, 0xfff);
    CAN0.init_Mask(1, 0, 0xfff);

    //      -----------     Set filters     -------------
 //  CAN0.init_Filt(0, 0, 0x1d0); // temperature moteur 
     CAN0.init_Filt(0, 0, 0x0aa); // regime moteur

    Serial.println("time,CAN-ID,b0,b1,b2,b3,b4,b5,b6,b7");
  //  Serial.println();
}
//--------------------------     BOUCLE    ---------------------------------
void loop(){
    unsigned char length = 0;
    unsigned char data[8];

    // Print in CSV format
    if(CAN_MSGAVAIL == CAN0.checkReceive())
    {
       CAN0.readMsgBuf(&rxId, &len, rxBuf);      // Read data: len = data length, buf = data byte(s)
      if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
    else
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
  
    Serial.print(msgString);
  
    if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for(byte i = 0; i<len; i++){
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
        Serial.print(msgString);
   }
    }
        
    Serial.println();
  }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

Receive_1D0_0AA.ino.ino (2.69 KB)

Je me répond a moi mème , j’ai enfin réussi a filtrer 2 ID dans le véhicule .

J’essaie maintenant d’intégrer une formule de calcule pour affiche un Tr/min d’apres une des 2 infos reçu .

Le calcul qui est le suivant ((Byte[5] * 256) + Byte[4] ) / 4 correspond tres bien avec l’aiguille dans le compteur .

Reste maintenant a savoir comment l’intégrer au sketch

Apres plusieurs jours d'essaie et de recherche , j'ai reussi a integrer :

Regime moteur en tr/min

Temperature d'eau du moteur

Temparature de l'huile

Le couple de sortie du moteur

Les chevaux développer en fonction du regime et du couple moteur .

J'ai créer une page y integrant toute ces données a l'aide du compilateur Nextion .

hello
bravo, la persévérance paie. :slight_smile:

dfgh:
hello
bravo, la persévérance paie. :slight_smile:

Merci

Et oui cela fait des jours que je suis sur ce projets, mais j’ai encore quelques problème .

Pour avoir certaines informations que le BUS ne transmet pas nécessairement ( si j’ai bien comprit ) comme par exemple, la Pression de turbo .

Puisque cette information n’interagis pas avec les autres calculateur de la voiture, celle ci n’est diffuser sur le réseau CAN que si on en fait la demande .

C’est la mon problème … je n’ai pas comprit comment appel t’on un ID à transmettre sur le réseau ?

Exemple si j’ai besoin de L’ID 0xDF ou 0x00DF ?
Comment lancer un RTR ou "remote trame request " si j’ai bon ?

Bien joué pour le travail déja accompli !

Qui pourrais m'aider a trouver comment appeler un ID 0x91 dans le Can bus

J'ai du mal a comprendre comment fonctionne le remote frame request