Le bus I2C

Le bus I2C (Inter Integrated Circuit)  est un bus série synchrone bidirectionnel half-duplex. Il permet d'interconnecter plusieurs devices maîtres ou esclaves. Chaque device est repéré sur le bus par son adresse. Il y a 126 adresses possibles. L'intérêt de ce bus est qu'il ne nécessite que trois fils communs à tous les devices.
  • SDA (Serial Data) — fil de données bidirectionnel.
  • SCL (Serial Clock) — fil pour l'horloge synchronisation.
  • GND (Ground) — fil de masse de référence (0V).
La mise en oeuvre de ce bus est très simple : il suffit de relier respectivement les broches SDA, SCL et GND de chaque périphérique entre elles.
En général, le périphérique maître est un microcontrôleur type Arduino ou un nano-ordinateur type Raspberry. Pour connaitre les broches à connecter, il faut consulter la documentation technique du périphérique. Pour les Arduino, les broches à connecter dépende de l'Arduino. Pour l'Arduino Uno utilisé comme exemple dans cet article, les broches à utiliser sont les pins 4 (SDA) et 5 (SCL). Consulter la documentation de référence de la bibliothèque Wire de l'Arduino pour les autres micro-contrôleurs.
Pour faire les premières expériences sur le bus I2C, le périphérique maître est un Arduino Uno, et l'esclave est un convertisseur Analogique/Digital—Digital Analogique PCF8591. L'utilisation détaillée de ce convertisseur fera l'objet d'un article dédié. Cet article s’appuiera sur le projet décrit ci-après.

Câblage du projet

La technique du câblage du convertisseur PCF8591 sera traité de façon complète dans un futur article dédié à ce composant. Il n'est abordé ici comme exemple simple de périphérique I2C utilisé comme esclave d'un Arduino.

Le schéma électronique

  • Les broches SDA de l'Arduino (pin A4) et du PCF8591 (broche 9) sont reliées entre elles. Une résistance 10 kΩ connecté sur le +5V de l'Arduino assure le pull-up de la ligne.
  • Les broches SCL de l'Arduino (pin A5) et du PCF8591 (broche 10) sont reliées entre elles. Une résistance 10 kΩ connecté sur le +5V de l'Arduino assure le pull-up de la ligne.
  • Les broches VDD et VREF du PCF8591 sont reliées au +5V. 
  • Les broches VSSAGND et EXT du PCF8591 sont reliées à la masse.
  • Les broches A0 à A2 du PCF8591 sont également reliées à la masse. Elle définissent ainsi l'adresse I2C du composant à la valeur 0x48.
  • Les quatre broches d'entrées analogiques AIN0 à AIN3 sont laissées libres. Elles ne sont pas utilisées dans cet article.
  • L'unique broche de sortie analogique AOUT  est reliées à la pin analogique A0 de l'Arduino.
La broche AOUT est utilisée dans cet article comme exercice d'introduction à l'utilisation du bus I2C. Une valeur numérique est transmise sur le bus I2C au PCF8591. Celui-ci la convertit en une valeur analogique transformée en un tension sur la broche AOUT du PCF8591 que l'ont peut lire sur la pin analogique A0 de l'Arduino.

Installation sur une platine d'expérimentation

Voici le schéma technique traduit sur une platine d'expérimentation :

Programmation du bus I2C

La programmation du bus I2C s'effectue grâce à la bibliothèque Wire de l'Arduino. Les lectures et écritures de données sur le bus I2C sont encapsulées entre deux appels de fonctions de cette bibliothèque, respectivement beginTransmission(), celle-ci permettant d'adresser le périphérique du bus concerné, et endTransmission(), le résultat de cette dernière indiquant la réussite de l'opération (valeur 0 en cas de succès). Il est donc important de connaitre cette adresse.
  • beginTransmission() permet de spécifier l'adresse I2C du périphérique sur lequel on veut lire ou écrire.
  • endTransmission() renvoi en résultat un code, 0 en cas de succès.

Comment faire pour connaitre l'adresse des périphériques I2C connectés ?

Dans la majorité des cas, l'adresse d'un périphérique I2C est indiqué dans le documentation technique. Cependant, il est possible d'avoir à faire avec des périphériques exotiques pour lesquels l'information n'est pas disponible.
Voici ci-dessous un script simple permettant de connaitre les adresses de tous les périphériques connectés. Il consiste à scanner toutes les adresses une à une par l'invocation successive des fonctions beginTransmission() et endTransmission(). Cette dernière renverra une erreur pour toutes les adresses, sauf pour celle correspondant au périphérique connecté.

#include <Wire.h>

void scanI2CBus(void) {
  int nDevices = 0;
  char buffer[128];
  Serial.println("Analyse… ");
  for(byte address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    byte error = Wire.endTransmission();
    switch (error) {
      case 0:
        sprintf(buffer, "Périphérique I2C trouvé à l'adresse 0x%02x !", address);
        Serial.println(buffer);
        nDevices++;
        break;
      case 4:
        sprintf(buffer, "Erreur sur me périphérique I2C à l'adresse 0x%02x !", address);
        Serial.println(buffer);
        break;
    }
  }
  if (nDevices == 0)
    Serial.println("Aucun périphérique I2C n'a été trouvé !\n ");
  else
    Serial.println("Analyse du bus I2C terminée !\n ");
}

void setup() {
  Serial.begin(9600);
  Wire.begin();
  scanI2CBus();
}

void loop() {
}
Le résultat de la méthode endTransmission() fournit l'indication sur l'erreur produite. En fonctionnement normal, 0 signifie qu'un périphérique a été trouvé à l'adresse analysée, 2 signifie qu'aucun périphérique n'utilisée l'adresse analysée.
A chaque périphérique trouvé, la variable nDevices est incrémentée.
Analyse…
Périphérique I2C trouvé à l'adresse 0x48 !
Analyse du bus I2C terminée !
Le résultat ci-dessus affiché sur la console de l'Arduino, montre qu'un périphérique est effectivement connecté à l'adresse 0x48. Ce qui tombe bien ! En effet, c'est justement cette adresse, d'après la documentation, qui est utilisée par défaut par le composant PCF8591. 

Test du bus I2C

Cet exercice consiste à transmettre une valeur numérique au PCF8591 via le bus I2C, celui-ci se chargeant de la convertir en une tension analogique sur sa broche AOUT qui, connectée à la pin analogique A0 de l'Arduino, est lue par celui-ci pour afficher la valeur sur la console Série.
Des valeurs numériques de 0 à 255 sont successivement envoyée au PCF8591 et comparées avec celles lues sur la broche A0 de l'Arduino. Ce qui permet de mettre en évidence l'écart moyen d'étalonnage de ce procédé.
/* 1 */
#define I2C_PC8591  0x48
#define CMD_BASE 0x40
#define AIN 0

/* 2 */
#include <Wire.h>

/* 3 */
uint8_t i2cAnalogWrite(uint8_t value) {
  Wire.beginTransmission(I2C_PC8591);
  Wire.write(CMD_BASE);
  Wire.write(value);
  return Wire.endTransmission();
}

void setup() {
  Serial.begin(9600);
/* 4 */
  Wire.begin();
/* 5 */
  float averageCalibration = 0.0;
  int countReading = 0;
  for (int i = 0; i < 256; i++) {
/* 6 */
    uint8_t error = i2cAnalogWrite(i);
    delay(500);
    if (error) {
      Serial.print("Une erreur s'est produite sur le PCF8591 : ");
      Serial.println(error);
    } else {
/* 7 */
      uint16_t rawValue = analogRead(AIN);
/* 8 */
      float inVolts = (rawValue * 5.0) / 1023.0;
      float dacVolts = (i * 5.0) / 255.0;
/* 5 */
      averageCalibration += (dacVolts - inVolts);
      countReading++;
/* 9 */
      Serial.print("value = ");
      Serial.print(i);
      Serial.print("\t Tension cible = ");
      Serial.print(dacVolts, 3);
      Serial.print("\t Tension lue = ");
      Serial.println(inVolts, 3);
    }
  }
/* 5 */
  Serial.print("Erreur de calibrage moyenne :");
  Serial.println(averageCalibration / countReading, 3);
}

