Go Down

Topic: Projet Control module (Read 13450 times) previous topic - next topic

200sx200

#165
Sep 09, 2017, 05:35 pm Last Edit: Sep 09, 2017, 08:08 pm by 200sx200
J'ai essayé et j'obtiens rien sur le Tx, mais j'ai reçue le LM358 donc je vais tester avec.  

Edit:

Donc c'est bon avec le nouveau montage j'ai plein de données :) 




Et cette fois cela provient bien de l'écu, maintenant je n'ai pas encore les 2 condensateurs à brancher sur la masse (pas encore reçue) donc j'ai peut être des valeurs erronées ?

Je vais donc essayer de filtré au moins une donnée pour tester le fonctionnement.

je fais comme avec les lettres ?  switch (inByte) {   case 'Z': ....

trimarco232

et c'est l'arduino qui envoie les requêtes ?

200sx200

non, seulement de la recup, quand la connexion entre PC écu est faite ;)

200sx200

J'ai fini par réussir à séparer les valeurs.

D'après le protocole, l'écu envoie "FF" suivi du nombre de byte,j'ai donc trouvé que en supprimant les "0" j'obtenais bien le nombre de byte suivant le "FF" (exemple en fin de code )

Code: [Select]


5E
FF
0
0
FF
12
0
4C
5B
0
0
FF
0
5E
FF
0
0
12
0
0
FF
0
C0
0
4C
5B
0
0
C0
0
4C
5B
0
0

FF
12
5E
64
4C
5B
10
C0
----
9B  // 12.4V
5B
10
FF
5E
64
12
FF
C0
FF
12
9B // 12.4V
----
5B
10
0


J'ai donc crée un tableau de 13 valeurs (avec le zéro pour FF) :

Code: [Select]

void loop() {

  Serial2.readBytes(consult, 12);


  if ((consult[0] == 0xFF) && ( consult[0]++ > 1 )) {
    // RPM Tr/min
    rpm_msb = consult[0];
    rpm_lsb = consult[1];
    rpm = (((rpm_msb * 256.0) + rpm_lsb) * 12.5);
    //Speed
    sped = consult[4] * 2;
    //Température d'eau C
    water = consult[5] - 50;
    //Battery Volt
    batt = (consult[6] * 80) / 1000.0;
    //MAF
    maf_msb = consult[7];
    maf_lsb = consult[8];
    maf = ((((maf_msb * 256) + maf_lsb) * 5) / 1000.0);
    //Throttle Position voltage
    tps = consult[9];
    tps = ((tps * 20) / 1000.0);
    //Injecteur
    inj_msb = consult[10];
    inj_lsb = consult[11];
    inj = (((inj_msb * 256) + inj_lsb) / 100.0);
    //Timing
    ign = 110 - consult[12];

    Serial.print("RPM="); Serial.println(rpm);
    Serial.print("Speed="); Serial.println(sped);
    Serial.print("Water="); Serial.println(water);
    Serial.print("Battery="); Serial.println(batt);
    Serial.print("MAFs="); Serial.println(maf);
    Serial.print("Throttle="); Serial.println(tps);
    Serial.print("Injector="); Serial.println(inj);
    Serial.print("Timing="); Serial.println(ign);
  }

}//End Loop


J'ai essayé "consult[0]++ > 1" pour ne pas prendre en compte les valeurs qui sont à zéro, mais je pense que c'est plutôt à l'enregistrement qu'il faut lui dire de sauter tous les "0" ?

trimarco232

ok,
mais il faut réussir à envoyer les requêtes depuis l'arduino, c'est un passage obligé !

200sx200

ok,
mais il faut réussir à envoyer les requêtes depuis l'arduino, c'est un passage obligé !
oui je sais bien, mais même en copiant la partie Tx du schéma cela n'a pas été suffisant, je pense que je vais être obligé de faire la partie du signal qui est d'ailleurs connecté avec une résistance.

200sx200

La partie réception étant bonne même si je n'ai pas réussi à faire sortir les bonnes valeurs, j'essaye la partie transmission.

Schéma avant :

Taille réelle

