Projet "Testeur OBD2"

Bonjour les amis, j'espère que tout le monde va bien.

J'ai un projet qui consiste à capter la sortie OBD2 de véhicules pour connaître le protocole de communication utiliser. Le port OBD2 possède 16 broches et 5 protocoles de communication. Chaque marques de véhicules utilise diffèrentes broches pour envoyer les données depuis l'ecu ou calculateur.

  1. ISO15765-4 (CAN-BUS)
  2. ISO14230-4 (KWP2000)
  3. ISO9141-2 (KWP) :
  4. SAE J1850 VPW :
  5. SAE J1850 PWM :

Protocoles, modes et PIDs OBD

Le but est de fabriquer un boitier testeur OBD2 afin d'être informer des protocoles de sortie de son vehicule.

Matériels : 16 mini fiches bananes (16x mâle/femelle selon utilité), une boite de jonction, des leds rouge, vert et jaune, un voltmètre digitale, des cables pas trop fin, 2 prises OBD2 (1x mâle / 1x femelle), 2 diodes, quelques resistance, un fusible de protection 1.5A, un interrupteur ON/OFF et un Arduino Nano/Uno..

branchement du boitier "Testeur OBD2":

Pin 1
Pin 2 LED jaune = (VPW et PWM)
Pin 3
Pin 4 LED verte = (Masse Chassis/Gnd)
Pin 5 LED verte = (Masse/Gnd)
Pin 6 LED jaune = (CAN)
Pin 7 LED jaune = (KWP, ISO)
Pin 8
Pin 9
Pin 10 LED jaune = (PWM)
Pin 11
Pin 12
Pin 13
Pin 14
Pin 15
Pin 16 LED rouge = (+12V)

États des LEDS:

Pin 2 (niveau bas) = LED 2 (éteint)
Pin 2 (niveau haut) = LED 2 (Allumé)

Pin 6 (niveau bas) = LED 6 (éteint)
Pin 6 (niveau haut) = LED 6 (allumé)

Pin 14 (niveau bas) = LED 6 (allumé)
Pin 14 (niveau haut) = LED 6 (éteint)

Pin 10 (niveau bas) = LED 10 (éteint)
Pin 10 (niveau haut) = LED 10 (allumé)

Pin 7 (niveau bas) = LED 7 (allumé)
Pin 7 (niveau haut) = LED 7 (éteint)

Très grand merci d'avance pour tout avis, conseil, orientation...

Re- Bonjour,

voici le code que j'ai pu trouver et essayer d'adapter, s'ils vous plaît, pouvez vous me corriger ?

#define led1 2 // led1 branchée sur la broche 2 (obd2 broche2 led jaune VPW PWM)
#define led2 3 // led2 branchée sur la broche 3 (obd2 broche10 led jaune PWM)
#define led3 4 // led3 branchée sur la broche 4 (obd2 broche6 led jaune CAN)
#define led4 5 // led4 branchée sur la broche 5 (obd2 broche14 led jaune CAN)
#define led5 6 // led5 branché sur la broche 6 (obd2 broche7 led jaune KWP ISO)

/*
 La fonction LED permet de commander les 5 LED : 
   HIGH ou 1 = LED allumée
   LOW ou 0 = LED éteinte
 Pendant une certaine durée, les 5 paramètres passés sont :
 état de la led1, état de la led2, état de la led3, état de la led4, état de la led5, durée
*/

void LED(int L1,int L2,int L3,int L4,int L5,int duree)
{
  digitalWrite(led1, L1); // écriture du niveau L1 sur la broche led1
  digitalWrite(led2, L2); // écriture du niveau L2 sur la broche led2
  digitalWrite(led3, L3); // écriture du niveau L3 sur la broche led3
  digitalWrite(led4, L4); // écriture du niveau L4 sur la broche led4
  digitalWrite(led5, L5); // écriture du niveau L5 sur la broche led5 
  delay(500); // attente de (500) milli secondes
}

