Transformer des impulsions en valeur affichable

Bonjour,

Je débarque ici !

Pour mon loisir, je travaille sur un projet qui me semble assez simple à la base :

Monter une interface de consultation des erreurs de l'ordinateur de bord rudimentaire d'une voiture ancienne avec un Arduino Uno.

Cette ODB communique en faisant clignoter une LED. Le nombre de clignotement indiquer l'erreur.

Exemple, on initialise l'ODB en appliquant la masse ou le +12V sur une broche durant 2/3 secondes et ensuite l'ODB fait clignoter une LED 10 fois. C'est donc l'erreur 10. On relance la procédure et l'erreur suivante est indiquée, par exemple 3.

Je voudrais donc construire une interface avec un Arduino qui :

Déclenche l'ODB
Affiche sur un afficheur l'erreur en chiffre et non plus en clignotement d'une LED

J'imagine donc que cela doit pouvoir se faire en programmant une sorte de compteur d'impulsion avec l'Arduino. L'ODB allumant une LED avec du +12V pendant une seconde puis l'éteint 1 secondes etc. L'arduino devrait pouvoir (en se passant d'une LED) compter la présence de +12V et afficher un chiffre une fois qu'il n'y a plus de 12V durant 2 secondes ou plus.

La fin de la procédure, la LED est éteinte.

D'après vous est-ce réalisable facilement ?

Est-ce que par hasard il y aurait une librairie sur ce principe qui existerait déjà ?

Merci par avance à ceux qui voudront bien me renseigner.

A+

je suppose que vous voulez dire OBD pas ODB (On-Board Diagnostics).

Exemple, on initialise l'ODB en appliquant la masse ou le +12V sur une broche durant 2/3 secondes et ensuite l'ODB fait clignoter une LED 10 fois. C'est donc l'erreur 10. On relance la procédure et l'erreur suivante est indiquée, par exemple 3.

Vous voulez dire que vous avez déjà cet outil de diagnostic dans la voiture ancienne et que c'est comme cela qu'il fonctionne?

Oui - avec le bon ajustement de niveau (faudra passer de 5V à 12V et inversement) c'est tout à fait faisable et assez simple - si vous voyez la diode clignoter à l'oeil nu c'est que vous n'aurez pas besoin d'interruption ou quoi que ce soit de compliqué, juste une boucle qui surveille des impulsions et les compte jusqu'à ce que le clignotement stop pendant assez longtemps

Bonsoir,

Oui OBD j'ai inversé les lettres dans mon message initial.

Le fonctionnement de l'OBD I est ainsi :

On envoie du +12V sur une broche d'un calculateur pendant 2/3 secondes ensuite il répond en envoyant du +12V par impulsion d'une seconde. Si une erreur 3 est présente il va donc envoyer 3 impulsions de 12V espacées d'une seconde entre chaque impulsion :

+12V durant 1 seconde
Pas de tension durant 1 seconde
+12V durant 1 seconde
Etc.

x fois de suite suivant le code que le calculateur envoie

L'idée est donc de mettre un convertisseur 12V vers 5V pour attaquer l'arduino
De faire un script pour surveiller et compter les impulsions et les afficher sur 2 afficheurs à segments ( sous forme numérique ). Au max il doit y avoir de 1 à 14 impulsions à compter ( d'où l'obligation d'un double afficheurs).

La led c'est un petit montage qu'on devait faire à l'époque mais après on devait compter les allumages... d'où l'idée de faire plus moderne avec un affichage direct du code erreur à l'aide d'un Arduino.

En dehors du convertisseur, est-ce qu'il y a d'autres choses à prévoir en hardware ? L'Arduino est-il capable de tout faire par lui même juste avec du soft ?

Est-ce qu'il possède une entrée qu'il peut scruter pour voir un état haut et un état bas ?

Merci pour votre aide.

oui du moment que vous avez converti la tension entre 0 et 5V (ou 0 et 3.3V suivant le type d'arduino) tout le reste est simple.

un transistor de commande par exemple pour le 12V et un pont diviseur de tension (2 résistances) pour adapter les niveaux devrait aller.

Ok oui je comprends pour l'adaptation en tension c'est logique. Merci, je vais étudier la partie soft pour voir comment on scrute un port.

Bonne soirée

regardez les fonctions

digitalWrite() pour écrire une valeur (qui va faire passer votre transistor passant et envoyer les 12v)

digitalRead() qui va lire une valeur tout ou rien sur une pin (les 0v transformés en 0V ou les 12V transformés en 5V)

Merci !

Bonjour,

Pour la partie lecture d'information venant de l'OBD-1 j'ai pensé faire ceci avec un opto-coupleur. Qu'en pensez-vous ?

En fait le calculateur établit la masse et la coupe par impulsion d'une seconde.

Voilà le schéma d'origine de l'interface manuelle que je souhaite moderniser avec un Arduino :

Je pourrai ajouter un contrôle visuel avec une LED qui sera pilotée par une sortie de l'Arduino qui confirmera que l'entrée 2 à bien vu l'impulsion de l'OBD.

Pour l'affichage du n° de l'erreur finalement je vais carrément utiliser un afficheur LCD c'est plus simple et ça offre encore plus de possibilités.

Est-ce que le schéma avec l'optocoupleur (genre 4N35) vous semble cohérent ?

Pour la partie lecture d'information venant de l'OBD-1 j'ai pensé faire ceci avec un opto-coupleur. Qu'en pensez-vous ?

plutôt dans l'autre sens non? l'OBD pilote le transistor qui vous permet de récupérer le signal de l'autre côté sur votre arduino avec un e broche en INPUT_PULLUP

Le calculateur met à la masse la broche de test ce qui boucle le circuit et fait allumer la LED. Hier j'ai fait un essai et cela fonctionne parfaitement.

Il me reste maintenant à programmer l'Arduino pour qu'il incrémente un compteur à chaque fois que la Led s'allume. C'est le plus compliqué car il faut que l'incrémentation ne se fasse que sur la détection d'un front et non pas durant toute la durée d'allumage.

Un fois que j'ai une variable incrémentée et qu'il ne se passe plus rien je peux ensuite prendre cette variable et l'afficher en clair soit sur un afficheur LCD ou des segments lumineux à LED.

Ok - oui oubliez ce que j'ai dit au dessus je ne devais pas être bien réveillé :slight_smile:

Pour le code il faut faire une boucle de gestion du temps dans cette boucle avoir une gestion d'état

tempsDebut = millis();
etat = LOW_ATTENTE_HIGH
Compteur = 0

Tant que millis()-tempsDebut est inférieur au timeout
Lire l'état de la pin
Si HIGH et état == LOW_ATTENTE_HIGH alors +1 sur le compteur et changement d'état HIGH_ATTENTE_LOW (je mettrais un petit delay(15) pour le debounce ici aussi)
Si LOW et état == HIGH_ATTENTE_LOW alors changement d'état etat = LOW_ATTENTE_HIGH et remise de tempsDebut au moment présent + delay(15) de debounce
Fin de tant qu

En procédant de cette façon votre boucle tant que gère le temps et vous avez une petite machine à état à l'intérieur de ce tant que

Après le dernier retour à LOW le temps va découler sans que un HIGH arrive et donc on va atteindre le timeout et vous aurez bien dans le compteur le nombre de pulsations

Je partirais sur un shield d'un de ces types adaptables sur le UNO à moins de 10 euros, avec une préférence pour le second qui dispose en plus d'un buzzer et peut recevoir plusieurs types de cartes ajoutées (voir A1010.docx ) au cas où il faudrait faire évoluer l'application: