Dans ce tutoriel, nous allons apprendre comment le protocole de communication I2C fonctionne et aussi nous allons faire un exemple pratique avec la Carte Arduino et un capteur qui utilise ce protocole. Vous pouvez regarder la vidéo suivante ou lire le tutoriel écrit ci-dessous.,
le bus de communication I2C est très populaire et largement utilisé par de nombreux appareils électroniques car il peut être facilement implémenté dans de nombreuses conceptions électroniques nécessitant une communication entre un maître et plusieurs périphériques esclaves ou même plusieurs périphériques maîtres. Les implémentations faciles viennent avec le fait que seulement deux fils sont nécessaires pour la communication entre jusqu’à presque 128 (112) périphériques lors de l’utilisation de l’adressage 7 bits et jusqu’à presque 1024 (1008) périphériques lors de l’utilisation de l’adressage 10 bits.,
Comment Ça marche
Comment est-il possible, une communication entre plusieurs appareils avec juste des fils? Eh bien, chaque appareil a un ID prédéfini ou une adresse de périphérique unique afin que le maître puisse choisir avec quels appareils communiqueront.
Les deux fils ou lignes sont appelés horloge série (ou SCL) et données série (ou SDA). La ligne SCL est le signal d’horloge qui synchronise le transfert de données entre les périphériques sur le bus I2C et il est généré par le périphérique maître. L’autre ligne est la ligne SDA qui porte les données.,
Les deux lignes sont” open-drain », ce qui signifie que les résistances pull up doivent être attachées à elles afin que les lignes soient hautes car les périphériques du bus I2C sont actifs bas. Les valeurs couramment utilisées pour les résistances vont de 2K pour des vitesses plus élevées à environ 400 kbps, à 10K pour une vitesse inférieure à environ 100 kbps.
Protocole I2C
Le signal de données est transféré dans des séquences de 8 bits., Ainsi, après qu’une condition de démarrage spéciale se produise, la première séquence de 8 bits indique l’adresse de l’esclave auquel les données sont envoyées. Après chaque séquence de 8 bits suit un bit appelé reconnaître. Après le premier bit D’accusé de réception, dans la plupart des cas, vient une autre séquence d’adressage, mais cette fois pour les registres internes du périphérique esclave. Juste après les séquences d’adressage suit les séquences de données autant jusqu’à ce que les données soient complètement envoyées et qu’elles se terminent par une condition d’arrêt spéciale.
prenons même regarder de plus près ces événements., La condition de début se produit quand la ligne de données tombe bas tandis que la ligne d’horloge est toujours haute. Après cela, l’horloge démarre et chaque bit de données est transféré pendant chaque impulsion d’horloge.
la séquence d’adressage du périphérique commence par le bit le plus significatif (MSB) et se termine par le bit le moins significatif (LSB) et elle est en fait composée de 7 bits car le 8ème bit est utilisé pour indiquer si le maître écrira sur l’esclave (logique faible) ou en Lira (logique élevée).,
le bit suivant AKC / NACK est utilisé par le périphérique esclave pour indiquer s’il a reçu avec succès la séquence de bits précédente. Donc, à ce moment, le périphérique maître remet le contrôle de la ligne SDA au périphérique esclave et si le périphérique esclave a reçu avec succès la séquence précédente, il tirera la ligne SDA vers le bas à la condition appelée accusé de réception., Si l’esclave ne tire pas la ligne SDA vers le bas, la condition est appelée Not Acknowledge, et signifie qu’il n’a pas reçu avec succès la séquence précédente, ce qui peut être causé par plusieurs raisons. Par exemple, l’esclave peut être occupé, peut ne pas comprendre les données ou la commande reçues, ne peut plus recevoir de données, etc. Dans un tel cas, le dispositif maître décide comment il va procéder.
Ensuite, c’est la registres d’adressage. Les registres internes sont des emplacements dans la mémoire de l’esclave contenant diverses informations ou données., Par exemple, L’accéléromètre ADX345 dispose d’une adresse de périphérique unique et d’adresses de registres internes supplémentaires pour les axes X, Y et Z. Donc, si nous voulons lire les données de l’axe X, nous devons d’abord envoyer l’adresse du périphérique, puis l’adresse de registre interne particulière pour l’axe X. Ces adresses peuvent être trouvées à partir de la fiche technique du capteur.
Après l’adressage, les séquences de transfert de données commencent soit à partir du maître, soit à partir de l’esclave en fonction du mode sélectionné au niveau du bit R/W., Une fois les données complètement envoyées, le transfert se terminera par une condition d’arrêt qui se produit lorsque la ligne SDA passe de bas en haut alors que la ligne SCL est haute.
exemple Arduino I2C
à titre d’exemple, je vais utiliser la carte de dérivation GY-80 qui se compose de 5 capteurs différents et la carte de dérivation GY-521 qui se compose de 3 capteurs différents. Nous pouvons donc obtenir des données de 8 capteurs différents avec seulement deux fils avec le bus I2C.,
You can get these components from any of the sites below:
- ADXL345 3-Axis Accelerator……………………………………………………… Amazon / Banggood / AliExpress
- 2 in 1: MPU6050 6-Axis Gyroscope & Accelerometer ………………… Amazon / Banggood / AliExpress
- 3 in 1: GY-80 9-Axis Magnetic Field Acceleration Gyroscope……… Amazon
- 3 in 1: GY-86 10DOF MS5611 HMC5883L MPU6050 Module……… Banggood / AliExpress
Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.,
Voici comment nous connecter les planches. La broche D’horloge série de la carte Arduino sera connectée aux broches D’horloge série des deux cartes de dérivation, il en va de même pour les broches de données série et nous alimenterons les cartes avec la Gnd et la broche 5V de la carte Arduino. Notez ici que nous n’utilisons pas de résistances pull-up car les cartes de dérivation ont déjà.
Maintenant, afin de communiquer avec ces puces ou des capteurs, nous avons besoin de connaître leurs adresses uniques. Nous pouvons les trouver à partir des fiches techniques des capteurs., Pour la carte de dérivation GY – 80, nous avons les adresses 4 suivantes: un hexadécimal 0x53 pour le capteur accéléromètre 3 axes, un hexadécimal 0x69 pour le gyroscope 3 axes, un hexadécimal 0x1E pour le magnétomètre 3 axes et un hexadécimal 0x77 pour le capteur baromètre et thermomètre.
Arduino et MPU6050 l’Accéléromètre et le Gyroscope Tutoriel
Pour le GY-521 breakout board nous n’avons qu’une adresse et c’est une hexadécimal 0x68., Nous pouvons également obtenir ou vérifier les adresses en utilisant le croquis du Scanner Arduino I2C qui peut être trouvé sur le site officiel Arduino. Donc, ici, si nous téléchargeons et exécutons cette esquisse, nous obtiendrons les adresses des appareils connectés sur le bus I2C.,
Capteur numéro de pièce I2C adresse
3 axes Accéléromètre Analog Devices ADXL345 0x53 fiche technique
3 axes GyroST Microelectronics L3G4200D 0x69 fiche technique
3 axes magnétomètre Honeywell MC5883L 0x1E fiche technique
Baromètre + Thermomètre Bosch BMP085 0x77 fiche p> Après avoir trouvé les adresses des appareils, nous devons également trouver les adresses de leurs registres internes afin de lire les données à partir D’eux., Par exemple, si nous voulons lire les données de l’axe X à partir du capteur accéléromètre à 3 axes de la carte de dérivation GY-80, nous devons trouver l’adresse du registre interne où les données de l’axe X sont stockées. À partir de la fiche technique du capteur, nous pouvons voir que les données pour l’axe X sont en fait stockées dans deux registres, DATAX0 avec une adresse hexadécimale 0x32 et DATAX1 avec une adresse hexadécimale 0x33.
code Arduino I2C
maintenant, faisons le code qui obtiendra les données pour l’axe X., Nous allons donc utiliser la bibliothèque de fils Arduino qui doit être incluse dans le croquis. Ici, nous devons d’abord définir l’adresse du capteur et les deux adresses de registres internes que nous avons précédemment trouvées. fil.la fonction begin () initiera la bibliothèque de fils et nous devons également initier la communication série car nous utiliserons le moniteur série pour afficher les données du capteur.
Dans la boucle (), nous allons commencer avec le Fil.beginTransmission () fonction qui commencera la transmission au capteur particulier, L’accéléromètre à 3 axes dans notre cas. Puis avec le fil.,write () fonction nous allons demander les données particulières des deux registres de l’axe X. fil.endTransmission() mettra fin à la transmission et transmettra les données des registres. Maintenant avec le fil.fonction requestFrom () nous demanderons les données transmises ou les deux octets des deux registres.
Le fil.la fonction available () renverra le nombre d’octets disponibles pour la récupération et si ce nombre correspond à nos octets demandés, dans notre cas 2 octets, en utilisant le fil.fonction read () nous lirons les octets à partir des deux registres de l’axe X., À la fin, nous imprimerons les données dans le moniteur série. Voici les données, mais gardez à l’esprit qu’il s’agit de données brutes et de maths est nécessaire à faire pour obtenir les bonnes valeurs de l’axe des abscisses. Vous pouvez trouver plus de détails pour cela dans mon prochain tutoriel pour l’utilisation des accéléromètres avec la carte Arduino car je ne veux pas surcharger ce tutoriel car son objectif principal était d’expliquer comment fonctionne la communication Arduino I2C.