Storm td5: pour nous les zommes

Modérateur : phil13

Avatar du membre
beurk
Quatre-Quatreux
Messages : 17004
Date d’inscription : octobre 2007
Contact :
Statut : Hors ligne

Sniffer les échanges sur le K-line 2/3

#4

Message par beurk »

Pour commencer, j'ai configurer le Nano pour booter directement en mode instrument, puisque c'est ce que je cherche à comprendre.
Pour rappel, le nano peut faire les choses suivantes:
- mode instrument pour le suivi des capteurs en temps réel
- mode diagnostique des différents capteurs et configuration ECU
- mode diagnostique des différents périphériques (Alarme, abs, .....)
- mode reprogrammation ECU
Nano en mode instrument
td5instrument.jpg
Au cours des mois précédents, j'ai fait beaucoup de logg avec le nano pour savoir que la période d'enregistrement des datas fuelling est de l'ordre de 932ms
Le logic logger saleae est configuré à 12Mhz pour avoir le plus de précision possible sur une durée de 10s

Dans un premier temps pour valider le principe, j'ai tout scotcher sur une plaque de bois pour éviter faux contacts et cours juxxx....pas de photo :D
Que ce soit à l'arrêt, en roulant, moteur arrêté ou tournant, le principe est le même:
- brancher le nano, puis sur le portable lancer l'enregistrement.

La bidouille commence a être intéressante, les premiers créneaux apparaissent...
Et voilà ce que j’obtiens après une quinzaine de tests concluants:

Wakeup pattern
WAKEUP PATERN.JPG
[table="width: 500, class: grid, align: left"]
[tr]
[td][/td]
[td]1[/td]
[td]0[/td]
[td]1 avant Tester frame[/td]
[/tr]
[tr]
[td]ISO 14230[/td]
[td]>300ms [/td]
[td]25 +/-1[/td]
[td]25 +/-1 total 50ms[/td]
[/tr]
[tr]
[td]mesures[/td]
[td]>300ms[/td]
[td]26.55ms[/td]
[td]118.9ms total 145.5ms[/td]
[/tr]
[/table]

Chaine 1er et 2eme échange....
1ER-2EME.JPG
1er échange
1ER ECHANGE.JPG
2eme échange
2EME ECHANGE.JPG
et ainsi de suite.....
Les bits sont convertis en bytes (hexadécimal au dessus en bleu)

A partir des enregistrements, le logiciel Saleae étant assez intuitif, il est possible de mesurer n’importes quelle durée comprise entre 2 marqueurs repositionnables (comparaison base ISO 14230-4:
[table="width: 800, class: grid, align: left"]
[tr]
[td][/td]
[td]ISO 14230-4[/td]
[td]Mesures[/td]
[/tr]
[tr]
[td]Fréquence transmission[/td]
[td]10400 bauds +/-5% min 9880 baud; max 10920 baud[/td]
[td]Tester (p=94.08µs) F= 10629 bauds / ECU (p=98.83µs) F=10118 bauds [/td]
[/tr]
[tr]
[td]P1 normal[/td]
[td]0<P1<20ms[/td]
[td]+/- 71µs[/td]
[/tr]
[tr]
[td]P2 normal[/td]
[td]25ms<P2<50ms[/td]
[td]700µs à 11ms[/td]
[/tr]
[tr]
[td]P3 normal[/td]
[td]55ms<P3<5000ms[/td]
[td]100ms à 235ms[/td]
[/tr]
[tr]
[td]P4 normal[/td]
[td]5ms<P4<20ms[/td]
[td]31µs[/td]
[/tr]
[/table]
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Avatar du membre
beurk
Quatre-Quatreux
Messages : 17004
Date d’inscription : octobre 2007
Contact :
Statut : Hors ligne

Sniffer les échanges sur le K-line 3/3

#5

Message par beurk »

1- MATERIEL UTILISE
A- Arduino nano
Pour arriver à mes fins j'ai pris l'option du programmable et non du paramétrable (ELM327/323).
Les cartes Arduino proviennent d'un projet libre (c'est mon objectif et un choix de vie). Le langage de programmation c'est le C/C++. Elles arrivent toutes assemblées
Site Arduino:https://www.arduino.cc/

Wikipedia:https://fr.wikipedia.org/wiki/Arduino


J'ai jeté mon dévolue sur une arduino nano:
- un port usb pour téléverser la programmation et communiquer vers l'extérieur via une interface série sur le PC
- tension logique 5V (TTL)
- alimentation 6-20V (parfait pour être alimenté par la prise ODB)
- 14 broches Entrées/sorties numériques: 4 pour carteSD, 2 pour USB, 2 pour port E/S OBD à (voir plus bas), reste 6 broches libres
- 8 broches Entrées/sorties analogiques (0/5v)
- un peu de mémoire Flash/SRAM/EEPROM
- vitesse 16MHz
- aussi grosse que mon pouce (carte du bas)
nano 1.JPG