Schéma de la board actuel (no fonctionnel) :(

Taille réelle

Qu'en pensez vous ?

200sx200

J'ai donc réussi à séquencer les données :)

En vidéo ICI

Mon seul problème récurant, c'est que je suis obligé de synchroniser manuellement avec le Pc, c'est à dire démarrer le programme de gauges seulement après le sérial monitor.

Je dois trouver le moyen de remplir le consult[28] seulement quand ce sont les données qui m'intéresse et pas toutes.

200sx200

J'ai donc avancé dans mon programme :

Code: [Select]

/* R13-Consult-V0.1 By 200sx200*/

boolean recept = false;
byte display1[37];//Open Display
//Consult
byte consult[28];
//int gauges
int batt;
int tps;
int water;
//setup
void setup() {
  Serial.begin(9600);
  Serial2.begin(9600);
  Serial3.begin(9600);
}

void loop() {
  while (recept == true) {
    goto Consult;
  }

  if ( recept == false) {
    displayO();
  }
  
Consult:  Serial2.readBytes(consult, 28);

  if (consult[0] == 0xFF) {
    //Water Temp C
    water = consult[5] - 50;
    //Battery Volt
    batt = (consult[6] * 80) / 1000.0;

    //Throttle Position voltage
    tps = consult[11];
    tps = ((tps * 20) / 1000.0);

    Print();
  }
}//End Loop

//-----------------------Open Display-----------------------//
void displayO() {
  Serial3.readBytes(display1, 37);
  if ((display1[0] == 6) && (display1[1] == 41) && (display1[3] == 41) && (display1[35] == 41)) {
    Serial.println("Open Display");
    recept = true;
  }
}

void Print() {
  Serial.print("Water Temp C="); Serial.println(water);
  Serial.print("Battery="); Serial.println(batt);
  Serial.print("Throttle="); Serial.println(tps);
}


Le Prog est bien fonctionnel avec mon interface (doublé:Rx,Tx) et attend d'avoir reçu la demande du Pc via le Serial3 pour recevoir les infos de l'écu Serial2.

Je pense rester sur cette option car l'arduino n'est pas assez puissante pour gérer "une" gauge sur 12 comme je souhaite.

Je vais donc passer sur la gestion de transmission avec les données reçues, via un tableau 2D ou 3D si possible ?

trimarco232

Quote
Qu'en pensez vous ?
Bonjour,
je ne peux pas admettre qu'avec un vulgaire oscillateur cela fonctionne, et pas avec l'arduino qui génère exactement le même signal à la même fréquence. Il faux que tu pousses plus loin tes investigations, tu dois en être capable maintenant !

Quote
Je vais donc passer sur la gestion de transmission avec les données reçues, via un tableau 2D ou 3D si possible ?
pourquoi pas, perso je fais plutôt 3 tableaux 1D avec le même pointeur, la présentation s'en trouve allégée
mais tous le goûts etc ...

200sx200

Bonjour,
Bonjour,
je ne peux pas admettre qu'avec un vulgaire oscillateur cela fonctionne, et pas avec l'arduino qui génère exactement le même signal à la même fréquence. Il faux que tu pousses plus loin tes investigations, tu dois en être capable maintenant !
Je n'arrive pas à comprendre non plus :/
J'ai testé plusieurs montage dont le dernier présenté plus haut.

Une chose me viens à l'esprit, est-on sur que le signal dois être carré ?

pourquoi pas, perso je fais plutôt 3 tableaux 1D avec le même pointeur, la présentation s'en trouve allégée
mais tous le goûts etc ...
Alors je serais comme toi, je préfère alléger le truc pour plus de rapidité possible :)

200sx200

Je m'approche du but :)

J'ai quasiment terminé le programme, je poste une version light fonctionnel :

Code: [Select]

/* R13 Consult Auto Transmission By 200sx200*/
boolean recept = false;
boolean displayP = false;
byte display1[37];//Open Display
//Consult
byte consult[28];
//int gauges
int tps;
int sped;
// Led remplace solenoid
const int Solenoid_A = 31;
const int Solenoid_B = 33;
const int Solenoid_Clutch = 35;
const int Solenoid_Lockup = 37;
//const int Solenoid_Pressure = 39;
// on when pin is high
// off when pin is low
const int SON = LOW;
const int SOFF = HIGH;
//vitesse
int vitesse = 1;


//setup
void setup() {
  Serial.begin(9600);
  Serial2.begin(9600);
  Serial3.begin(9600);
  pinMode(Solenoid_A, OUTPUT);        //solenoid A
  pinMode(Solenoid_B, OUTPUT);        //solenoid B
  pinMode(Solenoid_Clutch, OUTPUT);   //solenoid Overrun Clutch
  pinMode(Solenoid_Lockup, OUTPUT);  //solenoid Lock-up
  //pinMode(Solenoid_Pressure, OUTPUT); //solenoid Line Pressure
}

void loop() {

  if ( recept == false) {
    displayO();
  }

  while (recept == true) {
    Serial2.readBytes(consult, 28);

    if (consult[0] == 0xFF) {
      byteconsult();
      //Print();



      //-----------------------------Gearbox----------------------------------//
      if (recept == true) {
        byteconsult();

        if (tps >= 3) { //Volt position papillons (5.1V pour 100%)
          if (sped < 10) {
            Vitesse1();
          }
          if (sped > 10 && sped <= 14) {
            Vitesse2();
          }
        }
      }
      //-----------------------------Gearbox----------------------------------//
    }
  }


}//End Loop



