Lecteur OBD2 - Diagnostic automobile

Lors de la création de l'application, nous avons été confrontés à de nombreux choix, problèmes, etc., que nous essaierons de vous familiariser dans cet article. Il s'est avéré que vous pouvez avoir un dialogue avec la voiture et être très productif. Naturellement, pour organiser la communication avec la voiture, vous devez «établir le contact», «poser la bonne question» et bien comprendre la «réponse» reçue de la voiture. En conséquence, l'article visera à expliquer l'organisation du dialogue dans une langue accessible, ainsi qu'à vous dire quelles erreurs vous pourriez rencontrer en cours de route et comment les traiter.

Choix de connexion


Dans un premier temps, il est nécessaire de préciser qu'un adaptateur ELM327 sera utilisé pour se connecter à la voiture. ELM327 est un microcircuit qui vous permet de convertir les protocoles utilisés dans les pneus de diagnostic des voitures en protocole RS232, vers lequel nous transférerons les données. Du fait que la transmission des données via le protocole RS232 se fait de manière séquentielle, le premier problème se pose - la vitesse de transfert des données, que nous allons essayer de contourner dans l'un des paragraphes suivants.

Il existe plusieurs variantes de l'adaptateur ELM327, qui sont classées selon la méthode de transfert de données - Bluetooth, WIFI, USB. Sur la base du fait que l'objectif de développement est un appareil mobile fonctionnant sous Android, vous pouvez choisir les deux versions les plus appropriées d'ELM327, telles que Bluetooth et WIFI. Puisqu'il n'y a qu'une seule façon de recevoir et de traiter des données, et qu'elles ne diffèrent que par les options de connexion à l'adaptateur, vous pouvez n'en choisir qu'une, organiser un dialogue avec elle, puis ajouter les options de connexion restantes.

ELM327 1.5 contre ELM327 2.1




L'un des premiers problèmes qui a pu être rencontré a été le problème du choix de l'adaptateur lui-même, dans notre cas Bluetooth. Il s'avère que si vous devez prendre en charge toutes les voitures (au moins la plupart), vous devez choisir la version v1.5 au lieu de v2.1, qui doit en fait être clarifiée plusieurs fois lors de l'achat d'un adaptateur, car les vendeurs essaient de donner la version de l'adaptateur non pas pour celle qui est en fait, parce que ils ne sont pas particulièrement différents. En fait, dans la version v2.1, les protocoles J1850 PWM et J1850 VPW ne sont pas pris en charge, ce qui signifie que vous ne pourrez pas vous connecter à des voitures utilisant ces protocoles.

Connexion


La connexion à l'adaptateur se déroule en plusieurs étapes:

  • Connexion à un adaptateur (Bluetooth, WIFI)
  • Envoi de commandes d'initialisation (chaîne d'initialisation)

Si tout est clair avec l'organisation de la connexion. Le principe de fonctionnement est le même que pour tout chat Bluetooth / WIFI. Afin de comprendre comment envoyer la chaîne d'initialisation, il est nécessaire d'étudier quelles commandes existent, ainsi que les fonctions qu'elles remplissent.

AT Z [réinitialiser tout]
Rétablissez les paramètres par défaut de l'adaptateur.
AT L1-0
Activer / désactiver les sauts de ligne.
AT E1-0
Echo activé - désactivé
AT H1-0
En-têtes on - off
AT AT0-1-2
Adaptive Timing Off - Adaptive Timing Auto1 - Adaptive Timing Auto2
AT ST FF
Définissez le délai d'expiration au maximum.
AT D [régler tout sur Défaut]
Réinitialisez les paramètres à l'état initial configuré par l'utilisateur.
AT DP [Décrire le protocole actuel]
Le scanner est capable de déterminer indépendamment le protocole du véhicule auquel il est connecté.
AT IB10 [définir le débit en bauds ISO à 10400]
La commande définit le débit en bauds pour ISO 9141-2 et
ISO 14230-4 10400
AT IB96 [définir le débit en bauds ISO à 9600]
La commande définit le débit en bauds pour ISO 9141-2 et
ISO 14230-4 9600 pour les protocoles 3,4,5.
AT SP h [Définir le protocole h]
La commande de sélection de protocole h, où h:

