{"id":881,"date":"2019-12-01T14:19:00","date_gmt":"2019-12-01T13:19:00","guid":{"rendered":"http:\/\/wollef.org\/?p=881"},"modified":"2019-12-01T14:19:00","modified_gmt":"2019-12-01T13:19:00","slug":"communication-avec-le-connecteur-obd-en-python","status":"publish","type":"post","link":"https:\/\/wollef.org\/blog\/communication-avec-le-connecteur-obd-en-python\/","title":{"rendered":"Raspberry Cars &#8211; Les Technos (2\/4) &#8211; Communication avec le connecteur OBD en Python"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><a>Le connecteur OBD<\/a><\/h1>\n\n\n\n<p>Le connecteur OBD\nest \u00e9galement connect\u00e9 au port USB, c\u2019est-\u00e0-dire qu\u2019on va aussi utiliser une\ncommunication de type s\u00e9rie, comme pour le connecteur GPS.<\/p>\n\n\n\n<p>Seulement, le\nprotocole de communication OBD est beaucoup plus complexe que celui du module\nGPS.<\/p>\n\n\n\n<p>Pour le module GPS,\nil suffisait d\u2019envoyer quelques commandes d\u2019initialisation, puis le module GPS\nenvoyait via le port s\u00e9rie un flux texte contenant les positions GPS \u00e0 p\u00e9riode\nr\u00e9guli\u00e8re, qu\u2019il suffisait de rep\u00e9rer (pas forc\u00e9ment facile non plus, mais\ntoujours la m\u00eame s\u00e9quence \u00e0 isoler).<\/p>\n\n\n\n<p>Ici le bus OBD\nr\u00e9pond \u00e0 des commandes, comme \u2018dis moi la vitesse\u2019, \u2018dis moi la fr\u00e9quence du\nmoteur\u2019, rtc, et chaque commande doit \u00eatre interpr\u00e9t\u00e9e selon un protocole. Il\nexiste diff\u00e9rente version du protocole de diagnostic, celui qui nous int\u00e9resse\nest le ISO 15765-4 CAN.&nbsp; (<a href=\"https:\/\/en.wikipedia.org\/wiki\/On-board_diagnostics\">https:\/\/en.wikipedia.org\/wiki\/On-board_diagnostics<\/a>).<\/p>\n\n\n\n<p>Le programme doit parler \u00e0 l\u2019interface (le module rouge) qui fait un pont entre ce protocole du bus OBD (du connecteur vers la voiture) et le flux s\u00e9rie du bus USB (ordinateur vers le connecteur). Pour communiquer avec cette interface, on utilise le protocole qui commande le microcontroleur ELM327 du connecteur, <a href=\"https:\/\/en.wikipedia.org\/wiki\/ELM327\">https:\/\/en.wikipedia.org\/wiki\/ELM327<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/var1.png\" alt=\"\" class=\"wp-image-882\"\/><\/figure>\n\n\n\n<p>Pour coder en\npython les appels vers le connecteur, on pourrait apprendre \u00e0 utiliser ce\nprotocole directement en mode texte (comme pour le connecteur GPS), mais\nmanipuler tous les codes de commandes est tr\u00e8s long \u00e0 apprendre. C\u2019est\npourquoi, il est int\u00e9ressant de voir si quelqu\u2019un a d\u00e9j\u00e0 fait le travail\u2026. <br \/><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Utilisation de la librairie OBD<\/a><\/h1>\n\n\n\n<p>Comme le sujet qui\nm\u2019occupe a d\u00e9j\u00e0 \u00e9t\u00e9 \u00e9tudi\u00e9 par diff\u00e9rentes personnes, des programmeurs ont eu\nl\u2019id\u00e9e de cr\u00e9e une librairie python qui code une fois pour toutes les d\u00e9tails\ndu protocole.<\/p>\n\n\n\n<p>La libaririe que je\nvais utiliser est <strong>python-OBD&nbsp;:<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/python-obd.readthedocs.io\/en\/latest\/\">https:\/\/python-obd.readthedocs.io\/en\/latest\/<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/car2.png\" alt=\"\" class=\"wp-image-883\"\/><\/figure>\n\n\n\n<p>Pour l\u2019utiliser, il\nsuffit de savoir appeler des fonctions python avec les bons param\u00e8tres.<\/p>\n\n\n\n<p>Voici \u00e0 quoi ressemble le type de code qu\u2019il faut savoir \u00e9crire.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>connection = obd.OBD() # auto-connects to USB or RF port\ncmd = obd.commands.SPEED # select an OBD command (sensor)\nresponse = connection.query(cmd) # send the command, and parse the response<\/code><\/pre>\n\n\n\n<p>C\u2019est plus simple que de devoir d\u00e9cortiquer tout le flux\ntexte\u2026 <\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Installation de la librairie OBD<\/a><\/h1>\n\n\n\n<p>Pour que la librairie soit disponible dans l\u2019environnement python, il faut appeler l\u2019installeur de librairies Python (pip, ou pip3 pour la version 3 de pyhton) avec le nom de la librairie python que l\u2019on souhaite, ici \u00ab&nbsp;obd&nbsp;\u00bb<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ pip install obd<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/car3.png\" alt=\"\" class=\"wp-image-884\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Utilisation de la librairie OBD<\/a><\/h1>\n\n\n\n<p>Une fois la\nlibrairie OBD install\u00e9e, on peut lancer l\u2019IDE python, y coder le programme\nd\u2019exemple et regarder le r\u00e9sultat obtenu.<\/p>\n\n\n\n<p>Code du programme d\u2019exemple<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import obd\n\nconnection = obd.OBD() # auto-connects to USB or RF port\ncmd = obd.commands.SPEED # select an OBD command (sensor)\nresponse = connection.query(cmd) # send the command, and parse the response\nprint(response.value) # returns unit-bearing values thanks to Pint\nprint(response.value.to(\"mph\")) # user-friendly unit conversions<\/code><\/pre>\n\n\n\n<p>Lan\u00e7ons maintenant le code dans l\u2019IDE python&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/car4.png\" alt=\"\" class=\"wp-image-885\"\/><\/figure>\n\n\n\n<p>La librairie est\nbien appel\u00e9e, elle a reconnu le connecteur, mais celui-ci n\u2019\u00e9tant pas reli\u00e9 \u00e0\nla voiture, le code a d\u00e9clench\u00e9 une erreur \u2018No connection to car&nbsp;\u00bb&nbsp;!<br \/><\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><a>En voiture&nbsp;!<\/a><\/h1>\n\n\n\n<p>Il est temps maintenant d\u2019essayer en vrai pour voir ce que\ncela donne&nbsp;:<\/p>\n\n\n\n<p>Tout d\u2019abord onconnecte le connecteur ELM327 au port OBD de la voiture&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/car5.png\" alt=\"\" class=\"wp-image-886\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/car6.png\" alt=\"\" class=\"wp-image-887\"\/><\/figure>\n\n\n\n<p>Puis on lance \u00e0 nouveau le programme (une premi\u00e8re fois \u00e0 l\u2019arr\u00eat, une seconde avec la voiture en mouvement)&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/car7.png\" alt=\"\" class=\"wp-image-888\"\/><\/figure>\n\n\n\n<p><strong><em>Je sais\nmaintenant utiliser Python pour acc\u00e9der aux donn\u00e9es de la voiture&nbsp;!<\/em><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le connecteur OBD Le connecteur OBD est \u00e9galement connect\u00e9 au port USB, c\u2019est-\u00e0-dire qu\u2019on va aussi utiliser une communication de type s\u00e9rie, 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\u2019envoyer quelques commandes d\u2019initialisation, puis le module <a class=\"read-more\" href=\"https:\/\/wollef.org\/blog\/communication-avec-le-connecteur-obd-en-python\/\">Continue Reading<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31,50,16,17],"tags":[],"class_list":["post-881","post","type-post","status-publish","format-standard","hentry","category-raspberry-cars","category-obd-bus","category-python","category-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/881","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/comments?post=881"}],"version-history":[{"count":0,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/881\/revisions"}],"wp:attachment":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/media?parent=881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/categories?post=881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/tags?post=881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}