Arduino I2C Intro-Maître et esclave

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche

Le minimum d'anglais

Dans le monde technique il est difficile de se passer de l'anglais. Cette documentation est certes en français mais reconnaître les 4 mots clés suivants sera certainement utile.

  • Master = Maître (celui qui tient le fouet et organise son petit monde à sa guise)
  • Slave = Esclave (celui qui obéit sans discuter... sinon coup de fouet assuré ;-) )
  • Read/Reader = Lire/Lecture
  • Write/Writer = Ecrire/Ecriture

Communiquer en coordination

Comme précisé, le bus I2C est utilisé pour permettre à un Arduino de communiquer:

  1. Avec des senseurs (un réseau de senseurs).
  2. Avec des autres Arduino (les Arduino communiquent directement ensembles via le bus I2C).
  3. Avec un ou plusieurs systèmes plus évolués (par exemple,
    un Raspberry Pi... dans ce cas, c'est Arduino qui offre des services au Raspberry).

Un exemple tangible

Imaginez que vous êtes dans une pièce ou tout le monde parle à tords et à travers... et que vous essayez de communiquer avec une personne se trouvant à l'autre bout de cette même pièce. Il ne faut pas être devin pour se rendre compte que la tâche sera compliquée, la compréhension difficile voire peut être le communication totalement impossible dans de telles conditions.

C'est pareil avec un bus I2C. Si tous les senseurs se mettent à émettre des informations à n'importe quel moment et sans aucune retenue, toutes ces informations ("comme des personnes qui parlent") présentent en même temps sur le même bus I2C ("dans une même pièces") empêcheront simplement de capter l'information du senseur avec lequel on désire communiquer ("de comprendre la personne avec l'on désire communiquer").

Concepts importants

Pour réguler le dialogue, il faut comprendre quelques concepts simples. Les assimiler vous permettra de comprendre plus facilement les tenants et les aboutissants du bus I2C.

S'il y a plusieurs informations de premiers plans, les concepts suivants restent certainement les plus importants:

  • Le concept de "maître et esclave"
  • Le principe d'adressage (adresse unique pour chaque esclave).
  • Le concept de régulation de communication comme "Master Reader" et "Master Writer"

Le maître et les esclaves

Pour faciliter la communication, ont met en place une relation de type Maître/Esclave(s) ("Master/Slave" en anglais).

Le principe est simple a comprendre, le Maître donne les ordres que les esclaves exécutent (sans poser de question).

Le Maître s'adresse à l'esclave, donne un ordre que l'esclave exécute. L'esclave fournira (mais pas nécessairement) la réponse à l'ordre.

C'est pareil pour le bus I2C... il y a un Maître (généralement Arduino) qui envoi ses ordres a un des esclaves du bus (généralement les senseurs, sélectionné par son "adresse I2C").

L'esclave (le senseur) exécute l'ordre et renvoient une réponse. Notez qu'il y a généralement une réponse, mais cela n'est pas forcément nécessaire pour certains types d'esclaves.

Voici un exemple démontrant l'utilisation d'un Maître (Arduino) et plusieurs esclaves (les afficheurs) sur un même Bus I2C.

ADF-LED-BACKPACK-MULTI-02.jpg
Exemple à titre indicatif issus de notre tutoriel sur les contrôleurs LEDs

L'adressage

L'adressage sert à identifier chacun des des éléments sur un bus I2C. Lorsque vous branchez un composant, il dispose généralement d'une adresse. Cette adresse est une valeur numérique qui identifie le composant sur le bus.

Sur un bus I2C, le maître envoi un ordre du genre: "Hep, Numéro 3, lecture de 6 octets!" (pour lire la température) et le numéro 3 (qui serait un senseur de température) répond docilement en renvoyant la température mesurée.

Il va de soit qu'il ne faut qu'un seul "numéro 3" qui répondent en même temps sur le bus. C'est pour cela que cette adresse est importante et qu'elle doit aussi être unique sur le bus.

L'adressage Logiciel

C'est le cas le plus simple, celui d'un module programmable comme Arduino, Rapsberry Pi, MBed, etc.

En effet, un Arduino se programme et s'il est raccordé sur un bus en tant qu'esclave alors il peut choisir n'importe quelle adresse valide.

Cette adresse est "encodée" dans le programme.

L'adressage Matériel

Pour les composants pré-assemblés (comme les senseurs I2C) ne sont pas "programmable" comme un Arduino.

Les composants disposent donc d'une adresse prédéfinie qu'il est généralement possible de la modifier sensiblement en soudant/pontant des "jumpers".

ADF-LED-BACKPACK-ARD-01.jpg
L'exemple issus des contrôleurs LED d'AdaFruit et présentant les "jumpers" A0, A1 et A2 permettant de modifier l'adresse de l'esclave.

Notre tutoriel sur les contrôleurs LEDs explique aussi comment calculer la nouvelle adresse. Vous pourrez consulter ce point plus tard lorsque vous serez familiarisé avec les concepts et premier montages I2C d'Arduino

Communiquer... avec un seul esclave à la fois?

En général, le maître s'adresse à un esclave en particulier. C'est le cas le plus courant et le plus usité sur Arduino.

Il n'empêche qu'un maître peut s'adresser à plusieurs esclaves en une seule opération (voir le concept "Master Writer" ci-dessous). Ce cas d'utilisation est plus rare.

Faire communiquer

Arduino et réseaux de senseurs

Il est possible de connecter un Arduino et plusieurs senseurs sur un réseau I2C.

Arduino sera le Maître et les senseurs seront les Esclaves.

Lorsque l'on s'adresse à un réseau de senseur, ont utilise généralement le concept "Master Reader" (décrit ci-dessous) car on sait quel senseur est l'adresse du senseur et quel est la longueur de la réponse que l'on obtiendra.

Certains senseurs dit "intelligents" ou "évolués" nécessitent plusieurs opérations avant d'obtenir la réponse attendue... dans ce cas, un concept plus évolué comme celui du "registre" est utilise.

Des Arduino ensembles

Il est bien entendu possible de connecter plusieurs Arduino sur un seul bus I2C (chacun disposant d'une adresse I2C unique).

Dans ce cas, un des Arduino est le Maître du bus I2C et tous les autres sont les esclaves.

Ceci dit, vous n'êtes pas limité au seul monde des Arduino, vous pouvez également communiquer avec d'autres systèmes comme des Raspberry-Pi par exemple.

Le concept "Master Reader"

Ce concept se traduit littéralement par le "Maître lit". Il est le plus couramment utilisé.

Dans ce concept, le Maître s'adresse a un esclave de son choix et envoi une commande/demande de lecture à l'esclave à laquelle il attends une réponse!

Arduino-I2C-Intro-MasterReader.jpg

Ce concept est pratique pour collecter les informations de différents senseurs.

Pour être précis, le nom complet de ce concept est "Master Reader/Slave Sender" (le maître lit et les esclaves envoient/parlent).

Le concept "Master Writer"

Le "maître écrit". Ce concept est moins utilisé tel quel mais convient bien à des applications spécifiques.

Dans ce concept, le maître écrit/envoi des informations vers de multiples esclaves. Ce concept est bien pratique pour commander différents actionneurs ou répartir des ordres vers les différents éléments physiques (comme, par exemple, les servos moteurs I2C d'un robots).

Arduino-I2C-Intro-MasterWriter.jpg

Bien entendu, dans ce cas de figure, le Maitre n'attend pas réponse de la part des esclaves.

Cette méthode de dialogue présente l'avantage de faire l'économie du temps de transmission et de traitement de la réponse (ce qui peut être important dans certains cas de figure).

Pour être précis, le nom complet de ce concept est "Master Writer/Slave Receiver".

La mise en place d'un protocole d'échange évolué nécessite parfois le passage en alternance entre les modes "Master Writer" et "Master Reader" (voir le concept de registre).

Le protocole

Encore un petit point supplémentaire à mentionner.

Plus haut dans cet article, nous avons mentionné une communication entre maître et esclave pour le lecture la température.

Cela se présentait sous la forme:

Le maître envoi un ordre du genre: "Hep, Numéro 3, lecture de 6 octets!" (pour lire la température)
et l'esclave numéro 3 répond docilement en renvoyant la température mesurée.

Il va de soit que "lecture de température!" n'est pas le message envoyé tel quel sur le bus I2C et que l'esclave ne répond pas "17.5°C" sous cette forme.

Le Maître sait qu'il s'adresse à un senseur de température de type XYZ et que ce dernier renverra l'information dans 6 octets.

La requête et informations de réponse sont encodées en binaire (des 1 et des 0 ) envoyés sur le BUS dans un ordre précis afin qu'ils puissent être interprétés correctement par le senseur adressé. Chacun de ces 1 et 0 ayant un signification précise. C'est le protocole d'échange d'information qui est généralement détaillé dans la fiche technique du composant/senseur.

La bonne nouvelle, c'est qu'il existe des librairies pour Arduino permettant de faire abstraction de cette complexité en permettant de faire des appels de fonctions de haut niveau similaire à:

 Temp_En_Degres = MonSenseurTemp.readTemperature();

Les breakout et senseurs I2C proposés par AdaFruit disposent généralement (toujours) de librairie Arduino... ainsi que pour Raspberry Pi.


Réalisé par Meurisse D. pour MCHobby.be.

Contient également quelques images et exemples d'Arduino.cc, droits et copyrights sur ces ressources restant bien évidement à Arduino.cc.

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.