0 - Automatique;
1 - SAE J1850 PWM (41,6 kbauds);
2 - SAE J1850 VPW (10,4 kbauds);
3 - ISO 9141-2 (init 5 bauds, 10,4 Kbaud);
4 - ISO 14230-4 KWP (init 5 bauds, 10,4 Kbaud);
5 - ISO 14230-4 KWP (démarrage rapide, 10,4 Kbaud);
6 - ISO 15765-4 CAN (ID 11 bits, 500 Kbaud);
7 - ISO 15765-4 CAN (ID 29 bits, 500 Kbaud);
8 - ISO 15765-4 CAN (ID 11 bits, 250 Kbaud);
9 - ISO 15765-4 CAN (ID 29 bits, 250 Kbaud);
AT SP Ah [Définir le protocole h avec Auto]

La commande définit le protocole par défaut h, si la connexion utilisant le protocole h a échoué, l'adaptateur démarre la sélection automatique du protocole.

Sur la base des commandes décrites ci-dessus, nous formons la chaîne d'initialisation.

initializeCommands = Arrays.asList("ATZ", "ATL0", "ATE1", "ATH1", "ATAT1", "ATSTFF", "ATDP", "ATSP0"); 

Il est conseillé de permettre à l'utilisateur de modifier les commandes d'initialisation, car pour sélectionner la «clé» pour certaines voitures, il est nécessaire de choisir des paramètres d'adaptateur plus appropriés. Dans notre cas, les paramètres utilisés conviennent à la plupart des protocoles standard.

Il est également conseillé de faire attention à la commande APSP0, nous définissons donc la sélection de protocole automatique par défaut, cela peut prendre un certain temps.

Par conséquent, si l'utilisateur sait quel est son protocole automatique, puis en utilisant la possibilité de changer le protocole de connexion, il peut remplacer 0 par son numéro de protocole.

Lire les données de diagnostic


Les commandes spéciales du PID sont utilisées pour lire les données de diagnostic.
PID (Identifiant de paramètre - Identifiants de paramètres de diagnostic embarqués) - codes utilisés pour interroger les performances de capteurs de véhicule spécifiques.

Les principaux pids peuvent être trouvés sur Wikipedia, il existe un ensemble complet de commandes de base que toutes les voitures devraient prendre en charge. Il existe également des ensembles de commandes pour certaines marques et types de voitures, ces ensembles sont fournis moyennant des frais. Dans notre cas, l'application se concentre sur les diagnostics de base des voitures, respectivement, nous utilisons l'ensemble de commandes de base.

Il est également possible de recevoir les données actuelles de la voiture, tandis que la commande pour recevoir les données de la voiture aura 01 au début, indiquant que nous voulons obtenir des données réelles. Si nous voulons obtenir les données de voiture enregistrées, alors au début de la commande, vous devez spécifier 02 . Par exemple, la commande pour obtenir la vitesse actuelle de la voiture est 010D et pour obtenir la vitesse enregistrée - 020D .

Si vous examinez attentivement le nombre de commandes fournies par les ressources ouvertes, vous pouvez simplement remarquer le problème que j'ai décrit au tout début, à savoir le problème de la vitesse de réponse de l'adaptateur. Étant donné que l'envoi et la réception des commandes sont séquentiels, afin de recevoir les lectures du capteur à l'heure actuelle, il est nécessaire d'attendre une réponse à toutes les commandes précédentes. Par conséquent, si vous demandez à recevoir toutes les commandes, il y a une forte probabilité que la mise à jour des données réelles se produise très lentement. Mais ce problème peut être résolu si vous utilisez les commandes qui affichent uniquement les équipes qui existent dans la voiture. Par exemple:

0100 - PID pris en charge [01-20]
0120 - PID pris en charge [21 - 40]
0140 - PID pris en charge [41 - 60]
0160 - PID pris en charge [61 - 80]
0180 - PID pris en charge [81 - A0]
01A0 - PID pris en charge [A1 - C0]

