
Systeme de monitoring temps reel pour vehicule. Apercu du systeme:
|

Fonctionnalitées:
Les fabricants de véhicules, depuis plusieurs années (1996?), ont l'obligation de rendre accessible l'ordinateur de bord des véhicules afin que l'on puisse extraire certaines informations, de plusieurs types. Point de vue loi, c'est certainement l'état du système en rapport avec les émissions de gaz qui intéresse le plus, on s'en doute. Mais par chance, il y a beaucoup plus que cette branche de disponible! La norme de communication est codée OBD-2, le standard obligatoire, et un port de connection est disponible dans tous les véhicules pour y brancher un appareil de lecture. (Souvent près du levier pour ouvrir le capot, coté conducteur). Plusieurs protocoles existes, ça, fallait s'y attendre, et cela change d'une marque a l'autre. Toyota et Volvo par exemple, utilisent majoritairement le protocole ISO.
Donc, il y a de l'information cachée la dessous! humm... il va falloir l'extraire =) La raison principale pour laquelle les usagés de véhicules se procurent un lecteur OBD-2, c'est certainement pour connaitre les fameux codes d'erreurs qui allument des lumières dans le *dash*. Les garages ont évidement des systèmes beaucoup plus évolués que les petits lecteurs a 70$ de chez Canadian tire, mais parfois il peut être intéressant de trouver soit même la cause d'un problème...n'est-ce pas. Autre raison moins courante mais qui gagnera certainement avec le temps, c'est d'avoir un aperçu des performances du véhicule en temps réel, soit, la consomation pour les consciencieux, ou les PERFORMANCEs pour les autres.
Cela peut évidement exciter un certain genre de personnes, des plans pour pas dormir c'est sûr! Combien je consomme en roulant a 100, 90, 120, avec la remorque, pas de remorque, avec les pneus d'hivers, en accélerant doucement, comme un cave? Un simple lecteur OBD-2 ne permettra pas ce genre d'incursion, mais un heureux mélange de composantes électroniques pourrait très bien y arriver!
Tout d'abord, parler avec le véhicule: chose simple pour un ELM 327. C'est a une compagnie basée en Ontario que l'on doit cette petite puce fort sympathique, qui s'occupera de discuter le langague que le véhicule connait, pour en extraire le Jus! La ELM327 supporte pratiquement tous les protocoles existant des véhicules de grande marque. Ils fournissent des schémas de circuit et amplement d'information sur tous leur produits. |
|
Ensuite, il faut bien assimiler les données, sortir quelques formules dignes d'Einstein et puis s'occuper de les montrer a qui de droit. Là, le PIC entre en scène! |
Voici un PIC 12F683, en compagnie d'un grain de riz. |
Finalement, il faut bien programmer un peu de logique pour que tout s'opère, et c'est en PicBasic que nous nous amuseront ici. |