void loop() {
}
  1. Définition des constantes du sketch :
    • I2C_PC8591 est l'adresse I2C du périphérique PCF8591. Comme les trois broches A0 à A2 sont reliées à 0V, l'adresse du composant est 0x48.
    • CMD_BASE est la valeur de base pour commander le PCF8491. La valeur est 0x40 (bit b10)
    • AIN est le numéro de la pin analogique lue sur l'Arduino. Pour A0 la valeur est 0.
  2. Pour pouvoir utiliser la bibliothèque Wire qui permet d'utiliser le bus I2C, il faut inclure la définition de celle-ci qui se trouve dans le fichier Wire.h.
  3. L'écriture analogique sur un PCF8591 nécessitant l'invocation de plusieurs fonctions de la bibliothèque Wire, celles-ci sont rassemblées dans la fonction i2cAnalogWrite(). Il ne faut pas confondre cette fonction avec la fonction analogWrite() de l'Aruino.
    analogWrite() écrit une valeur analogique sur une pin numérique de l'Arduino qui le permettent (celles qui sont signalées par un - sur la carte : 3, 5, 6, 9, 10 et 11 sur l'Arduino Uno). La tension émise par cette pin est toujours +5V ou 0V. Mais elle est découpée selon la technique de modulation PWM (Pulse With Modulation).
    i2cAnalogWrite(), développée ici, transmet une valeur numérique sur le bus I2C au PCF7591. celui-ci la converti en une vraie tension analogique sur sa broche analogique de sortie AOUT.
    • Ouverture de la ligne I2C à destination du PCF8591 en invoquant la fonction beginTransmission() sur l'adresse de celui-ci (0x48). 
    • Commande du PCF pour lui indiquer une écriture sur la pin AOUT en invoquant la fonction write()
    • Transmission de la valeur à convertir par une nouvelle invocation de la fonction write().
    • Invocation de la fonction endTransmission() pour terminer la commande et libérer le bus. Si tout se passe bien la valeur de retour est 0.
  4. Pour pouvoir utiliser le bus I2C sur l'Arduino, il faut invoquer la méthode begin() de la bibliothèque Wire avant toute opération. 
  5. Deux variables de travail sont utilisées pour calculer la moyenne des erreurs d'étalonnage entre la tension à convertir transmise au PCF8591 et la tension mesurée sur la broche AOUT.
    • averageCalibration est utilisée pour cumuler les écarts.
    • countReading est utilisée pour compter le nombre d'écritures réussies sur le PCF8591. La moyenne est le quotient entre ces deux valeurs à la fin de l'analyse.
  6. Invocation de la fonction i2cAnalogWrite() pour transmettre la valeur i sur le bus I2C. La fonction est invoquée 256 fois pour les valeurs de i allant de 0 (correspondant à 0 Volts) à 255 (correspondant à 5 Volts). Une demi seconde d'attente est effectuée entre chaque écriture. Si une erreur s'est produite (valeur de retour de la fonction différente de 0), celle-ci est signalée sur la console Série de l'Arduino.
  7. Sinon, la broche AOUT du PCF8591 étant connectée à la pin analogique A0 de l'Arduino, la tension émise peut être lues sur cette pin par l'invocation de la fonction standard analogRead(). Selon la documentation de l'Arduino, les valeurs analogiques lues sont renvoyées sur 10 bits. La valeur brute lue est donc stoquée dans une variable rawValue de 16 bits (et non de 8 bits comme l'est la valeur transmise au PCF8591) : 0 correspond à 0 volts, 1023 correspond à 5 volts.
  8. Les valeurs brutes binaires sont converties en float pour avoir une tension entre 0.0 volts et 5.0 volts :
    • dacVolts est la valeur en volts envoyée au PCF8591.
    • inVolts est la valeur en volts lue sur la pin A0 de l'Arduino.
  9. Affichage du résultat sur la console Série de l'Arduino.
