saleae-lego-mindstorms-i2c

Analyse de trame I2C à l’aide de l’analyseur logique Saleae sur du Lego Mindstorms

This entry was posted in Education & robotique on by Vanessa Mazzari.

Utilisation d’un Analyseur Logique USB 16 voies 100MHz afin d’espionner le bus I2C de la brique Lego NXT

Ce tutoriel présente une utilisation de l’analyseur Logique USB 16 voies 100MHz développé par la société Saleae. Nous allons ici espionner une communication I2C entre une brique intelligente Lego Mindstorms NXT et un capteur Ultrasons NXT. Ce capteur sonar à ultrasons NXT est fourni en standard dans le kit robotique Lego Mindstorms NXT.
En raison de son niveau de technicité, cet article s’adresse aux personnes ayant des compétences en électronique essentiellement.

Sans plus tarder plongeons nous dans l’univers merveilleux des communications électroniques grâce à l’I2C.

Mais avant tout, qu’est ce que l’I2C ?

Pour ceux qui ne le savent pas encore, l’I2C est un bus de communication mis au point par la société Philips en 1982. L’i2C est aujourd’hui un standard de communication très populaire. Il n’est donc pas étonnant que Lego ait choisi de l’utiliser au sein de sa brique intelligente NXT. Toutes les communications entre la brique intelligente Lego Mindstorms NXT et les capteurs s’effectuent grâce au protocole I2C (la communication avec les moteurs utilisent le PWM et non pas l’I2C). La bonne compréhension de ce dernier est donc indispensable aux roboticiens versés dans l’électronique et qui souhaitent concevoir leur propres capteurs ou connecter leur propre circuit au robot Lego Mindstorms NXT.

L’I2C est un bus de données série synchrone bidirectionnel half-duplex. Il permet une communication simple et efficace entre un microcontrôleur et un où plusieurs actionneurs ou capteurs. Sans trop entrer dans les détails, mais sans omettre les points importants à retenir afin que chacun d’entre vous puissent élaborer ses propres capteurs, intéressons nous aux grandes lignes de cette communication lors du dialogue entre notre brique et ces actionneurs.

Fonctionnement du protocole I2C sur le mode maître-esclave

Un échange I2C fonctionne sur le principe maître-esclave. Dans le cadre d’une transaction I2C entre la brique NXT et ses capteurs, la brique NXT est nécessairement maître et les capteurs nécessairement esclaves (même si ils peuvent technologiquement se comporter en maître), c’est à dire que l’établissement d’une communication entre la brique NXT et ses capteurs doit toujours provenir d’une demande de la brique.

Le schéma ci-dessous décrit le comportement maître-esclave de la brique Lego NXT.

Communication I2C entre une brique Lego Mindstorms NXT et son capteur à ultrasons

Comme le présente le schéma ci-dessus, quatre fils sont nécessaires à la communication entre le capteur et la brique NXT (les câbles de connexion NXT que vous utilisez contiennent ces 4 fils) :

  • Gnd (ground), c’est la référence des potentiels.
  • Vcc, il permet d’alimenter le capteur.
  • SCL, c’est la ligne d’horloge, elle synchronise la transaction entre les deux entités.
  • SDA, c’est la ligne de données, c’est par cette ligne que transitent les informations échangée entre les deux entités.

Ce sont ces deux dernières lignes qui vont nous intéresser lors de l’espionnage du bus.

Comment fonctionne le protocole I2C ? La base se nomme une transaction. Elle débute par un bit de start et se termine par un bit de stop. Entre ces deux bits, c’est la communication proprement dite. Dans le cas du mode maître-esclave, c’est toujours le maître qui commence la transaction. La première transaction va constituer pour le maître à écrire sur son bus de connexion l’adresse I2C du capteur à qui il s’adresse. Quand vous branchez le capteur sonar à ultrasons NXT sur le port numéro 1 (par exemple), il n’y a qu’un seul capteur et donc pas de risque de conflit. Mais si vous utilisez un multiplexeur de capteurs, vous pouvez brancher plusieurs capteurs sur un même port et donc, à ce niveau, la bonne connaissance de l’adresse I2C du capteur est nécessaire.

