Requiem-Projects.com

Je me suis lancé sur un nouveau petit projet :
Mon indicateur de vitesse sur ma voiture est déréglé et indique 20km/h de moins que la vitesse réelle (donc super pour les radars, youpi !! )

Au départ, je me suis dit : je vais prendre un module GPS et avec les informations je vais indiquer la vitesse du véhicule.
Or, le problème avec le GPS, c'est que dans un tunnel, ça marche pas, le temps d'accrochage du GPS peut être long plusieurs minutes, voir dizaine de minutes. Donc pas top....

Après quelques recherches sur le net j'ai vu qu'il y avait des modules OBD II en RS232 ou Bluetooth.


Pour ceux qui ne connaissent pas ce qu'est l'OBD II, c'est un standard et un protocole utilisé maintenant par les constructeurs de véhicule, qui prend en charge le BUS CAN. Avec ce protocole et une interface adequate, il est possible de lire les paramètres du calculateur du véhicule (pas tous bien sûr, ça serait trop simple) comme la vitesse, le régime moteur, et différentes informations plus techniques (consommation, volume d'air, puissance, etc...). c'est sur ce type d'interface que votre mécanicien préféré branche la fameuse valise de diagnostic.

C'est donc sur cette base que je me suis orienté.

Je ne parlerai que de l'interface OBD II Bluetooth qui fonctionne. j'ai testé d'autres adaptateur qui, sur ma Renault Laguna 2, ne fonctionnait pas.

Le module utilisé est celui-ci, acheté "3francs-six sous" sur le net en chine.
Module OBD II bluetooth
Il fonctionne aussi bien sur smartphone, tablette, PC dès l'instant que vous disposez d'une liaison bluetooth.

Pour que ma carte électronique puisse dialoguer avec le module OBD, j'utilise un module Bluetooth HC-05.

Bluetooth module HC-05

