Bonjour à tous,
Je voudrais utiliser un joystick communiquant en LIN BUS pour contrôler une électrovanne en PWM.
Le joystick consiste en 2 contrôleurs lin esclave.
Ci-joint, le signal lin bus, en dessous, le signal en direct sur le contrôleur et au dessous, le signal après transformation en UART. (j'utilise pour ce faire un MCP2004A).
Les trames LIN commencent toujours pas 0x55
Je voudrais récupérer les trames des ID 0xA8 et 0xE9
Il y a 8 bytes de data
La trame se termine par un checksumm (voir calcul).
Ci-dessous, les 2 trames que je voudrais récupérer.
Voici mon code arduino actuel pour voir ce que je peux récupérer
//----------------LCD---------
#include <LiquidCrystal.h>
#define RS 12 //Register Select
#define E 11 //Enable
#define D4 5 //Ligne de données 4
#define D5 4 //Ligne de données 5
#define D6 3 //Ligne de données 6
#define D7 2 //Ligne de données 7
#define COLS 16 //Nombre de colonnes
#define ROWS 2 //Nombre de lignes
LiquidCrystal lcd(RS, E, D4, D5, D6, D7); //Instanciation de l'objet
//-------------Variable joystick-----------------
int x_axis; //Variable valeur axe X
int y_axis; // Variable Valeur axe Y
int z_axis; //Variable valeur axe Z
//-----------Variable LIN BUS------------------
const byte sync_byte = 0x55;
const byte id_joystick = 0xA8;
//const byte id_poignée = 0xE9;
//-----------Variable pour code--------------
byte inByte[9];
void setup() {
Serial.begin(19200);
lcd.begin(COLS, ROWS);
}
void loop() {
//---------------Interrogation du bus série et afficahge du résultat------------------------
byte data[10];
byte rec[10];
if (Serial.read() != -1) {
if (Serial.read() == 0x55){
Serial.readBytes(rec, 10);
for (int j = 0; j < 10; j++) {
data[j] = rec[j];
}
}
}
//-----------------------Affichage sur moniteur série--------------------------------------
Serial.println("Traffic detected");
Serial.print("Ident Byte: ");
Serial.println(data[0], HEX);
Serial.print("Data Byte1: ");
Serial.println(data[1], HEX);
Serial.print("Data Byte2: ");
Serial.println(data[2], HEX);
Serial.print("Data Byte3: ");
Serial.println(data[3], HEX);
Serial.print("Data Byte4: ");
Serial.println(data[4], HEX);
Serial.print("Data Byte5: ");
Serial.println(data[5], HEX);
Serial.print("Data Byte6: ");
Serial.println(data[6], HEX);
Serial.print("Data Byte7: ");
Serial.println(data[7], HEX);
Serial.print("Data Byte8: ");
Serial.println(data[8], HEX);
Serial.print("Check Byte: ");
Serial.println(data[9], HEX);
Serial.print("\n");
}
Avec ce code, je récupère bien les trames, mais je vois bien qu'il manque des valeurs. (les trames ne sont pas complètes) et que toutes les valeurs se mélangent
A quoi cela pourrait être dû?
J'utilise le même port série pour lire les valeurs du lin et envoyer au moniteur série, cela pourrait il poser un problème?
Mon autre question est liée au calcul du checksum.
Je parviens à le calculer, mais ne comprend pas comment l'implémenter dans le code.
J'ai trouver ce morceau de code, mais je ne le comprends pas
/* Lin defines its checksum as an inverted 8 bit sum with carry */
uint8_t Lin::dataChecksum(const uint8_t* message, char nBytes,uint16_t sum)
{
while (nBytes-- > 0) sum += *(message++);
// Add the carry
while(sum>>8) // In case adding the carry causes another carry
sum = (sum&255)+(sum>>8);
return (~sum);
}
J'éspère avoir été assé clair dans mes explications.
D'avance, merci