Raspberry Cars – Les Technos (2/4) – Communication avec le connecteur OBD en Python
Le connecteur OBD
Le connecteur OBD est également connecté au port USB, c’est-à-dire qu’on va aussi utiliser une communication de type série, comme pour le connecteur GPS.
Seulement, le protocole de communication OBD est beaucoup plus complexe que celui du module GPS.
Pour le module GPS, il suffisait d’envoyer quelques commandes d’initialisation, puis le module GPS envoyait via le port série un flux texte contenant les positions GPS à période régulière, qu’il suffisait de repérer (pas forcément facile non plus, mais toujours la même séquence à isoler).
Ici le bus OBD répond à des commandes, comme ‘dis moi la vitesse’, ‘dis moi la fréquence du moteur’, rtc, et chaque commande doit être interprétée selon un protocole. Il existe différente version du protocole de diagnostic, celui qui nous intéresse est le ISO 15765-4 CAN. (https://en.wikipedia.org/wiki/On-board_diagnostics).
Le programme doit parler à l’interface (le module rouge) qui fait un pont entre ce protocole du bus OBD (du connecteur vers la voiture) et le flux série du bus USB (ordinateur vers le connecteur). Pour communiquer avec cette interface, on utilise le protocole qui commande le microcontroleur ELM327 du connecteur, https://en.wikipedia.org/wiki/ELM327
Pour coder en
python les appels vers le connecteur, on pourrait apprendre à utiliser ce
protocole directement en mode texte (comme pour le connecteur GPS), mais
manipuler tous les codes de commandes est très long à apprendre. C’est
pourquoi, il est intéressant de voir si quelqu’un a déjà fait le travail….
Utilisation de la librairie OBD
Comme le sujet qui m’occupe a déjà été étudié par différentes personnes, des programmeurs ont eu l’idée de crée une librairie python qui code une fois pour toutes les détails du protocole.
La libaririe que je vais utiliser est python-OBD :
https://python-obd.readthedocs.io/en/latest/
Pour l’utiliser, il suffit de savoir appeler des fonctions python avec les bons paramètres.
Voici à quoi ressemble le type de code qu’il faut savoir écrire.
connection = obd.OBD() # auto-connects to USB or RF port
cmd = obd.commands.SPEED # select an OBD command (sensor)
response = connection.query(cmd) # send the command, and parse the response
C’est plus simple que de devoir décortiquer tout le flux texte…
Installation de la librairie OBD
Pour que la librairie soit disponible dans l’environnement python, il faut appeler l’installeur de librairies Python (pip, ou pip3 pour la version 3 de pyhton) avec le nom de la librairie python que l’on souhaite, ici « obd »
$ pip install obd
Utilisation de la librairie OBD
Une fois la librairie OBD installée, on peut lancer l’IDE python, y coder le programme d’exemple et regarder le résultat obtenu.
Code du programme d’exemple
import obd
connection = obd.OBD() # auto-connects to USB or RF port
cmd = obd.commands.SPEED # select an OBD command (sensor)
response = connection.query(cmd) # send the command, and parse the response
print(response.value) # returns unit-bearing values thanks to Pint
print(response.value.to("mph")) # user-friendly unit conversions
Lançons maintenant le code dans l’IDE python :
La librairie est
bien appelée, elle a reconnu le connecteur, mais celui-ci n’étant pas relié à
la voiture, le code a déclenché une erreur ‘No connection to car » !
En voiture !
Il est temps maintenant d’essayer en vrai pour voir ce que cela donne :
Tout d’abord onconnecte le connecteur ELM327 au port OBD de la voiture :
Puis on lance à nouveau le programme (une première fois à l’arrêt, une seconde avec la voiture en mouvement) :
Je sais maintenant utiliser Python pour accéder aux données de la voiture !