B- Interface 12V-TTL (Kline vs 5V) L9637D
La carte arduino ne tolère en entrée que des tensions de 5V. Il y a lieu de fabriquer une interface entre le signal 12V délivré par le pin7 (KLine) et l'arduino. Le meilleurs compromis, c'est le circuit L9637D. Sauf qu'il n'existe qu'en boitier SO8.....c'est du CMS (Composant Monté en Surfaces) donc très petit. De plus j'utilise un carte de prototypage rapide au pas de 2,54 mm. Donc j'ai procédé à un montage amovible.

le data sheet: http://www.st.com/content/ccc/resource/ ... 000234.pdf

le schéma de montage/interfaçage - conversion de la seule entrée/sortie K-Line en 2 entrées/sorties TX et RX
L9637D montage copie.jpg

Le CMS monté sur support bricolé - la taille, le résultat à atteindre (merci les lunettes loupes)
cms.JPG
SMD-3.JPG
SMD2DIP8.JPG

Un support amavible standardisé SO8 to DIP8 (que j'utiliserai par la suite)
SOP8-to-DIP8.JPG
sop8-to-dip8-converter_02.JPG

C- Montage général pour développement ultérieur
Pour faire mes premiers pas dans le projet, j'ai d'abord conçu l'ensemble sur plaque de montage rapide filaire.
Pour m'aider dans cette tache et parc que j'aime le travail bien fait (sic) j'ai utilisé le logiciel fritzing:http://fritzing.org/home/
Il permet de concevoir ce type de montage, mais aussi d'avoir une représentation schématique, puis de concevoir le(s) PCB des circuits à faire faire chez un chinois du coin. Le tout est lié, donc chaque liaison, chaque modification se répercute dans les 3 espace de représentation....super pratique. J'utilise des soft similaire dans mon job.

Vue Schématique:
nano schema.JPG

Vue de la plaque de montage:
nano platine.JPG
Vue du mien. Il tient dans le vide poche du cubby box, bien callé.
J'ai à ma disposition une liaison BT pour contrôler avec le PC et la carte SD pour enregistrer ce que je souhaite.
montage arduino nano copie.jpg
2- PREMIERS SKETCHES ARDUINO
A- balayer les bytes et trouver les bons seuils de découpes
Premier sketch, simple, efficace. Je récupère les données sur la console série du logiciel de programmation arduino.
Le formatage en sortie est assez basic, mais suffisant pour trier les datas et inscrire les durées entre byte.
Le formatage de sortie est du type:
B1
TP (temps interbytes mesuré par la carte)
B2
TP
B3
.....

Code : Tout sélectionner

// UART------------------------
// Tx - Pin 9 - D6
// Rx - pin 10 - D7

// USB------------------------
// Tx - pin 1 - D1
// Rx - pin 2 - D0

// BIBLIOTHEQUES EXTERNES-----
#include <SoftwareSerial.h>

//formatage de sortie pour mesure de temps entre bytes:
//b1
//#TP
//b2
//#TP
//b3
//.....

// VARIABLES--------------
byte InByte; // variable de stockage temporaire pour bytes
SoftwareSerial UART(7, 6); // Porte série K-Line (RX,TX)
long Time = 0; // stockage temporaire de temps
long TP = 0; // stockage valeur temps inter-bytes

void setup()
{
  Serial.begin(115200); // initialisation port usb à 115200 bauds
  while (!Serial) {
    ; // Attente pour connection port serie usb
  }
  Serial.println("Carte ok"); // Texte de confirmation carte prête
  UART.begin(10375); // initialisation port UART à 10375 bauds
  Time = micros();
}
void loop()
{
  if (UART.available())
    {
      TP = micros() - Time;
      InByte = UART.read();
      Serial.print(InByte, HEX);
      Serial.print(";");
      Serial.print("#");
      Serial.println(TP);
      Time = micros();
      }
}
N'en déplaise au modo boulet, je sais ce qu'est un byte je les ai même sous les yeux.
Je récupère sur la console série les infos formatée, je les copie colle dans un fichier .txt, je renomme en .csv, puis je l'ouvre sur excel et voilà:
colonne de droite les bytes (octet en fr dans le texte, représentation d'un unsigned int (entier non signé - de 0 à 255 sur 8bits) en hexadécimal) / colonne de gauche les durées, temps entre chaque bytes donnés en µs (attention cette valeur est indicative et non réelle du fait de la tolérance du quartz / variations suivant température)
DECOUPE BYTES.JPG
Un byte en hexa c'est 2 caractères. Quand il n'y en a qu'un, c'est qu'il manque le préfixe 0 (ex: 1, devrait s’écrire 01....en c++: 0x01)

B- thésauriser les trames + tris dans excel
Le but de ce travail est de pouvoir découper les échanges suivant des seuils de temps.
Le premiers sketch m'a fourni ces seuils sauf qu'il a fallut manipuler les statistiques dans tous les sens pour arriver au bon découpage.
Sans compter que même si l'arduino nano tourne en 16Mhtz, le mode de découpage que j'ai adopté génère des erreurs (2.5%).
courbe de découpe 1 le seuil de 40 000µs est bien visible
DECOUPE1.JPG
courbe découpe 2 amplifié au ²
DECOUPE2.JPG
min-max en découpe frame/subframe
MIN-MAX.JPG
Tout ça pour arriver à mettre ua point un sketch final qui permet de découper proprement les bytes et les sub-frames échanges TESTER-ECU

Code : Tout sélectionner

// UART------------------------
// Tx - Pin 9 - D6
// Rx - pin 10 - D7

// USB------------------------
// Tx - pin 1 - D1
// Rx - pin 2 - D0

//formatage de sortie:découpe des frames/subframes (echanges TESTER->ECU)
//subframe1.1;#TP;subframe1.2
//subframe2.1;#TP;subframe2.2
//subframe3.1;#TP;subframe3.2
//.....


// BIBLIOTHEQUES EXTERNES-----
#include <SoftwareSerial.h>

// VARIABLES--------------
byte InByte; // variable de stockage temporaire pour bytes
SoftwareSerial UART(7, 6); // Porte série K-Line (RX,TX)
long Time = 0; // stockage temporaire de temps
long TP = 0; // stockage valeur temps inter-bytes

void setup()
{
  Serial.begin(115200); // initialisation port usb à 115200 bauds
  while (!Serial)
  {
    ; // Attente pour connection port serie usb
  }
  Serial.println("Carte ok"); // Texte de confirmation carte prête
  UART.begin(10375); // initialisation port UART à 10375 bauds
  Time = micros();
}
void loop()
{
  if (UART.available())
    {
    TP = micros() - Time;
    InByte = UART.read();
    if ( TP < 1800) //2800=1erreur
      {
        Serial.print(InByte, HEX);
        Serial.print("|");     
      }
      if ( TP > 1800 && TP < 15000)
        {
          Serial.print(";");
          Serial.print("#");
          Serial.print(TP);
          Serial.print(";");
          Serial.print(InByte, HEX);
          Serial.print("|");
        }
          if (TP > 35000 )
            {
              Serial.println(";");
              Serial.print(InByte, HEX);
              Serial.print("|");
            }
        Time = micros();
  }
}
Au final les 2.5% d'erreur proviennent à la fois de l'exploitation du sketch mais aussi de temps entre bytes qui ne correspondent pas et ne peuvent pas appartenir à la réalité du découpe statistique: l'ECU répond trop vite ou trop lentement....
J'obtiens ce tableau qu'il me suffira de trier pour localiser les bytes qui changes et qui sont porteurs de l'information que je cherche.
A gauche la requête TESTER, au milieu le temps de réponse de l'ECU, à droite la réponse de l'ECU. Chaque Byte est séparé par un |.
DECOUPE SUB FRAMES.JPG
Après plusieurs essais en condition moteur arrêté et moteur tournant et en roulant..............et des tris successifs dans excel, voilà ce que j'obtiens:
Les échanges NANO-ECU avec balayage des 5 fenêtres du mode instruments: synthèses des échanges / apparitions chronologiques
loop 5 fenetres.JPG
Les échanges NANO-ECU avec balayage des 5 fenêtres du mode instruments: loop suivant les fenêtres du Nano-com F1/F2/F3/F4/F5
LOOP FENETRES.JPG
les XX sont les bytes porteurs des données. CS, c'est le checksum de la trame (idem coté TESTER). Le CS sert a vérifier l'intégrité de la transmission

Les échanges NANO-ECU in-loop lors d'un enregistrement fichier CSV mode instruments
LOOP REC-MODE.JPG

Arrivé à ce stade, je sens qu'il va y avoir du sport pour identifier les données!!!!
Alors un jeu de sudoku se met en place et avec un peut de bon sens, j'ai trouvé 2 premières trames: Engine speed et véhicule speed
Ce sont tout bonnement les 2 premières trames de la fenêtre de lancement du Nano en mode instrument. Pourquoi? 1-c'est logique du point de vue des successions des trames dans les différents modes, mais surtout le nano fait un test pour voir si le moteur tourne car entre moteur arrêté et moteur tournant les trames ne sont pas les mêmes. Et surtout leur cyclicité change.
TESTER: 2|21|9|2C|
ECU:4|61|9|2|ED|5D|
La donnée se cache dans les octets 2 et ED.
La vitesse de rotation variant de 0 à 5000 rpm elle ne peut pas être codé sur un octet (0 à 255), mais sur un word (16-bit unsigned number) de 2 octets: 2ED.
Converti d'Hexadécimal en décimal, ça donne 749.....en RPM!....la vitesse moteur au moment de l'enregistrement :danse:
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Avatar du membre
mimouss
Modérateur
Messages : 13488
Date d’inscription : mars 2005
Localisation : essonne
Statut : Hors ligne

re: Storm td5: pour nous les zommes

#6

Message par mimouss »

beurk a écrit : :D vous en avez assez.........ou vous en voulez encore?
C'est intéressant! Mais complexe mais intéressant ;)
Hyundai terracan 2.9L bva full full tout full stock :D
Et subaru forester 2.5L bva
et subaru forester 2.0l turbo bva en rénovation ( comprendre entrain de pourrir )
Avatar du membre
Rem's
Quatre-Quatreux
Messages : 5117
Date d’inscription : juillet 2012
Localisation : Lyon
Statut : Hors ligne

re: Storm td5: pour nous les zommes

#7

Message par Rem's »

Continue :)
Avatar du membre
valJeep
Modérateur
Messages : 12789
Date d’inscription : novembre 2010
Localisation : entre sauvignon et chardonnay :D pays d'Ancenis ;)
Statut : Hors ligne

re: Storm td5: pour nous les zommes

#8

Message par valJeep »

Pourquoi ne pas avoir utilisé un ELM327 avec un terminal PC pour décoder directement les trames du K-line?

t'es pas arrivé pour décoder les trames hexa :D
XJ 2.5L TD VM de 1996, 225mKm, WJ 2.7L CRD de 2002, 235mKm
Image Image
Avatar du membre
beurk
Quatre-Quatreux
Messages : 17004
Date d’inscription : octobre 2007
Contact :
Statut : Hors ligne

re: Storm td5: pour nous les zommes

#9

Message par beurk »

3- LE DIALOGUE TESTER - ECU
A- les trames et leurs significations
B- les 2 modes de fonctionnement du nano-com et les raisons de faire autrement
Avatar du membre
valJeep
Modérateur
Messages : 12789
Date d’inscription : novembre 2010
Localisation : entre sauvignon et chardonnay :D pays d'Ancenis ;)
Statut : Hors ligne

re: Storm td5: pour nous les zommes

#10

Message par valJeep »

beurk a écrit : TESTER: 2|21|9|2C|
ECU:4|61|9|2|ED|5D|
La donnée se cache dans les octets 2 et ED.
La vitesse de rotation variant de 0 à 5000 rpm elle ne peut pas être codé sur un octet (0 à 255), mais sur un word (16-bit unsigned number) de 2 octets: 2ED.
Converti d'Hexadécimal en décimal, ça donne 749.....en RPM!....la vitesse moteur au moment de l'enregistrement :danse:
Je dis que tu as pas fini de décoder les données hexadécimale de façon empirique ;)
XJ 2.5L TD VM de 1996, 225mKm, WJ 2.7L CRD de 2002, 235mKm
Image Image
Avatar du membre
beurk
Quatre-Quatreux
Messages : 17004
Date d’inscription : octobre 2007
Contact :
Statut : Hors ligne