void setup() // setup est déroulé une seule fois après la remise à zéro
{                
  pinMode(led1, OUTPUT); // la broche led1 (2) est initialisée en sortie
  pinMode(led2, OUTPUT); // la broche led2 (3) est initialisée en sortie  
  pinMode(led3, OUTPUT); // la broche led3 (4) est initialisée en sortie
  pinMode(led4, OUTPUT); // la broche led4 (5) est initialisée en sortie
  pinMode(led5, OUTPUT); // la broche led5 (6) est initialisée en sortie        
}

void loop() // loop est déroulé indéfiniment
{
  if  (led1 = 0);
  digitalWrite(LED,LOW);
  else if (led1 = 1);
  digitalWrite(LED,HIGH);
}
  if (led2 = 0);
  digitalWrite(LED,LOW);
  else if (led2 = 1);
  digitalWrite(LED,HIGH);
{
if (led3 = 0);
digitalWrite(LED,LOW);
else if (led3 = 1);
digitalWrite(LED,HIGH);
}
if (led4 = 0);
digitalWrite(LED,HIGH);
else if (led4 = 1);
digitalWrite(LED,LOW);
{
if (led5 = 0);
digitalWrite(LED,HIGH);
else if (led5 = 1);  
digitalWrite(LED,LOW);
}

Très grand merci d'avance, Karma infiniment.

Désolé, mais ça ne peut pas marcher tel que tu l'as écrit.