Je vais montrer comment déterminer quels capteurs sont présents dans la voiture en utilisant l'un des pids. Par exemple:

  • 0100 \\ demande
  • BB1E3211 \\ réponse de la voiture

Nous traduisons la réponse de la voiture en un système de nombres binaires

 BB1E3211(16) > 10111011000111100011001000010001(2) 

En utilisant la plaque suivante, nous pouvons déterminer quels pids sont pris en charge par notre voiture, à partir de 01 à 20:



Sur la base des données obtenues, nous pouvons déterminer que notre voiture prend en charge les pids suivants:

  01, 03, 04, 05, 07, 08, 0C, 0D, 0E, 0F, 13, 14, 17, 1C, 20 

Maintenant, au lieu d'envoyer les 32 équipes et d'attendre une réponse, malgré le fait que certaines soient absentes, nous n'utiliserons que 15 équipes. Mais ce n'est pas la limite de la soi-disant optimisation. Pour que les données soient mises à jour encore plus rapidement, je vous conseille de ne demander que des données sur les capteurs affichés à l'écran. Bien que cela limite certaines fonctionnalités de l'application. Par exemple, un enregistrement d'historique.

Lecture et décodage des erreurs de voiture


Les erreurs de voiture peuvent également être différentes et des commandes distinctes existent également pour elles. Par exemple:

  • 03 - Pour afficher les codes d'erreur enregistrés
  • 0A - Pour afficher les codes d'erreur persistants.

Comme pour les autres commandes, les erreurs de voiture se présentent sous forme codée, respectivement, comme dans d'autres commandes, elles doivent être décodées pour obtenir les informations nécessaires. Je vais donner un exemple d'opération de décodage d'erreur. Code:

 private final static char[] dtcLetters = {'P', 'C', 'B', 'U'}; private final static char[] hexArray = "0123456789ABCDEF".toCharArray(); private void performCalculations(String fault) { final String result = fault; String workingData = ""; int startIndex = 0; troubleCodesArray.clear(); try { if (result.contains("43")) { workingData = result.replaceAll("^43|[\r\n]43|[\r\n]", ""); } else if (result.contains("47")) { workingData = result.replaceAll("^47|[\r\n]47|[\r\n]", ""); } for(int begin=startIndex; begin < workingData.length(); begin += 4) { String dtc = ""; byte b1 = Utility.hexStringToByteArray(workingData.charAt(begin)); int ch1 = ((b1 & 0xC0) >> 6); int ch2 = ((b1 & 0x30) >> 4); dtc += dtcLetters[ch1]; dtc += hexArray[ch2]; dtc += workingData.substring(begin + 1, begin + 4); if (dtc.equals("P0000")) { continue; } troubleCodesArray.add(dtc); } } catch (Exception e) { Log.e(TAG, "Error: " + e.getMessage()); } } 

Et maintenant pour l'explication.

Sur la base de la réponse reçue, nous pouvons obtenir un code d'erreur, pour cela nous décodons le message reçu en utilisant les plaques suivantes.

Premier caractère:



Deuxième personnage:



3, 4, 5 caractères sont formés selon ce tableau:



Sur cette base, nous pouvons essayer d'analyser la réponse suivante 0001000000111110



Code d'erreur: P103E

Épilogue


À ce stade, nous avons compris comment organiser un dialogue avec l'adaptateur, lui envoyer des commandes, recevoir et décrypter ses réponses. C'est une grande partie du travail, si vous considérez combien de temps il faut pour étudier le matériel, mais en même temps assez intéressant. En dehors de cet article, il existe de nombreux problèmes associés à l'interface visuelle, ainsi que de nombreuses fonctions supplémentaires, telles que l'ajout de nouveaux pids à partir d'un fichier, un moyen standard et avancé de se connecter à l'adaptateur et de créer des graphiques.

Matvienko Alexander, Hossein Fakhr.

Source: https://habr.com/ru/post/fr444726/


All Articles