Création d'un afficheur OBD/data logger Arduino - Partie 1

Houlà, ça fait vraiment longtemps que je n'ai pas écrit par ici :) On va tenter de remédier à ça, avec une série d'articles sur mon (nouveau) dada : l'Arduino.

Un des projets que je vais essayer de partager avec vous est directement lié à l'automobile : un datalogger / afficheur basé sur le protocole OBD.

A vos marques, prêts ? Partez !

Alors, nous allons tenter de clarifier un peu le titre pour le moins obscur de cet article. Data logger ? OBD ? voiture ? Non là, faut pas pousser :)

Je vais tout d'abord vous exposer la problématique, vous verrez, ça va vite devenir très clair ;)


Il était une fois...


... un père de famille (nombreuse) qui a dû changer de voiture. Adieu le break hightech, bonjour le monospace 7 places un peu moins hightech.

La chose qui me chagrine le plus avec cette voiture (comparé à l'ancienne) c'est le compteur de vitesse analogique. Oui oui, analogique, en 2014 :

Tableau de bord C8 (C'est pas le mien, mais vous avez saisi l'idée)

C'était donc le moment ou jamais de pallier à ce problème en mélangeant un peu de développement et d'électronique.

Il faut savoir que toutes les voitures depuis 2002 (essence) et 2004 (diesel) en Europe sont équipés obligatoirement d'une prise diagnostique, dans l'habitacle. Cette prise, normée, sert à communiquer avec la voiture via le protocole OBD (On Board Diagnostics)

Ce protocole, très fourni et très détaillé, permet en principe de fournir une masse considérable d'information sur le moteur, et même remonter d'éventuels problèmes. Si vous avez un voyant jaune représentant un moteur sur votre tableau de bord, et qu'il est allumé, c'est que l'OBD a remonté un code d'erreur.


OBD, oui mais encore ?


L'OBD comme je vous le disais permet de remonter une masse considérable d'information. Je vous laisse jeter un oeil à la page wikipedia listant toutes les informations potentiellement accessibles pour vous faire une idée.

Bon, ne vous faites pas trop d'illusion non plus, c'est une norme, mais chaque constructeur est libre d'implémenter telle ou telle mesure.

Les plus couramment implémentées sont la vitesse instantanée, le régime moteur, la consommation (via un calcul à effectuer).

Idéal donc pour mon projet !

La question qui se pose à présent, c'est de savoir comment récupérer ces informations et les exploiter à partir d'un Arduino. C'est là qu'intervient notre ami eBay :)

Il existe une multitude d'adaptateur OBD sur eBay, notamment chez les vendeurs chinois. Hormis un prix défiant toute concurrence, l'avantage de ces adaptateurs c'est qu'ils sont universels et sont disponibles dans plusieurs modes de communication.

Celui qui a retenu mon attention, c'est celui là :

OBD 2 bluetooth

Une prise OBD2 d'un côté, une interface bluetooth série de l'autre. Sachant que la prise OBD fournit l'alimentation, même pas besoin de câble supplémentaire pour le faire marcher.

L'objectif est donc de brancher un Arduino (Uno suffira pour le moment) à une extension bluetooth facilement adressable, et ainsi faire communiquer l'Arduino et la voiture, par le biais de ce dongle OBD


Une histoire de dent bleue


Je vous la fait courte, j'ai fait le tour des extensions Bluetooth disponibles pour Arduino, et mon choix s'est arrêté sur le HC-05. C'est un joli petit transceiver Bluetooth. Transceiver car il peut être à la fois master et slave Bluetooth. Ca coute pas plus cher qu'un simple receiver (le HC-06 par exemple), vous pourrez vous en resservir si le coeur vous en dit.

HC 06 bluetooth Arduino

HC-06 Bluetooth Arduino

Comme vous pouvez le voir sur la photo, le brochage est extrêmement simple :

  • une broche pour la masse
  • une broche 3,3v et une autre en 5v (vous pouvez choisir le voltage donc)
  • une pour la transmission, une pour la réception (TX, RX)
  • une broche Key pour le passage en mode commande du chip (j'y reviendrais plus tard)

En résumé, le branchement à un Arduino Uno donnerait ça :

Bluetooh sur un arduino

Le module bluetooth n'est pas le bon, mais le brochage est le même. De gauche à droite :

GND - 3.3 - 5 - TX - RX - KEY

Décortiquons un peu tout ça :)