L’image suivante présente une vue d’une telle première transaction à l’aide du logiciel fourni avec l’analyseur logique USB 16 voies 100MHz de Saleae. La ligne du haut représente le potentiel du fil SCL (horloge) et la ligne du bas, le potentiel du fil SDA (données).

Visualisation d'une transaction I2C à l'aide de l'analyseur logique Saleae.

Comme le présente l’image ci-dessus, une transaction début avec un bit de start caractérisé par un front descendant du signal de données alors que l’horloge est à l’état haut. Viennent ensuite 8 bits de données. Les 6 premiers bits sont à 0 (le potentiel SDA est bas), le 7ème est à 1 et enfin le 8ème est à 0. Qu’est ce que cela signifie ? Cela signifie que l’on a écrit 0x02, c’est à dire l’adresse I2C du capteur Ultrasons NXT. Comme nous évoqué plus haut, la première chose que fait le maître, c’est d’indiquer sur le bus de données l’adresse I2C du capteur auquel il souhaite s’adresser. Enfin, le 8ème bit est à 0, indiquant qu’il s’agit d’une écriture.

Le 9ème bit est à 0 et c’est l’ACK (aknowledgment), c’est à dire la réponse du capteur dont l’adresse est 0x02 disant qu’il est bien présent et prêt à répondre aux autres demandes de la brique NXT.

L’image présente également un des avantages de l’analyseur Logique de Saleae. En effet, celui-ci écrit en toute lettre l’interprétation que nous venons de faire en lisant les potentiels sur la zone intermédiaire entre les deux potentiels. Il a écrit « Setup Write [‘2’] + ACK » ce qui est exactement la transaction que nous venons de décrire.

A présent que nous en savons plus sur l’I2C et que nous avons même présenté l’interface de l’analyseur logique Saleae, voyons comment réaliser physiquement le circuit qui permet d’obtenir ces informations.

L’analyseur logique Saleae pour espionner la communication I2C

Le schéma suivant présente le mode de connexion de l’analyseur logique Saleae pour qu’il fournisse des informations sur la communication I2C entre la brique Lego Mindstorms NXT et le capteur sonar à ultrasons Lego NXT.

Connexion de l'analyseur logique Saleae sur un circuit Lego NXT

Une fois le circuit réalisé, il faut télécharger et installer le logiciel fourni avec l’analyseur logique Saleae. Ce logiciel est disponible à l’adresse http://www.saleae.com/downloads

Une fois le logiciel installé, branchez l’analyseur logique Saleae à votre PC à l’aide du cordon USB fourni. Lancez le logiciel. La led de votre analyseur logique Saleae doit alors se mettre à clignoter. L’interface du logiciel de capture est la suivante :

Interface du logiciel de capture du signal de l'analyseur logique Saleae

Configurons à présent l’analyseur logique Saleae de mannière à ce qu’il effectue une capture de l’I2C propre.

Tout d’abord, réglons la plage des tensions mesurées. Allez dans Option/Logic16 Input Voltages et choisissez « 3.6V to 5V ».

Ensuite, afin d’améliorer la lisibilité de la mesure, rendez-vous dans Option/Display in Ascii et choisissez « Ascii ».

Ceci étant fait, il ne nous reste plus qu’à configurer le logiciel en I2C afin qu’il se charge de tout. Pour cela allez dans Analyzers et choisissez le mode I2C.

Choix du protocole I2C avec l'analyseur logique Saleae

Une nouvelle fenêtre devrait apparaître à votre écran :

adaptation du nom des channels dans l'analyseur logique Saleae

Faites bien attention à faire correspondre SDA et SCL aux bons canaux, ceci dépend bien évidement de votre câblage. Choisissez le nom que vous souhaitez donner à vos canaux puis cliquez sur Rename.

A présent, nous devons choisir le temps d’acquisition des données. Comme le présente l’impage ci-dessous, nous choisissons 100M de mesures à 16 MHz ce qui correspond à 6.25 secondes d’analyse. Pour une communication I2C un minimum de 2 MHz est conseillé, mais pas forcement nécessaire. Mais bon, plus nous sommes rapide, moins nous risquons de rater des informations.

Choix de la fréquence d'échantillonage avec l'analyseur logique Saleae

Et bien ça y est, nous sommes enfin prêt à teste notre analyseur logique. Enfin plus ou moins, car certes nous sommes près à lancer une acquisition, mais une acquisition de quoi ? Comment faire pour demander au capteur de nous envoyer son numéro de version ?
Le code NXC suivant effectue cela. Pour rappel, NXC est un langage C pour Lego Mindstorms NXT. Le langage utilisé n’est pas important ici car l’analyseur logique ne fait aucune hypothèse sur la nature du programme qui génère une communication, il ne fait qu’intercepteur la communication et l’analyser. Nous aurions ainsi pu proposer un programme réalisé dans n’importe quel langage.

code NXC permettant d'afficher la version d'un capteur sonar

Vous pouvez maintenant cliquer sur start dans Saleae logic, et lancer l’exécution du programme sur votre brique. Une pop-up avec un curseur apparait alors au centre de votre écran du logiciel de capture de l’analyseur logique Saleae. Cela signifie que l’analyse des transactions I2C est en cours.

Une fois l’analyse terminée, faites rouler la molette de votre souris vers le bas afin de prendre un maximum de recul par rapport à la trame complète (la molette de la souris effectue un zoom arrière ce qui est très pratique). Vous devriez voir sur votre écran une zone différente.

Zoom arrière sur une trame I2C avec l'analyseur logique Saleae

Placer le curseur de votre souris sur la zone entourée en rouge et zoomez (faites rouler la molette vers l’avant). Votre écran ressemble alors à l’image suivante :

Trame I2C analysée à l'aide de l'analyseur logique Saleae

Ce que vous visualisez est la transaction I2C qu’il y a eue entre votre brique Lego NXT et votre capteur Ultrason. On peut ici vérifier que les informations placées dans inBuff sont bien transmises, en effet, inBuff[0]=0x02, c’est l’adresse d’écriture du capteur Ultrason. InBuff[1] est ensuite transmis, il permet de se positionner sur le registre 0 car c’est celui qui contient la version du capteur. Cette trame, est le fruit de l’utilisation de la fonction NXC I2CBytes, elle s’occupe de l’envoi du signal de start (caractérisé par le cercle vert), suivi de l’envoi de inbuff puis du signal de stop, caractérisé par un carré rouge sur la capture.

Une fois cette première transaction effectuée, une seconde transaction I2C est initiée par l’envoi d’un signal de re-start (second cercle vert) suivi de l’adresse de lecture du capteur ultrason (0x03), puis elle attend en retour un nombre de données égal au contenu de la variable size (ici 4). On peut voir ici que lors de la réception de la dernière donnée, la brique transmet non pas un ACK, mais un NAK, cela signifie que la brique n’attend plus rien de son esclave, la transmission s’arrête par l’envoi d’un signal de stop, c’est à dire un front montant de la ligne de donnée alors que l’horloge est à l’état haut.

Conclusion

Grâce à cet exemple relativement simple, on peut aisément comprendre l’utilité d’un analyseur de trame tel que l’analyseur logique Saleae, car même si certains d’entre vous n’en voient pas encore l’utilité, ce petit bijou technologique vous permettra de debugger bon nombre de vos programmes, car il vous offre un contrôle facile, et rapide de l’intégrité d’une transaction entre un ou plusieurs de vos contrôleurs ou actionneurs. Il est aujourd’hui un allié de premier choix dès que l’on souhaite s’initier aux communications électroniques, par la simplicité de son interface, mais surtout par le service qu’il vous rend, en décortiquant pour vous la plupart des standards de communication électroniques tel que l’I2C,SPI,1-Wire et bien d’autres, vous laissant ainsi un chronogramme clair, lisible, enregistrable et facilement interprétable.