1

Estimer la consommation instantanée d'essence en OBD2

cut-fuel-consumptionCertains d'entre vous savent que j'ai acheté ma première voiture, une vieille Rover Streetwise. Sortie en 2004 (un an avant la démise de MG/Rover), son électronique de bord est limitée. Cependant tous les modèles produits depuis 2001 doivent légalement intégrer un port de diagnostic OBD II.

Le but original de ce port était de permettre l'analyse des émissions de gaz, en autres lors du contrôle technique. Il permet aussi de savoir pourquoi le témoin "Check Engine" est allumé avec une série de codes standardisés.

Cependant j'ai un autre objectif pour ce port : estimer ma consommation de carburant pour pouvoir mieux l'optimiser! Évidemment l'information n'est pas directement disponible sur le port OBD II...

Informations disponibles sur ma voiture

automaticTous les véhicules ne sont pas créés égaux. Certains rapportent directement le débit de carburant, mais la plupart des vieux véhicules n'offrent que quelques informations obligatoires. Dans mon cas je vais devoir me contenter de 3 données :

  • le régime moteur (en RPM)
  • la température de l'air d'admission (en °C)
  • la pression du collecteur d'admission (en kPa)

Mmmh... Pression et température devraient déjà vous mettre sur la voie de la formule physique à utiliser ici...

Attention : mathématiques

Je possède un moteur cylindrée "1.4L", ce qui signifie que ses pistons admettent 1,4 litres d'air par cycle complet. Dans un moteur 4 temps, un cycle complet prend deux tours. Si on note RPM le régime moteur, le volume d'air admis par le moteur chaque minute est donné par