Première chose : un test utilise == (= c'est l'assignation d'une valeur à une variable)

Ensuite, tu déclares des constantes en début de code

#define led1 2 // led1 branchée sur la broche 2 (obd2 broche2 led jaune VPW PWM)
#define led2 3 // led2 branchée sur la broche 3 (obd2 broche10 led jaune PWM)
...

Ces lignes sont des directives de compilation : le compilateur va remplacer 'led1' par un '2' dans tout ton code, 'led2' par un '3', etc.

Du coup, dans tes tests, tu vas avoir :
if  (led1 == 0);qui deviendraif (2 == 0)ce qui est toujours faux. Je pense que ce n'est pas ce que tu cherches.

Mais j'aimerais revenir sur ton objectif : tu veux détecter le protocole de communication utilisé lorsque tu brancheras ton système sur la prise OBD2. Mais ton code n'a aucun rapport avec cet objectif. Comment comptes-tu reconnaître ce protocole ? Je pense qu'avant de jouer avec les leds, il faudrait savoir répondre à cette question.

Bonjour très cher lesept,

merci infiniment pour tes explications qui valent de l'or pour moi :slight_smile: je vais tout recommencer. Merci pour ton soutient, effectivement je suis nul :frowning: zéro >:(

J'ai réaliser un shéma avec les moyens du bord, maintenant ç'est plus comprèhensible et surtout plus logique.

Je vais re-travailler le code selon tes instructions pour l'adapté au montage.

Big big big Respect Pour ☆☆☆☆☆l☆e☆s☆e☆p☆t☆☆☆☆☆ Merci beaucoup.

C'est Noël avant l'heure :slight_smile: !!!

Grâce à toi lesept, j'ai vite compris mon erreur et avec ton super instruction, je pense que je vais m'en sortir.

Fais attention aux tension que tu auras sur les broches de ta prise OBD, j'ai vu du 7V et du 12V : ça peut griller les entrées de ta carte Arduino. Vérifie les tensions acceptables, a priori 5V pour un nano et un Uno (mais je crois que certains Uno sont en 3.3V)

il y a un projet open source hardware et software tres interessant...

certe, c'est pas le meme composant que toi...

http://macchina.cc/

Mais le code peut t'aider...

le ELM327 discute en UART avec ton arduino normalement ???

Donc normalement, rien de compliquer

lesept:
Fais attention aux tension que tu auras sur les broches de ta prise OBD, j'ai vu du 7V et du 12V : ça peut griller les entrées de ta carte Arduino. Vérifie les tensions acceptables, a priori 5V pour un nano et un Uno (mais je crois que certains Uno sont en 3.3V)

Salut lesept, effectivement la ligne KWP2000 envoi un signal 12V et le SAE J1850 VPW envoi 7V donc il faudrait que j'abaisse la tension entrant dans l'arduino, est il possible d'utiliser 1 LM7805 pour chaque ligne ? Je vais faire des recherches.

Karma matin/midi/soire pour ☆lesept☆ je te souhaite que du bonheur. RESPECT.

hazerty565:
il y a un projet open source hardware et software tres interessant...

certe, c'est pas le meme composant que toi...

http://macchina.cc/

Mais le code peut t'aider...

le ELM327 discute en UART avec ton arduino normalement ???

Donc normalement, rien de compliquer

Salut hazerty565

Merci pour ton soutient et le lien, très sympas, très intéressant, je plonge dans le site

Merci.

je comprend pas trop ton projet...
tu parle d'un ELM327...
il est branché ou ton ELM327 sur ton arduino??? a moins que tu veux le remplacer??

Le ELM327, il y a deja tout dedans pour discuter avec la voiture ( com can, lin, J1850)... ensuite tu le branche en UART( serie) sur l'arduino... et le tour est jouer.... il existe des sheild spécial sur internet...

Si tu veux remplacer l'ELM327, le site que je t'ai mis, il y a des composants "special" pour comprendre chaque protocol( bus)

Tu ne peux pas brancher l'arduino directement a la prise odb, car les niveaux ne sont pas les memes, les interfaces ne sont pas les memes

Par exemple le bus CAN ( ou protocol CAN)
il te faut un composant special comme par exemple le MCP2515, TJA1051

Pour le bus Lin il te faut un NCV7382, TJA1027 par exemple... il y en a des tonnes d'autre composants

pour chaque protocol = 1 composants...

Il existe des composants de chez ST, qui permettent de comprendre directement les protocol utilisé dans la voiture... un STM8AF

hazerty565:
je comprend pas trop ton projet...
tu parle d'un ELM327...
il est branché ou ton ELM327 sur ton arduino??? a moins que tu veux le remplacer??

Le ELM327, il y a deja tout dedans pour discuter avec la voiture ( com can, lin, J1850)... ensuite tu le branche en UART( serie) sur l'arduino... et le tour est jouer.... il existe des sheild spécial sur internet...

Si tu veux remplacer l'ELM327, le site que je t'ai mis, il y a des composants "special" pour comprendre chaque protocol( bus)

Tu ne peux pas brancher l'arduino directement a la prise odb, car les niveaux ne sont pas les memes, les interfaces ne sont pas les memes

Par exemple le bus CAN ( ou protocol CAN)
il te faut un composant special comme par exemple le MCP2515, TJA1051

Pour le bus Lin il te faut un NCV7382, TJA1027 par exemple... il y en a des tonnes d'autre composants

pour chaque protocol = 1 composants...

Il existe des composants de chez ST, qui permettent de comprendre directement les protocol utilisé dans la voiture... un STM8AF

Très grand merci à toi ☆hazerty565☆ pour les infos très interéssant. Effectivement je possède un module MCP2515+TJA1050 pour Arduino et même le mini module MCP2551 mais j'en ai pas besoin pour ce projet.

Je ne mentionne pas non plus le ELM pour l'utiliser dans ce projet, le lien en début de poste était pour donner un exemple d'information sur les protocoles OBD2 en gènèrale, (infos repris sur le site ELM.)

L'idée est simplement de fabriquer un petit boîtier qui une fois branché sur le port OBD2 du véhicule va nous allumé des leds pour informer les protocoles de communication dispo sur le véhicule, ainsi nous pourrions insérer des fiches bananes pour communiquer directement avec la ligne souhaitée.

Exemple: Je branche mon boîtier à mon véhicule, les leds CAN High, CAN Low et KWP clignotent, je veux uniquement me connecter avec les protocoles CAN H et CAN L pour avoir le max d'info sur le moteur (DTC).. OU je me connecte uniquement avec la ligne KWP pour diagnostic ABS, Air-Bag...

L'Arduino peut être utile pour allumé ou non les leds selon le signal de tension Haut ou Bas reçu par le port OBD2 du véhicule. L'objectif est de pouvoir être informé et communiquer en direct avec le protocole dispo sans perturber la communication.

Il y à des exemple d'adaptateur OBD2 USB avec interrupteur pour communiquer avec ligne K ou CAN... Le projet est assez cool mais demande un certain niveau que je n'est pas malheureusement. Il me faudrait un code pour allumer et eteindre les leds selon le signal OBD2.

Il y à des exemples et codevsimilaire sur le net (merci le partage) qui faudrait re-travailler pour avoir de bons résultats, la vie de famille m'empêche pour la concentration mais je voudrais vraiment reussire afin de partager le resultats afin que tout le monde en profite. Tout infos sont les bienvenue.

Spécial remerciement à notre ami ☆☆☆☆☆lesept☆☆☆☆ pour les explications et conseils pour le codage. Merci.

Sauf que dans une voiture, tous les protocoles discutent quasiment en temps reel et en meme temps...

En faite, pas besoin d'un arduino,

une detection de niveau haut avec un transistor darlington est suffisant et une led

Et donc, tu en es où avec ton code ?

hazerty565:
Sauf que dans une voiture, tous les protocoles discutent quasiment en temps reel et en meme temps...

En faite, pas besoin d'un arduino,

une detection de niveau haut avec un transistor darlington est suffisant et une led

+1 hazerty565, merci beaucoup pour ses précisions, effectivement l'outil de base n'utilise pas de microcontrôleur mais sûrement des transistor darlington + led tout simplement, mon idée était de pouvoir contrôler ces leds justement avec un Arduino mais si c'est faisable ainsi, c'est claire que ça sera peut être plus facile pour moi.

Je vais faire des recherches sur le fonctionnement de transistor darlington, Merci beaucoup pour l'info.

lesept:
Et donc, tu en es où avec ton code ?

+1 lesept, merci beaucoup pour le soutient, comme le souligne hazerty565 l'utilisation de l'arduino peut ne pas être indispensable pour ce projet, le fait d'utiliser des transistor darlington pourraît être suffisant et plus simple à réaliser pour un novice comme moi grâce à vos conseils.

C'est claire que l'Arduino pourrait apporter une couleur à ce projet :slight_smile: car il est évolutif, on pourrait rajouter un LCD pour avoir d'autres infos, on pourrait même réaliser un OBD2Logic :slight_smile: c'est à dire un analyseur logique qui informe sur chaque lignes, tension, courant, flux d'info, visualisation analogique... bon je rêve, faut que j'arrête.

Je vais quand même passer aux recherches de tutos avec des projets similaire (allumage/extension de led selon les signaux haut ou bas reçu..) afin de trouver un code adapter modifiable selon le projet.

Je m'excuse vraiment d'être amateur à ce niveau, je regrette de ne pas avoir rencontré le monde Arduino pendant ma jeunesse :slight_smile: bon j'ai 35 ballais mais entre l'usine, les enfants, la famille dure dure de gerer du temps pour la passion Arduino Home :slight_smile:

Bon je passe au boulot, 1 trouver un code adapter au projet, 2 le fonctionnement de transistor darlington, Merci beaucoup, Heureusement que vous êtes là, franchement sans vous j'aurais lâcher l'affaire, Merci Infiniment à ☆lesept☆ et ☆hazerty565☆ je vous aime :slight_smile:

Il n'y a pas de honte à être débutant, Hazerty et moi l'avons été aussi, la différence c'est que ça fait plus longtemps que toi (en clair, on est plus vieux !!! :slight_smile: )
Bon courage !

bonjour

Je viens de tomber sur ce projet qui ressemble un peu au tien : tu peux t'en inspirer...