Avec le script ci dessus, nous mettons le HC-05 en mode commande (par opposition au mode link) pour pouvoir jouer avec :) Il suffit d'envoyer du courant dans la broche KEY au démarrage. Le module passe ainsi en mode commande, et la LED clignote lentement.

Ensuite, c'est un bête pont série qui est monté entre le module et l'arduino. Si vous ouvrez la console de votre IDE, vous pourrez taper des commandes AT pour piloter votre module.

Si vous voulez la liste complète des commandes reconnues par le module, allez jeter un oeil par ici

Voilà, votre Arduino possède maintenant une extension Bluetooth !


Et demain, le monde !


A présent, nous disposons d'une fenêtre sur le monde avec le module BT.

Il nous reste à trouver avec qui parler :)

Et si nous tentions de parler avec notre ELM327 Bluetooth ? (oui c'est le ptit nom de notre module OBD2)

Allez, je vais vous donner un petit tips : vous n'êtes pas obligé d'aller coder dans votre voiture, pour l'instant. Etant donné que nous avons juste besoin d'établir la connection avec l'ELM, et pas de communiquer avec la voiture,nous devons juste l'alimenter.

La prise OBD fournissant du 12V, une bonne vieille pile 9V fera amplement l'affaire.

Schema prise OBD2

Le - sur la broche 4, le + sur la broche 16, et le tour est joué. Le périphérique est actif, et est visible en Bluetooth.

Il nous faut à présent déterminer l'adresse du module, pour que notre arduino s'y connecte automatiquement.

Utilisez le script ci-dessus, et tapez les commandes suivantes dans le moniteur série :



AT
>OK
AT+ROLE?
>+ROLE:0
>OK
AT+ROLE=1
>OK
AT+PSWD=1234
>OK
AT+INQ
>ERROR
AT+INIT
>OK
AT+INQ
>+INQ: D:18:01
>(...)
AT+INQC
>OK
AT+PAIR= D,18,01,10 -> le dernier numéro correspond au timeout de connexion
>OK
AT+LINK= D,18,01
>OK

Le but étant ici de passer le HC-05 en mode Master (AT+ROLE=1), de définir son mot de passe par défaut (1234, celui-ci étant le mot de passe du module ELM327 la plupart du temps). Ensuite, nous lançons une recherche (AT+INQ) pour déterminer les périphériques BT à proximité. Viens après l'appariement et l'établissement de la connexion.


Un lien très fort


Maintenant, nous savons créer un connexion série over BT à la main. Et si nous automatisions ça un peu plus ?

Simple non ? :)

Dans la fonction setupBluetoothConnection(), nous refaisons le process que nous avons effectué à la main tout à l'heure.

Avec cette base, nous sommes à même de nous connecter à notre module ELM327. la variable blueToothSerial étant de type SoftwareSerial, il est facile de lire et d'écrire sur ce port série logiciel.

La prochaine fois, nous verrons comment parler avec des mots doux à l'ELM327, et qu'il nous livre tous les secrets de votre voiture.

En attendant, un petit aperçu du prototype, avec l'affichage du régime moteur en direct :

Publié le :
24/04/2014
Dans la catégorie :
Auteur :
Mathieu LESNIAK
Mathieu LESNIAK
Commentaires :
nico
nico
Super sympa !
J’espère la suite très prochainement.
Bravo pour le hack.
31/05/2014 23:08:20
Grégory MARTIN
Grégory MARTIN
Bonjour Mathieu et félicitations pour cet article.

Je recherchais justement des infos sur la façon d'utiliser un arduino directement avec l'un de ces petit dongle bluetooth OBD!

Je n'ai pas trouvé la partie 2 de ton post sur ce mod.

Ici nous avons toute la partie initialisation, et je recherche un exemple dans le genre de ta vidéo: ou l'on récupère la valeur rpm.

As-tu un lien à me conseiller?
Merci
04/10/2017 15:58:06
Gab
Gab
Hello, je suis également bien intéressé par la suite, comment afficher les données sur un écran oled ssd1306 ? pourriez-vous mettre à disposition les sketchs arduino ? merci !
10/04/2019 21:43:11
Articles de la catégorie Arduino :