//-----------------------Open Display-----------------------//
void displayO() {
  Serial3.readBytes(display1, 37);
  if ((display1[0] == 6) && (display1[1] == 41) && (display1[3] == 41) && (display1[35] == 41)) {
    Serial.println("Open Display Windows detected");
    recept = true;
  }
}

void byteconsult() {
  //Speed kph
  sped = consult[4] * 2;
  //Throttle Position voltage
  tps = consult[11];
  tps = ((tps * 20) / 1000.0);
}

void Print() {
  Serial.print("Speed kph="); Serial.println(sped);
  Serial.print("Throttle="); Serial.println(tps);
}

// 1 => BC
void Vitesse1() {
  Serial.println("Vitesse1");
  digitalWrite(Solenoid_A, SON);
  digitalWrite(Solenoid_B, SON);
  digitalWrite(Solenoid_Clutch, SON);
  digitalWrite(Solenoid_Lockup, SOFF);
  //digitalWrite(Solenoid_Pressure, SOFF);
}

// 2 => ABDEG
void Vitesse2() {
  Serial.println("Vitesse2");
  digitalWrite(Solenoid_A, SOFF);
  digitalWrite(Solenoid_B, SON);
  digitalWrite(Solenoid_Clutch, SON);
  digitalWrite(Solenoid_Lockup, SOFF);
  //digitalWrite(Solenoid_Pressure, SOFF);
}


Me reste à généré le code avec les 3 boutons dont le 3eme(mode manuel) prenant le dessus sur tous et donnant accès au 2 autres(+et-).

trimarco232

Quote
Une chose me viens à l'esprit, est-on sur que le signal dois être carré ?
Bonjour,
c'est bien de vouloir tout vérifier et de se méfier de tout !
mais là, il s'agit d'un oscillateur qui ne délivre rien d'autre qu'un signal carré

Quote
J'ai testé plusieurs montage dont le dernier présenté plus haut
pour t'aider il faudrait pouvoir tout vérifier :
- la génération de la fréquence par l'arduino a-elle bien été initialisée ?
- peux-tu mesurer avec l'arduino la fréquence délivrée par ton interface usb ? Mesure aussi la tension pour la comparer avec celle en sortie de ton montage (12v/2 en principe), vérifie que tout est pareil
- vérifie en monitorant que les requêtes que tu envoies avec l'arduino sont bien identiques à celles envoyées par ton interface usb

200sx200

Bonjour,
c'est bien de vouloir tout vérifier et de se méfier de tout !
mais là, il s'agit d'un oscillateur qui ne délivre rien d'autre qu'un signal carré
pour t'aider il faudrait pouvoir tout vérifier :
- la génération de la fréquence par l'arduino a-elle bien été initialisée ?
- peux-tu mesurer avec l'arduino la fréquence délivrée par ton interface usb ? Mesure aussi la tension pour la comparer avec celle en sortie de ton montage (12v/2 en principe), vérifie que tout est pareil
Ok, je pourrais effectivement, je vais chercher comment faire les contrôles via l'arduino ou peut être avez vous déjà des programmes ? (je n'ai encore fais ce type de prog)

- vérifie en monitorant que les requêtes que tu envoies avec l'arduino sont bien identiques à celles envoyées par ton interface usb
Le problème est là justement, quand je reçois de l'écu, les données suivent le protocole donné mais l'arduino n'affiche pas les bonnes valeurs dans le serial sous n'importe quel "DEC,HEX...".

Mais sans serial mon programme fonctionne très bien et suit le protocole  :smiley-roll: (chercher l'erreur lol)

Via le PC c'est pareil ex: (demande gauges)=>Reception Arduino en mode HEX
Code: [Select]

6==(0xc9)
29== normalement je devrais recevoir (0x5A)(mode HEX) et 90 DECIMAL
0
29== (0x5A)
7F
29== (0x5A)
7A
29== (0x5A)
F00
29== (0x5A)
1E
29== (0x5A)
3A
29== (0x5A)
1D
29== (0x5A)
75
29== (0x5A)
39
29== (0x5A)
79
29== (0x5A)
1F
29== (0x5A)
7D
29== (0x5A)
7B
29== (0x5A)
74
29== (0x5A)
76
29== (0x5A)
38
29== (0x5A)
70
29== (0x5A)
6F
0==(0xf0)

trimarco232

Quote
Mais sans serial mon programme fonctionne très bien et suit le protocole
Bonjour,
j'ai du mal à te suivre, je vais poser une série de questions pour savoir ce qui fonctionne ou pas
question (1) : l'arduino peux-t-il envoyer des requêtes à l'ecu, et obtenir des réponses ?
 

Go Up