Connecter trois modules I2C

Bonsoir. J’ai passé plusieurs jours à faire des recherches sur ce problème, mais je ne trouve rien de concluant… Soit ça ne marche pas, soit il faut acheter quelque chose, soit ça n’est pas mon cas, … bref.
En gros, pour mon projet, je dois brancher (entres autres) simultanément trois modules I2C. Problème: les trois (Horloge DS3231, LCD 20x4, Gyroscope MPU6050) modules sont les analogiques A4 et A5. Tous sont alimentés en 5V. Comment faire alors? Et si possible, pouvez-vous me conseiller un module qui simplifie tout ça pour ne pas être embêté ? Merci beaucoup, celà m’arrangerait énormément… Passez une bonne soirée !
Au revoir :wink:

Bonsoir

Ils me semble que l'on peut tous les branchés, elles auront une adresse distincte

pour le trouver ils faut utiliser le I2C Scanner

https://playground.arduino.cc/Main/I2cScanner

@+

Bonsoir
l’I2C est un bus ou tous les composants sont raccordés a une paire de lignes SDA et SCL

Pas de problème tant que chaque composant a son adresse distincte.

Les notices des composants donnent les adresses, idem pour le scanner indique ci-dessus qui va faire l’inventaire du bus I2C avec l’adresse de chacun.

bus I2C.jpg

J’ai passé plusieurs jours à faire des recherches sur ce problème

Dommage, une recherche sur le principe du bus I2C aurait fourni la réponse… et l’absence de problème !!!(sauf cas particuliers)

Merci de votre réponse. En branchant tout aux pins SDA et SCL, seul l'écran fonctionne... Lorsque j'avais fais la même manipulation avant, mais sur les pins A4 et A5, seul le gyro ne fonctionnait pas. Peut-être était-ce mal branché ? Les différents modules ont bien une adresse différente. En suivant le schéma de @al1fch , je vois qu'il y a deux master pour 2 slave. Est-il obligatoire d'avoir un master par 2 slave à chaque fois ? Ou il suffit de les brancher ensembles (comment ?) ? Merci beaucoup de votre aide, bonne soirée

Le nombre maximal de circuits est de 128 mais il y a une limite en fonction des capacités parasites des câbles, connexions, etc. J'ai déjà adressé 4 esclaves simultanément sans problème.

En branchant tout aux pins SDA et SCL, seul l'écran fonctionne... Lorsque j'avais fais la même manipulation avant, mais sur les pins A4 et A5, seul le gyro ne fonctionnait pas. Peut-être était-ce mal branché ?

Pour moi SDA = A4 et SCL = A5 sur UNO, NANO ou MINI. Quelle carte ? UNO ou MEGA ?

la présence de 2 maîtres sur le schéma (trouvé sur la toile) à pour seule fonction de montrer qu'il peut y avoir plusieurs mâîtres, en général on fait avec un seul !!

Que dit le scanner I2C?

Le non fonctionnement de certains périphériques I2C peut être du au code utilisé.......

Voici ce que me donne le fameux scanner

I2C Scanner
Scanning...
I2C device found at address 0x27  !
I2C device found at address 0x57  !
I2C device found at address 0x68  !
done

Je possède une carte Arduino officielle UNO

Lorsque je branche le gyro et l'écran LCD aux même ports A4 et A5, ça marche nickel ! J'arrive à afficher les coordonnées dessus. Seulement, lorsque je branche mon module RTC DS3231, les coordonnées en x sont bloquées à 225° ...

Up ;D

Le scanner voit bien 3 périphériques avec leurs adresses respectives.

Quelle librairie (origine ?) est utilisée pour la RTC ? Que donne la combinaison RTC + LCD (sans gyro) ? Donner içi u le code produisant le conflit (ce genre d'info est à fournir pour toute demande d'aide, cf messages épinglés)

iFrostizz67:
Pour la RTC, j’ai la librairie “RTClib”. Si je mets l’horloge et le LCD, ça fonctionne très bien.

#include <Wire.h>

#include <LiquidCrystal_I2C.h>
#include “RTClib.h”

LiquidCrystal_I2C lcd(0x27,20,4);  // On indique l’adresse de l’écran 20x4 qui est “0x27”

RTC_DS3231 rtc;