Ce qui donne comme résultat affiché sur la console :
value = 0 Tension cible = 0.000 Tension lue = 0.083
value = 1 Tension cible = 0.020 Tension lue = 0.103
value = 2 Tension cible = 0.039 Tension lue = 0.117
value = 3 Tension cible = 0.059 Tension lue = 0.132
value = 4 Tension cible = 0.078 Tension lue = 0.147
value = 5 Tension cible = 0.098 Tension lue = 0.161
value = 6 Tension cible = 0.118 Tension lue = 0.176
value = 7 Tension cible = 0.137 Tension lue = 0.210
value = 8 Tension cible = 0.157 Tension lue = 0.220
value = 9 Tension cible = 0.176 Tension lue = 0.239
value = 10 Tension cible = 0.196 Tension lue = 0.254
value = 11 Tension cible = 0.216 Tension lue = 0.283
value = 12 Tension cible = 0.235 Tension lue = 0.288
value = 13 Tension cible = 0.255 Tension lue = 0.303
value = 14 Tension cible = 0.275 Tension lue = 0.332
value = 15 Tension cible = 0.294 Tension lue = 0.352
value = 16 Tension cible = 0.314 Tension lue = 0.371
value = 17 Tension cible = 0.333 Tension lue = 0.386
value = 18 Tension cible = 0.353 Tension lue = 0.406
value = 19 Tension cible = 0.373 Tension lue = 0.425
value = 20 Tension cible = 0.392 Tension lue = 0.450
value = 21 Tension cible = 0.412 Tension lue = 0.469
value = 22 Tension cible = 0.431 Tension lue = 0.489
value = 23 Tension cible = 0.451 Tension lue = 0.508
value = 24 Tension cible = 0.471 Tension lue = 0.518
value = 25 Tension cible = 0.490 Tension lue = 0.547
value = 26 Tension cible = 0.510 Tension lue = 0.552
value = 27 Tension cible = 0.529 Tension lue = 0.577
value = 28 Tension cible = 0.549 Tension lue = 0.606
value = 29 Tension cible = 0.569 Tension lue = 0.621
value = 30 Tension cible = 0.588 Tension lue = 0.640
value = 31 Tension cible = 0.608 Tension lue = 0.665
value = 32 Tension cible = 0.627 Tension lue = 0.674
value = 33 Tension cible = 0.647 Tension lue = 0.699
value = 34 Tension cible = 0.667 Tension lue = 0.709
value = 35 Tension cible = 0.686 Tension lue = 0.723
value = 36 Tension cible = 0.706 Tension lue = 0.753
value = 37 Tension cible = 0.725 Tension lue = 0.767
value = 38 Tension cible = 0.745 Tension lue = 0.782
value = 39 Tension cible = 0.765 Tension lue = 0.806
value = 40 Tension cible = 0.784 Tension lue = 0.826
value = 41 Tension cible = 0.804 Tension lue = 0.841
value = 42 Tension cible = 0.824 Tension lue = 0.850
value = 43 Tension cible = 0.843 Tension lue = 0.880
value = 44 Tension cible = 0.863 Tension lue = 0.904
value = 45 Tension cible = 0.882 Tension lue = 0.919
value = 46 Tension cible = 0.902 Tension lue = 0.938
value = 47 Tension cible = 0.922 Tension lue = 0.963
value = 48 Tension cible = 0.941 Tension lue = 0.978
value = 49 Tension cible = 0.961 Tension lue = 1.002
value = 50 Tension cible = 0.980 Tension lue = 1.022
value = 51 Tension cible = 1.000 Tension lue = 1.036
value = 52 Tension cible = 1.020 Tension lue = 1.046
value = 53 Tension cible = 1.039 Tension lue = 1.075
value = 54 Tension cible = 1.059 Tension lue = 1.085
value = 55 Tension cible = 1.078 Tension lue = 1.119
value = 56 Tension cible = 1.098 Tension lue = 1.144
value = 57 Tension cible = 1.118 Tension lue = 1.158
value = 58 Tension cible = 1.137 Tension lue = 1.178
value = 59 Tension cible = 1.157 Tension lue = 0.166
value = 60 Tension cible = 1.176 Tension lue = 1.119
value = 61 Tension cible = 1.196 Tension lue = 1.149
value = 62 Tension cible = 1.216 Tension lue = 1.178
value = 63 Tension cible = 1.235 Tension lue = 1.193
value = 64 Tension cible = 1.255 Tension lue = 1.217
value = 65 Tension cible = 1.275 Tension lue = 1.227
value = 66 Tension cible = 1.294 Tension lue = 1.261
value = 67 Tension cible = 1.314 Tension lue = 1.271
value = 68 Tension cible = 1.333 Tension lue = 1.290
value = 69 Tension cible = 1.353 Tension lue = 1.305
value = 70 Tension cible = 1.373 Tension lue = 1.329
value = 71 Tension cible = 1.392 Tension lue = 1.344
value = 72 Tension cible = 1.412 Tension lue = 1.378
value = 73 Tension cible = 1.431 Tension lue = 1.393
value = 74 Tension cible = 1.451 Tension lue = 1.417
value = 75 Tension cible = 1.471 Tension lue = 1.432
value = 76 Tension cible = 1.490 Tension lue = 1.447
value = 77 Tension cible = 1.510 Tension lue = 1.471
value = 78 Tension cible = 1.529 Tension lue = 1.491
value = 79 Tension cible = 1.549 Tension lue = 1.510
value = 80 Tension cible = 1.569 Tension lue = 1.525
value = 81 Tension cible = 1.588 Tension lue = 1.554
value = 82 Tension cible = 1.608 Tension lue = 1.569
value = 83 Tension cible = 1.627 Tension lue = 1.584
value = 84 Tension cible = 1.647 Tension lue = 1.603
value = 85 Tension cible = 1.667 Tension lue = 1.628
value = 86 Tension cible = 1.686 Tension lue = 1.647
value = 87 Tension cible = 1.706 Tension lue = 1.672
value = 88 Tension cible = 1.725 Tension lue = 1.686
value = 89 Tension cible = 1.745 Tension lue = 1.706
value = 90 Tension cible = 1.765 Tension lue = 1.720
value = 91 Tension cible = 1.784 Tension lue = 1.750
value = 92 Tension cible = 1.804 Tension lue = 1.764
value = 93 Tension cible = 1.824 Tension lue = 1.784
value = 94 Tension cible = 1.843 Tension lue = 1.808
value = 95 Tension cible = 1.863 Tension lue = 1.818
value = 96 Tension cible = 1.882 Tension lue = 1.848
value = 97 Tension cible = 1.902 Tension lue = 1.872
value = 98 Tension cible = 1.922 Tension lue = 1.887
value = 99 Tension cible = 1.941 Tension lue = 1.901
value = 100 Tension cible = 1.961 Tension lue = 1.916
value = 101 Tension cible = 1.980 Tension lue = 1.945
value = 102 Tension cible = 2.000 Tension lue = 1.955
value = 103 Tension cible = 2.020 Tension lue = 1.979
value = 104 Tension cible = 2.039 Tension lue = 2.004
value = 105 Tension cible = 2.059 Tension lue = 2.019
value = 106 Tension cible = 2.078 Tension lue = 2.038
value = 107 Tension cible = 2.098 Tension lue = 2.058
value = 108 Tension cible = 2.118 Tension lue = 2.077
value = 109 Tension cible = 2.137 Tension lue = 2.092
value = 110 Tension cible = 2.157 Tension lue = 2.111
value = 111 Tension cible = 2.176 Tension lue = 2.136
value = 112 Tension cible = 2.196 Tension lue = 2.160
value = 113 Tension cible = 2.216 Tension lue = 2.170
value = 114 Tension cible = 2.235 Tension lue = 2.190
value = 115 Tension cible = 2.255 Tension lue = 2.219
value = 116 Tension cible = 2.275 Tension lue = 2.234
value = 117 Tension cible = 2.294 Tension lue = 2.253
value = 118 Tension cible = 2.314 Tension lue = 2.268
value = 119 Tension cible = 2.333 Tension lue = 2.287
value = 120 Tension cible = 2.353 Tension lue = 2.317
value = 121 Tension cible = 2.373 Tension lue = 2.331
value = 122 Tension cible = 2.392 Tension lue = 2.351
value = 123 Tension cible = 2.412 Tension lue = 2.375
value = 124 Tension cible = 2.431 Tension lue = 2.390
value = 125 Tension cible = 2.451 Tension lue = 2.410
value = 126 Tension cible = 2.471 Tension lue = 2.429
value = 127 Tension cible = 2.490 Tension lue = 2.449
value = 128 Tension cible = 2.510 Tension lue = 2.463
value = 129 Tension cible = 2.529 Tension lue = 2.488
value = 130 Tension cible = 2.549 Tension lue = 2.502
value = 131 Tension cible = 2.569 Tension lue = 2.527
value = 132 Tension cible = 2.588 Tension lue = 2.542
value = 133 Tension cible = 2.608 Tension lue = 2.566
value = 134 Tension cible = 2.627 Tension lue = 2.576
value = 135 Tension cible = 2.647 Tension lue = 2.605
value = 136 Tension cible = 2.667 Tension lue = 2.620
value = 137 Tension cible = 2.686 Tension lue = 2.639
value = 138 Tension cible = 2.706 Tension lue = 2.664
value = 139 Tension cible = 2.725 Tension lue = 2.678
value = 140 Tension cible = 2.745 Tension lue = 2.698
value = 141 Tension cible = 2.765 Tension lue = 2.722
value = 142 Tension cible = 2.784 Tension lue = 2.737
value = 143 Tension cible = 2.804 Tension lue = 2.766
value = 144 Tension cible = 2.824 Tension lue = 2.776
value = 145 Tension cible = 2.843 Tension lue = 2.801
value = 146 Tension cible = 2.863 Tension lue = 2.815
value = 147 Tension cible = 2.882 Tension lue = 2.835
value = 148 Tension cible = 2.902 Tension lue = 2.859
value = 149 Tension cible = 2.922 Tension lue = 2.879
value = 150 Tension cible = 2.941 Tension lue = 2.889
value = 151 Tension cible = 2.961 Tension lue = 2.923
value = 152 Tension cible = 2.980 Tension lue = 2.937
value = 153 Tension cible = 3.000 Tension lue = 2.952
value = 154 Tension cible = 3.020 Tension lue = 2.977
value = 155 Tension cible = 3.039 Tension lue = 2.986
value = 156 Tension cible = 3.059 Tension lue = 3.006
value = 157 Tension cible = 3.078 Tension lue = 3.035
value = 158 Tension cible = 3.098 Tension lue = 3.060
value = 159 Tension cible = 3.118 Tension lue = 3.074
value = 160 Tension cible = 3.137 Tension lue = 3.089
value = 161 Tension cible = 3.157 Tension lue = 3.104
value = 162 Tension cible = 3.176 Tension lue = 3.128
value = 163 Tension cible = 3.196 Tension lue = 3.152
value = 164 Tension cible = 3.216 Tension lue = 3.172
value = 165 Tension cible = 3.235 Tension lue = 3.187
value = 166 Tension cible = 3.255 Tension lue = 3.211
value = 167 Tension cible = 3.275 Tension lue = 3.226
value = 168 Tension cible = 3.294 Tension lue = 3.245
value = 169 Tension cible = 3.314 Tension lue = 3.275
value = 170 Tension cible = 3.333 Tension lue = 3.280
value = 171 Tension cible = 3.353 Tension lue = 3.299
value = 172 Tension cible = 3.373 Tension lue = 3.324
value = 173 Tension cible = 3.392 Tension lue = 3.348
value = 174 Tension cible = 3.412 Tension lue = 3.363
value = 175 Tension cible = 3.431 Tension lue = 3.387
value = 176 Tension cible = 3.451 Tension lue = 3.397
value = 177 Tension cible = 3.471 Tension lue = 3.426
value = 178 Tension cible = 3.490 Tension lue = 3.436
value = 179 Tension cible = 3.510 Tension lue = 3.470
value = 180 Tension cible = 3.529 Tension lue = 3.490
value = 181 Tension cible = 3.549 Tension lue = 3.500
value = 182 Tension cible = 3.569 Tension lue = 3.519
value = 183 Tension cible = 3.588 Tension lue = 3.539
value = 184 Tension cible = 3.608 Tension lue = 3.563
value = 185 Tension cible = 3.627 Tension lue = 3.573
value = 186 Tension cible = 3.647 Tension lue = 3.602
value = 187 Tension cible = 3.667 Tension lue = 3.617
value = 188 Tension cible = 3.686 Tension lue = 3.636
value = 189 Tension cible = 3.706 Tension lue = 3.661
value = 190 Tension cible = 3.725 Tension lue = 3.680
value = 191 Tension cible = 3.745 Tension lue = 3.700
value = 192 Tension cible = 3.765 Tension lue = 3.715
value = 193 Tension cible = 3.784 Tension lue = 3.734
value = 194 Tension cible = 3.804 Tension lue = 3.754
value = 195 Tension cible = 3.824 Tension lue = 3.778
value = 196 Tension cible = 3.843 Tension lue = 3.798
value = 197 Tension cible = 3.863 Tension lue = 3.807
value = 198 Tension cible = 3.882 Tension lue = 3.837
value = 199 Tension cible = 3.902 Tension lue = 3.856
value = 200 Tension cible = 3.922 Tension lue = 3.871
value = 201 Tension cible = 3.941 Tension lue = 3.895
value = 202 Tension cible = 3.961 Tension lue = 3.905
value = 203 Tension cible = 3.980 Tension lue = 3.925
value = 204 Tension cible = 4.000 Tension lue = 3.954
value = 205 Tension cible = 4.020 Tension lue = 3.969
value = 206 Tension cible = 4.039 Tension lue = 3.988
value = 207 Tension cible = 4.059 Tension lue = 4.013
value = 208 Tension cible = 4.078 Tension lue = 4.032
value = 209 Tension cible = 4.098 Tension lue = 4.052
value = 210 Tension cible = 4.118 Tension lue = 4.071
value = 211 Tension cible = 4.137 Tension lue = 4.086
value = 212 Tension cible = 4.157 Tension lue = 4.106
value = 213 Tension cible = 4.176 Tension lue = 4.125
value = 214 Tension cible = 4.196 Tension lue = 4.159
value = 215 Tension cible = 4.216 Tension lue = 4.164
value = 216 Tension cible = 4.235 Tension lue = 4.189
value = 217 Tension cible = 4.255 Tension lue = 4.194
value = 218 Tension cible = 4.275 Tension lue = 4.223
value = 219 Tension cible = 4.294 Tension lue = 4.242
value = 220 Tension cible = 4.314 Tension lue = 4.252
value = 221 Tension cible = 4.333 Tension lue = 4.277
value = 222 Tension cible = 4.353 Tension lue = 4.301
value = 223 Tension cible = 4.373 Tension lue = 4.316
value = 224 Tension cible = 4.392 Tension lue = 4.345
value = 225 Tension cible = 4.412 Tension lue = 4.374
value = 226 Tension cible = 4.431 Tension lue = 4.374
value = 227 Tension cible = 4.451 Tension lue = 4.399
value = 228 Tension cible = 4.471 Tension lue = 4.423
value = 229 Tension cible = 4.490 Tension lue = 4.433
value = 230 Tension cible = 4.510 Tension lue = 4.453
value = 231 Tension cible = 4.529 Tension lue = 4.472
value = 232 Tension cible = 4.549 Tension lue = 4.501
value = 233 Tension cible = 4.569 Tension lue = 4.516
value = 234 Tension cible = 4.588 Tension lue = 4.536
value = 235 Tension cible = 4.608 Tension lue = 4.545
value = 236 Tension cible = 4.627 Tension lue = 4.575
value = 237 Tension cible = 4.647 Tension lue = 4.594
value = 238 Tension cible = 4.667 Tension lue = 4.614
value = 239 Tension cible = 4.686 Tension lue = 4.624
value = 240 Tension cible = 4.706 Tension lue = 4.663
value = 241 Tension cible = 4.725 Tension lue = 4.677
value = 242 Tension cible = 4.745 Tension lue = 4.692
value = 243 Tension cible = 4.765 Tension lue = 4.717
value = 244 Tension cible = 4.784 Tension lue = 4.731
value = 245 Tension cible = 4.804 Tension lue = 4.751
value = 246 Tension cible = 4.824 Tension lue = 4.765
value = 247 Tension cible = 4.843 Tension lue = 4.790
value = 248 Tension cible = 4.863 Tension lue = 4.809
value = 249 Tension cible = 4.882 Tension lue = 4.824
value = 250 Tension cible = 4.902 Tension lue = 4.844
value = 251 Tension cible = 4.922 Tension lue = 4.863
value = 252 Tension cible = 4.941 Tension lue = 4.878
value = 253 Tension cible = 4.961 Tension lue = 4.897
value = 254 Tension cible = 4.980 Tension lue = 4.927
value = 255 Tension cible = 5.000 Tension lue = 4.941
Erreur de calibrage moyenne :0.028

Conclusion

Il existe une multitude de périphériques connectables au bus I2C, chacun utilisant une adresse entre 1 et 126. Cela est très utile en robotique où de nombreux capteurs sont utilisés. En les connectant par le bus I2C, on ne mobilise que les deux pins A4 (SDA) et A5 (SLC) tout en laissant libres les entrées sorties numériques des pin 0 à 12.
De plus, le bus I2C peut être également utilisé pour mettre en communication les microcontrôleurs entre eux, l'un étant le maître des autres. Les perspectives ouvertes par cette technologie sont donc innombrables.
En ce qui concerne le circuit intégré PCF8591, sont utilisation, évoquée ici à titre d'exemple, justifie à elle-seule un article dédié, bientôt accessible sur ce blog.

Commentaires

Posts les plus consultés de ce blog

Afficheur à LED 7 segments (classe SegmentLedDisplay)

Piloter un clavier matriciel sur le bus I2C avec un PCF8574

Utiliser Visual Studio Code pour développer sur Arduino