1ere etape: Le circuit du ELM
Comme la compagnie fournit tous les schémas et les composantes a utiliser, cette étape est une simple operation de placement et de soudage. A noter que certains ports non utilisés du ELM devraient etre connectés, soit au ground ou a la source, pour un bon fonctionnement. voir document AN02 - ELM327http://www.elmelectronics.com/appnotes.html Pour ma part, j'ai choisit d'utiliser une puce MAX232 a la sortie des ports RX/TX du ELM, question de fiabilité pour des transferts a plus grande distance. 25 pieds par l'intermédiaire d'un cable réseau CAT5 est de l'ordre du possible, même a des vitesses de 115K baud!
Une fois le circuit complet, on peut valider rapidement son fonctionnement en reliant les ports de communication au port seriel d'un ordinateur. Notez que le ELM327 peut etre par défaut a 9600baud ou a 38400, selon l'etat de la PIN 6. Il est suggérer de rendre cette pin modifiable soit par un jumper ou un interrupteur, question de faciliter le debuging. Le plus classique des interfaces pour communiquer par port serie dans Windows est surement Hyperterminal, mais c'est un outil tres vieu et étrange a configurer. Plus élégant et fonctionnel, le petit programme SerialCom.exe(qui vient gratuitement avec MicroCode studio) devrait vous faire oublier les cauchemars de Hyperterm.. Si tout est branché correctement, le ELM fera clignoter ces 4 LED en cascade au départ, et ensuite attendra les instructions. Il envoit aussi un message d'identification sur le port série donc votre ordinateur devrait recevoir quelque chose. Si vous n'avez pas vu le message, essayer d'envoyer la commande ATZ, qui devrait créer un reset complet du ELM et donc ré-émettre le message de départ. A noter que le ELM execute votre commande quand le caractere (13)(Carriage return) est reçu, donc le programme que vous utiliser pour communiquer doit etre configurer de la sorte. (SerialCom.exe l'est par defaut).
Une fois la communication établie entre votre PC et le ELM, on peut passer a la plus exitante operation soit parler au ECU de votre voiture. Cela requiert évidement un cable OBD-2 branché entre votre véhicule et le ELM, ainsi que d'avoir la clef en position ON. Un ordinateur portable sera tres pratique a ce point. Le ELM etablie une connection au ECU a la premiere commande qui le requiert, donc un envois du genre 03 (codes d'erreurs) peut vous permettre de confirmer si la connection est valide. Le protocol sera choisi automatiquement si vous n'avez pas rien changer dans les reglages du ELM. A noter que la premiere commande peut prendre 3 secondes avant de retourner une reponse, car certains protocol ont une procedure d'initialisation. Donc a ce point, si vous êtes connectés, la commande 03 vous retournera une réponse du type >43 00 00 00 00 00 de la part du ELM. Alleluhia!
Chose certe amusante est de tester son ELM avec un logiciel d'analyse OBD, qui sont disponible souvent en version d'essais. Vous pourrez ainsi voir une foule d'information selon votre type de voiture.
Ensuite, vient possiblement l'étape de créer un systeme autonome(independant d'un ordinateur), qui pourra être en permanence dans le véhicule et s'exprimer par un petit écran LCD.
C'est ici qu'on entre dans le monde des micropuces et l'electronique programmable. Sachant que notre circuit ELM fonctionne, on peut d'abord essayer d'automatiser quelques commandes et valider les reponses recues. Pour ma part, le premier circuit realisé est sur un tres minimaliste PIC 12F683. Il ne possede pas de moyen de communication très évolués, mais je l'apprécie pour sa simpicité et la vitesse a laquelle on peut le transférer entre un circuit et le programmeur. Pour la communication avec le ELM327, 2 pins sont nécessaires soit Rx/Tx. Ensuite une autre pin doit servir a l'affichage et puis pour le reste c'est selon l'inspiration. Une LED temoins est touours appréciable aux débuts, simplement pour savoir si le processeur tourne rond.
schémas et programme a venir... Le seul point embêtant du 12F683 est que par manque de fonctions avancées en communication sérielle, les erreurs de connections risquent de bloquer le bon fonctionnement du programme...mais en temps normal cela ne pose pas de probleme.
|
Afin de tester la communication PIC-ELM, il faut nécessairement etre branché au véhicule et dans certains cas même être en déplacement(vitesse, rpm..). Cela n'étant pas toujours pratique, l'idée de créer un logiciel qui simule les reponses d'un ELM m'est passée par la tête...et quelques jours plus tards, c'était enfin réalisé. Un petit programme (pour PC)qui communique par port sériel peut-etre directement relié a un microprocesseurs et répond a quelques questions usuelles tel que le ferait le ELM327: rpm, vitesse, MAF, voltage, liquide refroidisseur. Le seul point critique a surveiller dans certains cas est la vitesse de réponse, qui se joue souvent en millisecondes, et qui n'est pas simulée de façon exacte...éventuellement je pourrai améliorer la chose si la paresse s'enfuit. Les connections nécessaires pour la communication sont un port serie sur un PC et un petit circuit avec un MAX232 dont les sorties se branchent vers votre microprosseur. On the right, a small utility software that was created to simulate answers of the ELM327 on the serial port of a PC, providing a quick way to validate the programming of a microprocessor. Standard requests have been implemented: speed, dtc, coolant, rpm, and also the upgradeable speed function is in there(ie: request as AT BRD 23...). Make sure to set the initial baud rate correctly(ELM and PC port at same speed). You should use a MAX232 to connect the serial port to your microprocessor. Téléchargement / Download |
![]() |
Un peu de code / Some Code (for picbasic) Sur un PIC tel le 12f683, n'ayant pas de fonction dédié à la communication série en hardware, il faut s'en remettre à la méthode logicielle. Cela fonctionne, passablement bien même à haute vitesse, sauf que la gestion des erreurs de signal risque de bloquer le programme. Il est rare de rencontrer une erreur à vrai dire, et on peut toujours faire un reset du circuit pour remettre entre fonction.. Alors voici les débuts. Paramètres, config, variables |
|
|
'Program for ELM327 chip communication '------------------------------------------------------------------- DEFINE OSC 20 ; Xtal a 20mhz, required for highspeed communication mode 115kbaud ANSEL = %00001000 'Set A/D, A/D clock = Frc Vchar var Byte DebugTXport var GPIO.0 INPUT GPIO.1 'debug RX, TRUE MODE slowswitch=0 |
Pause 1500 ; Timeout for LCD to boot up ReInit: ConnectELM: SEROUT LCDport, T9600, [$FE,$C0, "..Test HighSpeed " ] SEROUT DebugTXport, T9600, ["AT BRD 23",13] ; Attempt to init communication at 115200baud(23) if (StrList[1]=76) and (StrList[2]=77) then ;SEROUT LCDport, T9600, [$FE,$C0, "Link Speed upgraded!" ] ; BLANKED TO SAVE CODE SEROUT LCDport, T9600, [$FE,$C0, " Link ok..." ] DEBUG 13 DEBUGIN [WAIT("ELM327 v1."),DEC TmpBit_high, TmpBit_low] pause 15 DEBUG "ATE0",13 ; set ECHO OFF Gosub ShowBattVoltage pause 15 SEROUT LCDport, T9600, [$FE,$D4] TryConnectECU: pause 200 ;Presets for Sub rxBunch of char! gosub linefeeddelay ;DEBUGIN [HEX2 return_code, WAIT(13), WAIT(10)] ; wait for code and linefeed + carriage return GoSub RxBunchOfChar ; If no code is returned, it would do SEARCHING...meaning there is no connection to the car if (StrLIst[0]=52) and (StrLIst[1]=51) then ; Check si on a bien le code 43 (52/51dec) mainloop: ; Read RPM DEBUGIN [HEX2 return_code, HEX2 rtid_code, HEX2 TmpBit_High, HEX2 TmpBit_low, WAIT(13), WAIT(10)] ;toggle ControlLED ; Read SPEED ;toggle ControlLED ; Read MASS Air Flow DEBUGIN [HEX2 return_code, HEX2 rtid_code, HEX2 TmpBit_High, HEX2 TmpBit_low, WAIT(13), WAIT(10)] MAF = TmpBit_High*256+TmpBit_low ; a diviser par 100 plus tards TmpWVal = 23518/(MPG*10) ; Value is 10times bigger, to save/keep 1 digit for display later gosub ShowMAF if VehSpeed>0 then pause 300 if switchbit=0 then ;toggle ControlLED slowswitch=slowswitch+1 if slowswitch>3 then ;switchbit=switchbit^1 if switchbit=0 then goto mainloop ; do it all again ; **** SUB-ROUTINE **** poutine linefeeddelay: RxBunchOfChar: PrintRxChar: NumbBlank: ShowMAF: ShowBattVoltage: ;READ BATT VOLTAGE return ShowCoolantTemp: ; Read Coolant TEMP DEBUGIN [HEX2 return_code, HEX2 rtid_code, HEX2 CoolantTemp, WAIT(13), WAIT(10)] BlankCharChk: RETURN |
Ce code remplit pratiquement au complet la mémoire d'un 12F683...
Avant de connecter le PIC au ELM, il est bon de s'assurer que vous puissiez <parler> au ELM
simplement en le connectant à votre ordinateur (en passant par un MAX232) sur le port série.
Ensuite à l'aide d'un programme terminal vous envoyez des commandes et vous devriez être
au minimum en mesure de lire le message d'initialisation du ELM. ("ELM327 v1.3a").
Fonctions ODB. Après avoir fait fonctionner correctement la communication, il est possible d'ajouter quelques fonctionalitées intéressantes. Le code ci-haut permet un calcul simpliste de la consommation en temps réel, qui est relativement précis sauf que très dynamique(voir hyperactif) sur la route. Une moyenne de valeur sera certainement intéressante pour être en mesure d'apprécier cette fonction. À noté que ce calcul utilise la vitesse et le Mass Air flow, et que dans certaines conditions(surtout sur l'air d'allé), les calculs deviennent étranges. Le problème vient du fait que la consommation est très faible(moteur idle) et la vitesse très grande, donc vous êtes temporairement très performant. Dans ce cas le calcul dépasse les valeurs maximales pour une variable BYTE en picbasic, soit 256 comme pour la valeur du MPG(mile per gallon). Il serait souhaitable de modifier le code pour tenir compte de cette situation, soit en utilisant une variable WORD(655xx) ou en limitant l'affichage si on détecte une trop grande valeur. MAF? Mass air flow, donnée plutôt peu significative, que je n'ai pas pris le temps de convertir dans mon programme, mais qui peut facilement etre transformée en plus utile. Multipliez la par 0.08 et des poussièes pour obtenir le nombre de gallons à l'heure de consommation. Pour les amateurs de métrique on remet ca en litre et tout le monde est heureux. Petite note aussi que la valeur du MAF dans cet exemple doit etre divisee par 100 a partir de la lecture brute, mais pour des raisons de precision on le fait le plus tards possible dans les equations! Sur un PIC plus volumineux(ex 16F648), on peut penser a ajouter un decodage sommaire des code d'erreur ODB, qui se lisent en demandant ¨03¨au ELM. Les codes sont organisé en pair et le guide du ELM explique assez bien comment les décoder. Je fais normalement la lecture des codes au démarrage de mon système. Autre ajout de marque, une alerte en cas de haute température. Pour ma part l'huile se maintient presque en permanence a 85deg C, alors je suppose que 90 serait anormale et un avis serait une bonne ation préventive. Pour le reste, RPM, vitesse, voltage, c'est plutôt du froufrou mais si vous avez un grand écran, aussi bien le remplir. |
PIC picbasic ELM 327 v1.3a system system mileage calculation calculs consommation mpg litre cent kilometre rpm vitesse milles par heure kilometre heure temperature fluide coolant temp programming programmation interface OBD2 OBD-2 ECU link 16F628a 12F683 ELM simulator PC windows ISO protocol CAN J LCD display information average moyenne realtime temps reel monitoring performance acceleration speed voltage 12V 14V simulator elm no connection required simulateur elm 327 permet de tester sans connection