int16_t axis_X,axis_Y,axis_Z;
int minVal=265;
int maxVal=402;
double x; // x est un nombre à virgule
double y; // y est un nombre à virgule
double z; // z est un nombre à virgule

lcd.init(); // Initialisation de l’écran LCD
lcd.backlight(); // Allumer la lumière de l’écran LCD qui rend les caractères plus visibles

Serial.begin(9600);

Wire.beginTransmission(0x68); // Adresse I2C du capteur MPU6050
  Wire.write(0x3B); // Adresse du ACCEL_XOUT_H (datasheet)
  Wire.endTransmission(false); // Fin de transmission totale avec le capteur
  Wire.requestFrom(0x68,14,true);
  axis_X=Wire.read()<<8|Wire.read(); // Enregistrement des 2 premiers bits
  axis_Y=Wire.read()<<8|Wire.read(); // Enregistrement des 2 bits du milieu
  axis_Z=Wire.read()<<8|Wire.read(); // Enregistrement des 2 derniers bits
    int xAng = map(axis_X,minVal,maxVal,-90,90); // On re-étalonne la valeur axis_X entre -90 et 90 (angle en degrés)
    int yAng = map(axis_Y,minVal,maxVal,-90,90); // On re-étalonne la valeur axis_Y entre -90 et 90 (angle en degrés)
    int zAng = map(axis_Z,minVal,maxVal,-90,90); // On re-étalonne la valeur axis_Z entre -90 et 90 (angle en degrés)
      x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI); // La valeur de atan2 est en radian en sortie. On utilise donc “RAD_TO_DEG”
      y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI);
      z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);

lcd.setCursor (5,0);
lcd.print(x);

DateTime now = rtc.now();

lcd.setCursor(0,0);
lcd.print(now.hour());
lcd.setCursor(0,1);
lcd.print(now.minute());

delay(1000);






C'est pas exactement mon programme, mais on a l'idée

J'ai déjà entendu parler de problèmes liés au partage du bus I2C avec le MPU6050.

Oui, un confilt d’addresses I2C peut arriver sur l’adresse 0x68 qui est l’une des adresses possibles du MPU …et l’adresse unique du DS3231

cf liste d’adresses i2C d’Adafruit et le confilit sur 0x68
0x68.jpg

Pour éviter que les deux périphériques RTC et MPU se ‘marchent sur les pieds’ Il y a sans doute, on peut l’espérer, une pin (AD0 ?) sur le module MPU6050 pour le passer en 0x69,mais sans info sur le module utilisé…

L’adresse 0x57 listée plus haut par le scanner pourrait être celle de l’EEPROM 24C32 ajoutée sur certaines cartes RTC…

On serait à 4 esclaves sur le bus I2C, dont deux à la même adresse …donc 3 seulement visibles au scanner

Oui, en effet il y a un pin ADO !! Je vais me renseigner sur ceci !! Merci beaucoup :) Je vous tiens au courant :D

Enfin ! Ouf

J'ai donc branché le pin ADO au 3V3 et ça fonctionne à merveille :) Merci beaucoup !

OK !! et tu as un maître et 4 esclaves sur ton bus I2C

Un dernier truc, mon gyro affiche toujours la même valeur: 225°. En lançant le scan de modules I2C, On trouve ça:

I2C device found at address 0x27  !
I2C device found at address 0x57  !
I2C device found at address 0x68  !
I2C device found at address 0x69  !

En effet, on a cette fois 4 adresses pour 4 modules (sauf que le 0x69 s'est rajouté grace au pin ADO). Mais le 0x68 ne part pas. Pourtant, j'ai bien branché mon pin ADO au 3V3

edit: Oui, du coup j'ai bien un maitre et 4 esclaves mais toujours pas les bonnes coordonnées

0X68 est le DS3231, normal que tue voies encore son adresse s'il est branché!! 0x69 le MPU ..... qui a déménagé de 68 en 69 0x57 sans doute la petite puce EEPROM à côté du DS3231 sur le 'module RTC' (2 puces , 2 adresses) 0x27 l'afficheur LCD

Pour le résultat du MPU6050 je ne peux t'aider, je ne connais pas cette puce, ne l'ai encore jamais étudiée et utilisée. On n'est plus sur un pb de cohabitation I2C Mieux vaut créer un fil de discussion avec un titre explicite (.....MPU6050....) et peut être chercher (icône loupe) d'autres échanges autour du MPU6050