re: Storm td5: pour nous les zommes

#11

Message par beurk »

valJeep a écrit :Je dis que tu as pas fini de décoder les données hexadécimale de façon empirique ;)
:D Ben si justement
L’intérêt d'avoir un enregistreur sur SD pour 15 000 lignes fait qu'avec un rapprochement avec celle du nano, je les ai toutes trouvées. Mais certes à défaut d'avoir les spé des ECU c'est une méthode empirique. Il n'y a que 2 données qui me semblent suspectes: pression ambiante (+/-doublon sur la même trame) et wastegate/EGR inlet.

Mais là présentement, j'ai un métier moi, monsieur :D
Avatar du membre
beurk
Quatre-Quatreux
Messages : 17004
Date d’inscription : octobre 2007
Contact :
Statut : Hors ligne

re: Storm td5: pour nous les zommes

#12

Message par beurk »

:D juste pour dire que je n'ai pas fini d'écrire la première partie mais que je prépare déjà la deuxième
Avatar du membre
famille Cromagnon
Quatre-Quatreux
Messages : 6245
Date d’inscription : mai 2011
Localisation : Pyrénées et plus au sud...Surtout plus au sud
Statut : Hors ligne

re: Storm td5: pour nous les zommes

#13

Message par famille Cromagnon »

Eh ben.....pfiouuuuu....ça nous fait mal à la tête... :D :D :D
ImageImage
Répondre