V_\text{theorique} = 1,4 * RPM / 2 \;\;\;\text{(litres d'air par minute)}

Cependant l'admission d'air n'est jamais idéale et il faut intégrer un facteur appelé le rendement volumétrique. Malheureusement celui-ci n'est pas constant et l'information difficile à trouver. La plupart des sources citent 80 à 95% de rendement pour les moteurs sans turbo. J'ai arbitrairement décidé d'utiliser la valeur de 85%. Celle-ci influera l'exactitude des données mais pas leur valeur relative, ce qui est suffisant pour optimiser ma consommation. À terme je ferai des analyses statistiques pour adapter ce nombre à mon moteur.

V_\text{effectif} = 0,85 * V_\text{theorique} = 0,85 * 1,4 * RPM /2 \;\;\;\text{(litres d'air par minute)}

ideal_gas

On connait aussi la pression P (en kPa) et la température T (en Kelvin). L'équation des gaz parfaits nous permet donc immédiatement d'écrire que

n_{\text{air}} = \frac{P V_\text{eff}}{R T} \;\;\;(\text{moles d'air par minute})


avec R = 8.314 dans les unités utilisés (litres, kPa, Kelvin, moles)

Finalement on obtient la masse d'air en multipliant par la masse moléculaire de celui-ci :

m_{\text{air}} = 28,97 * n_{\text{air}} \;\;\;(\text{grammes d'air par minute})

Passer en grammes d'essence est aussi immédiat. En effet, en situation normale le moteur fonctionne en boucle fermée pour que toute l'essence soit brûlée (pour respecter les normes d'émission) tout en offrant le meilleur rendement possible (pour des raisons évidentes). À chaque cycle (donc plusieurs fois par seconde) cette boucle de régulation adapte l'injection d'essence pour que la combustion soit complète, ce qui a lieu pour un rapport massique 14,7:1 (14,7 grammes d'air pour 1 gramme d'essence).

m_{\text{essence}} = m_{\text{air}} / 14,7 \;\;\;(\text{grammes d'essence par minute})

On peut également facilement convertir en litres puisque la masse volumique de l'essence est de 720 grammes par litre :

V_{\text{essence}} = m_{\text{essence}} / 720 \;\;\;(\text{litres d'essence par minute})

Et finalement la consommation instantanée au format classique "litres aux 100" :

D_{\text{essence}} =  60 * V_{\text{essence}} * \frac{100}{v} \;\;\;(\text{litres d'essence par 100km})


avec v la vitesse en km/h

Exemple

À l'arrêt, ma voiture tourne à 831 RPM, une pression d'admission de 36 kPa et une température d'admission de 38°C (=311K). Sa cylindrée est de 1,4 litres et j'estime son rendement volumétrique à 85%.

  • Débit d'air en volume gazeux : V_\text{effectif} = 0,85 * 1,4 * 831 / 2 = 494,5 litres par minute
  • Débit d'air en masse : m_{\text{air}} = \frac{28,97 * 36 * 494,5}{8,314 * 311} = 200 grammes par minute
  • Débit d'essence en masse : m_{\text{essence}} = 200 / 14,7 = 13,6 grammes par minute
  • Débit d'essence en volume liquide : V_{\text{essence}} = 13,6 / 720 = 0,019 litres par minute
  • Soit 1,13 litres par heure à l'arrêt

Bien sûr on ne peut pas calculer la consommation aux 100km en étant à l'arrêt, mais le calcul est simple.

Formule simplifiée

Juste pour éviter les calculs inutiles sur un futur ordinateur embarqué (spoilers!) :

D_{\text{essence}} = \frac{60 * (\text{Rendement Volumetrique}) * (\text{Cylindree}) * (\text{RPM}) * 28,97 * (\text{Pression})}{2 * 8,314 * (\text{Temperature}) * 14,7 * 720}


= \frac{(\text{Rendement Volumetrique}) * (\text{Cylindree}) * (\text{RPM}) * (\text{Pression})}{101,25 * (\text{Temperature})}


= \frac{(\text{RPM}) * (\text{Pression})}{85 * (\text{Temperature})} \;\;\;(\text{litres d'essence par heure})


Attention : la dernière formule est propre à ma voiture!

2016-03-15 06.59.18

Consommation moyenne

Ce calcul ne permet que d'obtenir la consommation instantanée. Dans mon application j'envisage aussi d'afficher diverses consommations moyennes (par exemple dernière heure, derniers 100km, dernière remise à zéro...).

Pour cela il faut intégrer sur le domaine d'intérêt. Si les mesures sont prises à intervalle régulier, on peut se satisfaire de la moyenne des mesures.

Petit script Python

Ce script nécessite PyOBD (pip install obd) et un ELM327 configuré pour fonctionner avec votre ordinateur (sur port série ou Bluetooth).

#!/usr/bin/env python
import obd
import time

connection = obd.OBD()

while True:
    RPM = connection.query(obd.commands.RPM).value
    IAT = connection.query(obd.commands.INTAKE_TEMP).value
    MAP = connection.query(obd.commands.INTAKE_PRESSURE).value
    SPEED = connection.query(obd.commands.SPEED).value

    l_fuel = RPM * MAP / (IAT+273) / 85.0
    print("%.2f litres d'essence par heure" % l_fuel)
    if(SPEED > 0):
        print("%.1f litres d'essence par 100km" % (100*l_fuel*60/SPEED))

    time.sleep(5)

Pistes d'améliorations

Comme dit précédemment, le rendement volumétrique est une donnée difficile à établir. Quand j'aurai implémenté la moyenne calculée par cette méthode, je pourrai l'opposer à la moyenne calculée par les logs que je tiens à chaque fois que je fais le plein d'essence.

Une seconde approximation est le rapport massique de 14,7:1. Même si en conditions normales celui-ci est en effet maintenu, il y a certaines conditions de conduite qui forcent le moteur à brûler riche (trop d'essence) ou pauvre (trop d'air). Par exemple en pente lorsqu'on utilise le frein moteur, le moteur peut rouler très pauvre en n'injectant presque pas d'essence. Cependant la qualité de la combustion pourrait être estimée grâce aux capteurs d'O2, placés dans le circuit d'échappement et dont le voltage est directement accessible sur le port OBD2.

Conclusion

Je ne pensais pas trouver une utilité à la loi des gaz parfaits depuis que je me suis débarrassé de l'examen de Chimie il y a quelques années mais je dois dire qu'établir ce développement puis le tester expérimentalement était fun!

J'essaierai de mettre à jour mon blog quand j'aurai avancé dans l'intégration de mon Raspberry Pi 3 en tant que carputer 😉

  1. euzada dit :

    Salut Tito,

    J'ai ajouté cette page dans mes favories parce que je suis depuis un bout interessé à faire ce calcul moi meme mais j'avais pas de connaissance ni d'experience dans ce domaine.

    Pour l'instant, j'utilise l'application DashCommand sur Android et j'essaye d'analyser la consommation d'essence dans le meme objectif que toi (analyse des émissions de gaz) et surtout comment pouvoir reduire ces émissions avec une conduite économique.

    J'ai une civic 2011 manual et en survaillant avec DashCommand ma consommation, je suis passé du 7 l/100km à 6.5 l/km au bout d'un mois. J'habite à Ottawa (Canada) et je fais au moin 2 x 35 min par jour (aller-retour maison-travail).

    Si tu as des conseils à me donner ou des idées pour pouvoir connecter OBD2 directement par cable a un interface en ayant presque les memes informations que DashCommand.

    Merci d'avance et bonne continutation,
    euzada