Ce module, que l'on pilote par une liaison série TTL en commande AT, permet d'établir une liaison série en bluetooth entre le module OBD (ou un module HC-06, c'est ce qui est dans le module OBD) et le HC-05. Une fois l'appairage effectué, vous êtes en liaison avec le chip ELM327 sur le bus CAN.

Le ELM327 est un chip dédié au protocole CAN et OBD. C'est via ce composant, qu'on pilote en commande AT, que l'on va pouvoir récupérer nos informations de vitesse par exemple.

voyons les étapes de tests et de développement.

Requiem-projects.com et son admin décline toute responsabilité pour les erreurs ou omissions relevées sur le site ainsi que pour les pertes, de quelque nature qu'elles soient, liées à l'utilisation de ce site Web et des informations y étant indiquées. Requiem-projects.com et son représentant ne sera en aucun cas tenu responsable dans le cas d'une détérioration du véhicule ou d'un de ses éléments le constituant (et notamment le calculateur). Lors de vos tests, il est conseillé de ne pas conduire et manipuler votre montage. Respecter également le code de la route

Le module HC-05


Le module HC-05 permet de faire une connexion maître ou esclave sur un dispositif bluetooth compatible (théoriquement le HC-06, qui lui est uniquement esclave).
Le HC-05 se pilote en commande AT. Il s'alimente en 3.3V, donc attention, si vous l'utilisez avec un arduino 5V. En 3.3V, cela convient très bien pour une carte STM32F401RE (celle que j'utilise).

Le HC-05 dispose de 2 modes de fonctionnement :

  • un mode AT, qui permet de le paramétrer,
  • un mode data ou mode transparent, qui permet d'envoyer des données sur la liaison série directement.


Pour sélectionner un des 2 modes, le module dispose d'une broche appeler KEY qui permet de passer d'un mode à l'autre. Dans notre cas, nous devons démarrer le module en mode AT, puis après l'accrochage bluetooth, le module passera automatiquement en mode data. Ensuite, plus besoin de revenir en mode AT, puisque nous serons connectez au dispositif OBD et en dialogue avec le véhicule.

  • Mode AT : Key = 1
  • Mode data : Key = 0

 

Il existe 2 versions de carte HC-05 : une avec la broche "KEY" et une version sans. il vaut mieux acheter un module avec cette broche. Si votre module ne l'a pas il faut souder un fil sur une pin de connexion du module bluetooth lui même : (broche 34 en haut à droite)
HC-05


Pour effectuer une connexion, vous devez récupérer la Mac Address du module Bluetooth avec lequel vous voulez communiquer.

Ensuite la séquence à effectuer en commande AT (KEY=1) est la suivante :

Script de connexion a un module Bluetooth

AT+ORGL

AT+ROLE=1

AT+CMODE=0

AT+BIND=8818,56,6898EB // c'est la Mac Address de mon module bluetooth OBD

AT+INIT

AT+PAIR=8818,56,6898EB,20

AT+LINK=8818,56,6898EB


Chaque ligne doit être terminée par un "\r\n" sinon, les commandes ne seront pas prises en compte par le module HC-05.
A la fin de cette série de commandes, si la Mac Address est la bonne (ici 88:18:56:68:98:EB), vous devez alors être en connexion avec votre module bluetooth esclave HC-06 ou autre (ici le module OBD et en particulier l'ELM327).

A partir de maintenant, vous devez passer en mode transparent, à savoir que pour dialoguer avec le module esclave distant, il faut mettre la broche "KEY" à 0.

OBD et ELM327


L'ELM327 est un chip dédié au protocole OBD. Il permet d'interfacer les différents bus du connecteur OBD vers une seule et même liaison de communication série.
L'ELM327 fonctionne suivant 2 modes :

  • Mode AT : ce sont des commandes spécifiques pour paramétrer l'ELM327 (par exemple le paramétrage du procotole CAN utilisé) ou pour lui demander certains paramètres particuliers, comme par exemple la tension batterie
  • Mode OBD : c'est une syntaxe particulière qui permet de lire/écrire des valeurs OBD. Ces commandes seront utilisées pour lire la vitesse, le régime moteur, etc...


⇒ Télécharger la spécification du ELM327

La première étape est d'initialiser l'ELM327 :

Avant de pouvoir communiquer avec l'ELM327 et qu'il puisse initialiser le protocole avec le calculateur de votre véhicule, il est conseillé de démarrer le véhicule. Sur certains véhicules il faut mettre le moteur en route, sur d'autres le contact en mode accessoires suffit.


Pour communiquer avec le calculateur, il faut spécifier le protocole à utiliser, qui doit être celui du véhicule. Dans le cas de ma Renault Lagune 2, c'est le protocole 5 (FAST).

  • 0 - Automatic
  • 1 - SAE J1850 PWM (41.6 kbaud)
  • 2 - SAE J1850 VPW (10.4 kbaud)
  • 3 - ISO 9141-2 (5 baud init, 10.4 kbaud)
  • 4 - ISO 14230-4 KWP (5 baud init, 10.4 kbaud)
  • 5 - ISO 14230-4 KWP (fast init, 10.4 kbaud)
  • 6 - ISO 15765-4 CAN (11 bit ID, 500 kbaud)
  • 7 - ISO 15765-4 CAN (29 bit ID, 500 kbaud)
  • 8 - ISO 15765-4 CAN (11 bit ID, 250 kbaud)
  • 9 - ISO 15765-4 CAN (29 bit ID, 250 kbaud)
  • A - SAE J1939 CAN (29 bit ID, 250* kbaud)
  • B - USER1 CAN (11* bit ID, 125* kbaud)
  • C - USER2 CAN (11* bit ID, 50* kbaud)

 

L'ELM327 dispose d'une commande pour lui indiquer de trouver automatiquement le protocole à utiliser. Pour ma part, ce mode n'a jamais fonctionné et a mis le bazar sur le bus et le calculateur indiquait de faux défauts. Une simple coupure de contact et rallumage du véhicule rétablit le fonctionnement du calculateur, ce n'est pas destructif (pour ce que j'ai constaté)


Les commandes à envoyer sont :

Script d'initialisation de l'ELM327

ATZ // initialisation

ATE0  // supprime l'echo du caractere

ATSP5  // choix du protocole 5

A chaque commande qu'on envoie, terminée par un "\n", l'ELM327 retourne sa réponse sous format texte et termine cette réponse par un ">". C'est le prompt indiquant qu'une nouvelle commande peut être envoyée.

Exemple :

ATZ\n

  ATZELM327 v2.1>

ATE0\n

  ATE0OK>

ATSP5  // choix du protocole 5

  OK>

L'initialisation terminée, on peut alors passer aux choses sérieuses : la lecture des informations OBD.

Vous pourrez regarder dans la doc de l'ELM327 le protocole en page 30-31 pour mieux comprendre, mais voici un résumé :

Pour lire une donnée de l'OBD, il faut savoir dans quel mode on veut travailler : (infos extraite de wikipedia) :

  • 01 Show current data
  • 02 Show freeze frame data
  • 03 Show stored Diagnostic Trouble Codes
  • 04 Clear Diagnostic Trouble Codes and stored values
  • 05 Test results, oxygen sensor monitoring (non CAN only)
  • 06 Test results, other component/system monitoring (Test results, oxygen sensor monitoring for CAN only)
  • 07 Show pending Diagnostic Trouble Codes (detected during current or last driving cycle)
  • 08 Control operation of on-board component/system
  • 09 Request vehicle information
  • 0A Permanent Diagnostic Trouble Codes (DTCs) (Cleared DTCs)


Dans notre cas, nous ne voulons voir les valeurs que sur l'instant. Donc on reste sur le mode 1.
Pour faire une demande de paramètres, il faut connaître le PID (parameter ID). Il existe une liste ouverte (non propriétaire) de PID qu'on peut lire (voir la page wikipedia ):

Voici une petite liste des PID que j'utilise :

  • 0C : régime moteur (rpm)
  • 0D : Vitesse véhicule
  • 11 : Position de l’accélérateur


Pour interroger le système et lui demander une valeur, il faut envoyer la chaîne :

0111\n

  35>


Dans l'exemple ici, nous demandons la position de l'accélérateur (PID 0x11) en mode 1. L'ELM327 renvoie la valeur 35 = 0x35 = 53 %. L'unité, le nombre d'octets et la signification des valeurs sont spécifiées dans la page wikipedia.

Donc maintenant, il suffit d'automatiser les données que vous voulez relire, les interpréter et les afficher à votre gré.

Maintenant, voyons un peu la partie affichage sur un écran ILI9341.

Ecran LCD 320x240 ILI9341

Pour effectuer l'affichage de la vitesse et pour que cela soit visible dans le véhicule, j'ai choisi de prendre un afficher LCD 320x240 couleur avec un driver ili9341.
La décision a été prise par rapport à plusieurs critères.

  • Bus SPI (quelques broches seulement seront utilisés sur le micro-contrôleur
  • Librairies largement disponibles sur le net
  • Facile à acheter (ebay, miniinthebox, dealextrem ou sur des sites français de commerce électronique)
  • Possibilité d'avoir des versions avec ou sans touch screen
  • Généralement embarque aussi un lecteur de carte SD


Pour prototyper rapidement j'ai choisi la librairie de Tilen de stm32f4-discovery

L’écran en lui même se présente comme suit :
ili9341 without touchscreen

Il existe plusieurs versions de cet écran : (en haut la version sans touch screen, en bas la version complète).


ili9341 with/wihtout TouchScreen interface

Les connecteurs sont différents, plus long sur la version TouchScreen pour donner accès aux broches du contrôleur de TouchScreen.
On voit aussi qu'il y a sur les 2 versions l'interface pour carte SD. Cela peut être intéressant pour stocker des données (fichiers de logs, fichiers d'images, etc...) ce sujet sera traité plus loin.

L'écran se pilote via un SPI et quelques signaux complémentaires :

  • SCK : horloge du SPI
  • MOSI : ligne des données envoyées depuis le microcontrôleur
  • MISO : ligne de lecture des données par le microcontrôleur (pas utilisé)
  • CS : Chip select
  • D/C : ligne indiquant si on envoie une commande ou des données
  • RESET : Reset de l'afficheur

 

Le ILI9341 dispose d'un jeu de commande pour par exemple envoyer les données de couleur des pixels, définir des zones de tracé, choisir l'orientation de l’écran. Pour envoyer une commande et ses données il faut suivre le cheminement suivant :

1. Mettre CS = 0
2. Mettre D/C = 0 (pour l'envoi de la commande)
3. Envoyer les 8 bits du numéro de commande par SPI

Si il y a des données à envoyer :


4. Mettre D/C = 1.

5. Envoyer les données par SPI les unes derrière les autres

6. On clôture la communication en mettant CS = 1.

Le transfert, pour les données, si il y a plusieurs données à transmettre peut être fait en utilisant le DMA du STM32.

Je vous conseille de lire le code de Tilen, qui est très bien écrit et qui vous montrera la méthode pour initialiser le ILI9341 pour faire des affichages.

Malgré tout, j'ai apporté une amélioration et des compléments sur la librairie de Tilen (que Tilen a ensuite intégré dans son code) :

  • D'une part pour pouvoir avoir plus de vitesse pour les affichages, car l'affichage d'un digit prenait plusieurs 100aine de milliseconde, donc passage par le DMA
  • d'autre pas pour ajouter des fonctions d'affichage d’icône, et de font optimisé, car elle manquait à mon logiciel.

 

Vous trouverez les informations dans cet article, avec un code d'exemple.

Affichage des informations

Les informations remontées par l'OBD sont la vitesse du véhicule et la valeur du compte-tours.


compteur400

Ces informations sont afficher sous 2 formes :

  • La vitesse sous forme de gros digits
  • Le compte tour sous forme de barre de couleur, allant du vert au rouge en passant par le jaune, pour indiquer la zone de tolérance de la vitesse moteur.

Pour les digits du compteur de vitesse, c'est en fait une série d'image monochrome de 80x120. Ce n'est pas une font de caractères énormes mais des images (0 à 9) créées sous Gimp et exportées au format XBM.
Digit4
Chaque bit à 1 correspond à un point de couleur, un 0 à du noir.
Pour afficher la vitesse, nous afficherons donc 3 Digits maxi sur l’écran.

Donc pour chaque changement de vitesse, on remplace l'ancien digit par le nouveau digit. Il n'y a pas d'effacement, mais une réécriture par dessus à la même position sur l'écran, ceci pour éviter un temps inutile d'effacement et surtout un défaut d'affichage entre le temps effacé et le temps réécrit, on peut avoir l'impression que le digit clignote.

Pour le compte-tours, c'est le même principe d'affichage d'une l'image.
RPM
La différence c'est qu'en fonction de la valeur du compteur tour on affiche une portion "proportionnelle" à la valeur :
si on considère que la barre du compteur atteint le rouge à 5000 tours/min, alors 5000 = image complète , 0 = rien de l'image, 2500 = la moitié.
De la même manière que pour les digits, vu la forme de la barre, on a pas besoin de faire un effacement, puis une affichage de la portion.
Pour optimiser l'affichage on affiche les valeurs de couleur de chaque pixel jusqu'à la "valeur" du compte-tours (de gauche a droite) et ensuite on complète par des pixels de fond (donc noir dans mon cas) pour effacer la portion droite de l'image qui ne doit pas être affichée.

Mise en Oeuvre globale

Tous ces éléments ont été mis ensemble pour obtenir un truc pas trop mal.

Le soft tourne autour de FreeRtos, comme ordonnanceur de taches :

  • Une tâche qui gère la communication avec le module bluetooth, de l'init du BlueTooth jusqu'au communication avec l'OBD
  • Une tâche d'affichage, qui accepte les messages en provenance de la tâche OBD. Elle reprend les informations de vitesse, de compte tour.


Le cadencement des commandes OBD se fait tous les 50ms.
L'affichage n'est changé que si cela est nécessaire, c'est à dire uniquement si la vitesse change. Si on reste à 50Km/h pendant 10min, alors, la tâche d'affichage recevra toutes les 500ms l'information de vitesse, mais ne fera aucun affichage.

Voici le résultat du projet en vidéo.

 

 

 

Vous remarquerez que j'ai mis en plus un GPS qui, lui, ne sert qu'à donner l'orientation boussole du véhicule par rapport au nord et donne également l'altitude (affichage en haut à gauche et droite).

Le projet s’arrête là car à la rédaction et finalisation de l'article, je change de voiture. Je vais pouvoir récupérer les composants pour autre chose.

N’hésitez pas à faire vos commentaires et à poser des questions sur ce sujet.

Requiem