IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

MCP9600 problème d'I2C [Arduino ESP32]


Sujet :

Arduino

  1. #1
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 253
    Par défaut MCP9600 problème d'I2C
    Bonjour le Forum,

    J'ai acheter deux modules MCP9600 (ampli pour thermocouple) en I2C.

    Je n'arrive pas à faire fonctionner l'exemple de la bibliothèque de AdaFruit MCP9600.

    J'ai un sketch qui scan les adresse I2C branchées sur lI2C. Un scan se répète toutes les deux secondes

    Donc un module I2C branché , le programme donne l'adresse du module. SI il y a plusieurs modules, il scanne toutes les adresses disponible.
    C'est un truc qui me permet de vérifier l'adresse d'un module et son branchement.

    Hors, avec les module MCP9600, lorsque je branche le module, le scan trouve son adresse, puis au scan suivant, plus de module.
    Si je branche deux module (BMP280 par exemple), le premier scan scan trouve les deux adresse (le BMP280 et le MCP9600, puis au second scan, le module MCP9600 n'est plus trouvé, uniquement l'adresse du BMP280.

    Je coupe l'alimentation (3.3v) du module MCP9600, puis la rebranche, et le premier scan suivant le rebranchement trouve bien l'adresse du MCP9600, mais au second scan, plus rien (uniquement l'adresse du BMP9600).

    J'ai mis des résistances de pullup, mais rien n'y fait

    Si quelqu'un a déjà eu un problème similaire (et trouvé une solution. ou une raison ...)

    Merci

    Michel

  2. #2
    Invité de passage
    Homme Profil pro
         ​​​  
    Inscrit en
    Décembre 2025
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité :      ​​​  

    Informations forums :
    Inscription : Décembre 2025
    Messages : 93
    Par défaut
    Juste par curiosité est-ce que la condition stop a été émis avant le second test j'ai l’impression que le module reste connecté

  3. #3
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 253
    Par défaut
    Bonsoir,

    Oui, en fait le code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      for(address = 1; address < 127; address++ ) {
        Wire.beginTransmission(address);
        error = Wire.endTransmission();
        if (error == 0) {
    Donc on regarde le code de retour de" Wire.endTransmission() " qui je suppose contient le code "stop".

    En tous cas les autre type de module I2C ne m'ont jamais fait cela.

    Remarques, J'ai commande deux modules MCP9600, et ils font tous les deux la même choses...
    Je suis le premier de la terre à utiliser ces modules ??

    Michel

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 419
    Billets dans le blog
    48
    Par défaut
    Salut,

    les symptômes ressemblent à un problème de timing ou un problème avec le contrôleur I2C de l'esp32 qui gère mal le protocole.

    Quelle carte ESP32 utilises-tu ? Quelles broches pour l'I2C (GPIO21 et GPIO22 ?)

    Adafruit recense des soucis avec ce MCP9600, voir https://learn.adafruit.com/i2c-addre...ublesome-chips

    Troublesome chips:
    Some sensors or chips have non-standard behavior that causes issues when trying to use I2C. Here's a few of the ones to watch for

    MCP9600, MCP9601 - Repeated start, clock stretching. Often will not respond to zero-length writes, so scanning the I2C bus to find the device can fail.
    - le 'clock stretching', c'est quand le mcp9600 force l'horloge à rester à l'état bas pendant un certain temps pour temporiser en attendant l'arrivée de la donnée. Si le contrôleur i2c de l'esp32 ne le gère pas correctement, le mcp9600 se met en erreur et disparait du bus.
    - le 'repeated start' évite de faire un STOP avant de refaire un START, mais si le contrôleur i2c de l'esp32 ne le gère pas correctement non plus, idem, le mcp9600 se met en erreur et disparait du bus.


    Quel code ou quelle bibliothèque utilises-tu pour faire le scan I2C ? On pourrait peut-être modifier le code simplement pour voir si l'hypothèse est bonne ?

    Parce que modifier le code d'Adafruit et ses usines à gaz
    Le plus simple sera peut-être de refaire un pilote simplifié avec la bibliothèque Wire, mais en ralentissant l'horloge, en évitant les 'repeated start' et forcer une tempo pour laisser le temps à la donnée d'arriver.

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 419
    Billets dans le blog
    48
    Par défaut
    Citation Envoyé par michel.semal Voir le message
    Bonsoir,

    Oui, en fait le code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      for(address = 1; address < 127; address++ ) {
        Wire.beginTransmission(address);
        error = Wire.endTransmission();
        if (error == 0) {
    dans mon message précédent :
    Troublesome chips:
    Some sensors or chips have non-standard behavior that causes issues when trying to use I2C. Here's a few of the ones to watch for

    MCP9600, MCP9601 - Repeated start, clock stretching. Often will not respond to zero-length writes, so scanning the I2C bus to find the device can fail.
    C'est exactement ce que fait le code du scanner I2C, une écriture de longueur zéro.

    Avant de faire le wire.endTransmission(true), insère un wire.write(0);

  6. #6
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 253
    Par défaut
    Bonjour f-Leb,

    Merci pour les info,
    Lorsque je teste avec la ligne "Wire.write(0);" dans le code du scanner, alors le module MCP9600 repond

    Il ne reste plus qu'a intégrer cela dans la library utilisée pour le MCP9600.
    Pour l'instant Adafruit, mais sans doute en trouver une autre plus facile à gérée.

    Un grand merci à toi...

    Je garde encore la discussion ouverte le temps de trouver la bonne library

    Michel

  7. #7
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 253
    Par défaut MCP 9600 Library qui fonctionne
    Bonjour,

    Pour faire suite à la discussion, j'ai trouvé (enfin heuu..... f-Leb à trouvé) la raison du problème.

    J'ai donc modifié le code, et le scan fonctionne.
    Les library ne fonctionne pas toutes (ils faut sans doutes les modifier).
    Par conter, celle de SparkFun_MCP9600 fonctionne directement. Attention l'adresse standard pour le MCP est 0x67
    alors que SparkFun utilise 0x60 (avec la pin "ADR" du module à la masse).

    Cela mis à part, avec cette bibliothèque, on défini les GPIO de l'I2C et Hop cela fonctionne sans rajouter le Wire.write(0).

    Donc pour l'instant j'ai un sketches ESP32-WROOM-32 qui lit la température du thermocouple...toutes les secondes.

    Remarques, le connecteur sur la carte MCP9600 semble inversé par rapport à mes thermocouple. Donc le fil rouge sur le bouton '-' le fil noir sur le bouton '+'...... j'ai déjà vu(entendu) cela quelque part ...

    Voila.
    Plus que le reste du programme à installer (contrôle d'un chauffage pour souder des filament imprimante 3D) et c'est en ordre.....

    Je clôture donc la discussion.

    Merci au forum pour une solution rapide.

    Michel

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 419
    Billets dans le blog
    48
    Par défaut
    J'ai regardé rapidement la solution Sparkfun https://github.com/sparkfun/SparkFun...un_MCP9600.cpp

    Ils ont le même souci que toi avec la méthode isConnected() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bool MCP9600::isConnected()
    {
      _i2cPort->beginTransmission(_deviceAddress);
      return (_i2cPort->endTransmission() == 0); 
    }
    avec le commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      // The MCP9600 is a fussy device. If we call isConnected twice in succession, the second call fails
      // as the MCP9600 does not ACK on the second call. Only on the first.
    La solution est connue, c'est celle du scanner i2c modifié que tu as testée avec succès => pas d'écriture de taille zéro.


    Et sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    uint8_t MCP9600::readSingleRegister(MCP9600_Register reg)
    {
      //Attempt to read the register until we exit with no error code
      //This attempts to fix the bug where clock stretching sometimes failes, as
      //described in the MCP9600 eratta
      for (uint8_t attempts = 0; attempts <= retryAttempts; attempts++)
      {
        _i2cPort->beginTransmission(_deviceAddress);
        _i2cPort->write(reg);
        _i2cPort->endTransmission();
        if (_i2cPort->requestFrom(_deviceAddress, (uint8_t)1) != 0)
        {
          return _i2cPort->read();
        }
      }
      return (0);
    }
    Déjà, ils n'utilisent pas de 'repeated start', mais leur solution de contournement pour les problèmes de 'clock stretching' est curieuse... l'ESP32 a droit à 3 essais (boucle for, retryAttempts=3).
    Je suppose qu'au bout de 2 ou 3 essais, la donnée est prête et le mcp9600 finit par relâcher l'horloge...

    Je laisse le dernier mot à Sparkfun :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // The MCP9600 is a fussy device...

  9. #9
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 253
    Par défaut
    En effet f-leb, je pensais avoir une solution définitive, mais en fait non.

    Lorsque l'on modifie le code (je ne sais encore bien quoi), le MCP9600 ne répond plus (jamais, malgré des reset)

    Ce qui permet de le "remettre en service", couper son alim et la remettre...... très pro

    Dès lors plusieurs allumage de l'ESP32 ne perturbe plus le système.

    Bon je dois encore approfondir le problème.Et surtout trouver une solution...

    Faut-il démarquer comme résolu ??

    car le problème est résolu mais pas complètement.....

    Michel

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 419
    Billets dans le blog
    48
    Par défaut
    Citation Envoyé par michel.semal Voir le message
    En effet f-leb, je pensais avoir une solution définitive, mais en fait non.

    Lorsque l'on modifie le code (je ne sais encore bien quoi), le MCP9600 ne répond plus (jamais, malgré des reset)
    suivi d'un :
    Citation Envoyé par michel.semal Voir le message
    [...]le problème est résolu mais pas complètement...
    Ce n'est pas clair. Je croyais que la librairie sparkfun fonctionnait (à l'adresse du module près)...
    Quel code as-tu modifié ?

  11. #11
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 253
    Par défaut
    Oui, je suis d'accord, ce n'est pas clair.....
    Mais les réactions du bazar non plus, ne sont pas clairs.

    J'ai crée un nouveau sketche, j'ai inclus une autre library MCP9600 de Grove, pour voir, pas de réaction de l'I2C...
    J'ai remis le sketche I2C test ,plus de détection du MCP
    J'ai remis le sketche qui fonctionnait avec la library Sparkfun, pas de comm avec MCP via I2C
    Toust cela sans couper d'alimentation car je renvoi simplement la compilation du sktche dans l'ESP32

    pour obtenir une com avec MCP via le test I2C, j'ai du couper l'alimentation du MCP(3.3v) et la remettre.

    Je garde pour l'instant que si l'I2C ne fonctionne pas sur le MCP, il faut couper 'alimentation du MCP et la remettre.

    C'est le phénomène original avec le sketches de test I2C:
    Envoi du sketche.
    pas de détection,
    Coupure alimentation
    Une détection, puis plus de détection jusqu’à la coupure/remise de l'alimentation.

    Problème résolu par l'ajout de Wire.write(0); sur tes conseils, pour le sketche TestI2C

    Mais il semble que si le module bloque, (avec l'utilisation d'une autre library que Sparkfun) seule une coupure d'alimentation permet la remise en route du module.
    Mais il ne fonctionnera une fois avec l'autre library.

    Suis-je plus clair?? plus je me relis moins je me comprend..

    En résumé pour moi:

    Library Adafruit, ne fonctionne pas
    Library Grove ne fonctionne pas
    Library Sparkfun Fonctionne

    Le sketch testI2C n'utilise que la library "Wire" car je regarde juste si un module I2C répond a une adresse.
    Il fonctionne avec la ligne Wire.write(0) avant la ligne Wire.EndTransmission()

    Pour être complet, j'utilise deux type de ESP32 : ESP32-WROOM-32, ESP32-S3-N16R8.
    Le résultat est le même pour les deux


    voila voila voila..

    Michel





    ..

  12. #12
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 419
    Billets dans le blog
    48
    Par défaut
    Je ne comprends toujours pas... Si la librairie Sparkfun fonctionne, mets au feu les librairies Adafruit et Grove pour n'utiliser que les méthodes de Sparkfun et tu n'auras plus ces blocages du mcp9600.

  13. #13
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 253
    Par défaut
    Absolument, c'est ce que j'ai fait....

    Mais je répond à tes questions. Mais effectivement je vais pas me casser la tête.

    Encore merci pour les informations.

    Michel

  14. #14
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 419
    Billets dans le blog
    48
    Par défaut
    Est-ce que tu pourrais faire un test avec la librairie Sparkfun ?


    SparkFun_MCP9600.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool MCP9600::isConnected()
    {
      _i2cPort->beginTransmission(_deviceAddress);
      _i2cPort->write(0);   // insérer cette ligne 
      return (_i2cPort->endTransmission() == 0);
    }
    Puis dans ton programme principal, un truc comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    MCP9600 sensor;
    ...
     Serial.println("Test isConnected(), 3 fois de suite");
     
      for (int i = 0; i < 3; i++)
      {
        bool ok = sensor.isConnected();
        Serial.print("Appel ");
        Serial.print(i);
        Serial.print(": ");
        Serial.println(ok ? "OK" : "FAILED");
     
        delay(500);
      }
    ...
    Pour vérifier que le capteur répond OK trois fois de suite.

    On pourra toujours signaler cette petite amélioration à Sparkfun, apparemment ils n'ont pas vu l'astuce

  15. #15
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 253
    Par défaut
    Pffft, en plus tu me fait travailler de grand matin....

    Enfin, soit.

    Cela fonctionne parfaitement.

    On est bien d'accord, dans la library "SparkFun_MCP9600.cpp" j'ai mis le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool MCP9600::isConnected()
    {
      _i2cPort->beginTransmission(_deviceAddress);
      _i2cPort->write(0);       //   ajout pour test 4/8/2026
      return (_i2cPort->endTransmission() == 0);
    }
    Cela fonctionne

    Mon esprit de contradiction m'a fait essayé sans le code....(oui, je sais......)

    Resultat :
    Test isConnected(), 3 fois de suite
    Appel 0: OK
    Appel 1: FAILED
    Appel 2: FAILED
    Appel 3: FAILED
    Appel 4: FAILED
    et avec le code:
    Test isConnected(), 3 fois de suite
    Appel 0: OK
    Appel 1: OK
    Appel 2: OK
    Appel 3: OK
    Appel 4: OK



    Faut-il en faire une communication ? vers SparFun surement, mais vers notre communauté?

    michel

  16. #16
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 419
    Billets dans le blog
    48
    Par défaut
    Citation Envoyé par michel.semal Voir le message
    Faut-il en faire une communication ? vers SparkFun surement, mais vers notre communauté?
    hop, une issue ouverte chez Sparkfun https://github.com/sparkfun/SparkFun...brary/issues/6

    Et pour Developpez, cette discussion ici-même sera notre contribution.

    Merci pour tes tests

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. I2C et réseaux de terrain
    Par FredG dans le forum Protocoles
    Réponses: 2
    Dernier message: 07/10/2005, 14h20
  2. [PIC 16C84] Ajouter une eeprom externe i2c à un programme
    Par jacques8 dans le forum Autres architectures
    Réponses: 2
    Dernier message: 30/09/2005, 17h11
  3. Ligne I2C
    Par jeannot27 dans le forum C++Builder
    Réponses: 14
    Dernier message: 12/07/2005, 14h16
  4. librairie communication I2C
    Par delinot dans le forum C
    Réponses: 5
    Dernier message: 03/06/2005, 12h34
  5. Pb avec un 89C662 (famille 80c51) et l'I2C
    Par telescan dans le forum Autres architectures
    Réponses: 7
    Dernier message: 04/01/2005, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo