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 :

Plusieurs adresses I2C détectées pour un seul périphérique


Sujet :

Arduino

  1. #1
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 279
    Par défaut Plusieurs adresses I2C détectées pour un seul périphérique
    Bonjour,

    J'ai utilisé le bien connu programme "I2C scanner" pour trouver l'adresse I2C d'un afficheur LCD "DFRobot DFR0555", et à ma grande surprise, la carte trouve 4 périphériques, alors qu'il n'y a que l'écran de connecté !
    Nom : Adresse I2C BIZARRES trouvées avec DFR0555.jpg
Affichages : 116
Taille : 48,8 Ko

    J'avoue que c'est la 1ère fois que ça m'arrive et je ne comprends pas pourquoi ?

    J'ai essayé avec un autre afficheur, un DFR0464, et j'ai exactement le même résultat.

    Voici le code:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    // ---------------------------------------------------------------- 
    // Arduino I2C Scanner
    // Trouvé ici: https://create.arduino.cc/projecthub/abdularbi17/how-to-scan-i2c-address-in-arduino-eaadda
    // Emplacement du pgm source: D:\ELECTRONIQUE\ARDUINO\I2C scanner d'adresses_BIEN\I2C_scanner\I2C_scanner.ino
    // Re-writed by Arbi Abdul Jabbaar
    // Using Arduino IDE 1.8.7
    // Using GY-87 module for the target
    // Tested on 10 September 2019
    // This sketch tests the standard 7-bit addresses
    // Devices with higher bit address might not be seen properly.
    // ---------------------------------------------------------------- 
     
    /*
    Pour fonctionner voici comment relier le périphérique dont on cherche l'adresse I2C:
    Le Vcc du périphérique doit être relié à la pin "+5V" (ou "3.3V" si c'est sa tension d'alim) de l'Arduino
    Le GND du périphérique doit être relié à la pin "GND" de l'Arduino
    Le SCL du périphérique doit être reliée à la pin "A5" de l'ArduinoLe 
    Le SDA du périphérique doit être reliée à la pin "A4" de l'Arduino
    */
     
     
    #include <Wire.h> //include Wire.h library
     
    void setup()
    {
      Wire.begin(); // Wire communication begin
      Serial.begin(9600); // The baudrate of Serial monitor is set in 9600
      while (!Serial); // Waiting for Serial Monitor
      Serial.println("\nI2C Scanner");
    }
     
    void loop()
    {
      byte error, address; //variable for error and I2C address
      int nDevices;
     
      Serial.println("Scanning...");
     
      nDevices = 0;
      for (address = 1; address < 127; address++ )
      {
        // The i2c_scanner uses the return value of
        // the Write.endTransmisstion to see if
        // a device did acknowledge to the address.
        Wire.beginTransmission(address);
        error = Wire.endTransmission();
     
        if (error == 0)
        {
          Serial.print("I2C device found at address 0x");
          if (address < 16)
            Serial.print("0");
          Serial.print(address, HEX);
          Serial.println("  !");
          nDevices++;
        }
        else if (error == 4)
        {
          Serial.print("Unknown error at address 0x");
          if (address < 16)
            Serial.print("0");
          Serial.println(address, HEX);
        }
      }
      if (nDevices == 0)
        Serial.println("No I2C devices found\n");
      else
        Serial.println("done\n");
     
      delay(5000); // wait 5 seconds for the next I2C scan
    }
    Merci pour vos lumières !

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 597
    Par défaut
    Hello,

    Votre scanner, lui, ne cherche pas des "puces", il cherche des "réponses". Il envoie un appel à chaque adresse et note "qui" répond "présent" (en renvoyant un bit ACK).

    La raison pour laquelle vous en voyez quatre est qu'il y a deux puces réelles et deux réponses "non-périphériques" (une fonction de diffusion et un artéfact électrique).

    Votre matériel est parfaitement fonctionnel. Ignorez 0x03 et 0x70. Lorsque vous utiliserez la bibliothèque DFRobot_RGBLCD1602, elle communiquera intelligemment avec 0x3E (pour le texte) et 0x60 (pour la couleur) et tout fonctionnera parfaitement.

    Par contre je pense que l'adresse 0x03 est un faux positif du scanner.

    Vous utilisez aussi la mauvaise bibliothèque : https://github.com/DFRobot/DFRobot_RGBLCD1602
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 131
    Par défaut
    Salut à tous.

    Il semblerait que vous ayez la version V1.0 de votre DFRobot DFR0555.
    Il faut lire la documentation à ce sujet : voici le lien.

    Adresse I2C principale (affichage) : 0x3E
    Adresse I2C secondaire (rétro-éclairage) : 0x60

    Les autres adresses I2C sont réservées à d'autres usages et ne doivent pas être utilisés.

  4. #4
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 279
    Par défaut
    Ignorez 0x03 et 0x70.
    D'accord, mais pouvez-vous me dire pourquoi ?

    Lorsque vous utiliserez la bibliothèque DFRobot_RGBLCD1602, elle communiquera intelligemment avec 0x3E (pour le texte) et 0x60 (pour la couleur) et tout fonctionnera parfaitement.
    Donc dans mes programmes où il y aura d'autres périphériques I2C que des écrans (capteurs, EEPROM, etc...), il faudra donc que je différencie si je veux envoyer du texte ou bien changer la couleur ?

    Et utiliser l'adresse 0x3E si je veux envoyer un texte, et 0x60 pour changer la couleur ?

    Si oui ça s'applique seulement au DFR0464 qui est RGB (et donc où l'on peut choisir la couleur), mais pour le DFR0555 qui est de couleur bleue uniquement, on considère que son adresse est 0x3E, c'est ça ?

    Vous utilisez aussi la mauvaise bibliothèque : https://github.com/DFRobot/DFRobot_RGBLCD1602
    Dans le programme I2C scanner, sauf erreur de ma part, seule la bibliothèque "wire.h" est utilisée.
    Mille excuses si je me trompe, mais la biblitohèque que vous indiquez est destinée aux LCD avec couleur RGB comme le DFR0464, mais le DFR0555 n'en a pas besoin (puisque couleur bleu uniquement).

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 597
    Par défaut
    D'accord, mais pouvez-vous me dire pourquoi ?
    Je vous l'ai dis, relisez ma réponse précédente...

    il faudra donc que je différencie si je veux envoyer du texte ou bien changer la couleur ? Et utiliser l'adresse 0x3E si je veux envoyer un texte, et 0x60 pour changer la couleur ?
    Une bibliothèque est une "couche d'abstraction". Elle est conçue pour vous simplifier la vie. Quand vous utilisez la bibliothèque DFRobot_RGBLCD1602, vous n'avez plus à penser à ces deux adresses.

    Quand vous écrivez : lcd.print("Bonjour")
    • En coulisses : La bibliothèque envoie les bonnes commandes I2C à l'adresse 0x3E.


    Quand vous écrivez : lcd.setRGB(255, 0, 0)
    • En coulisses : La bibliothèque envoie les bonnes commandes I2C à l'adresse 0x60.


    Vous n'avez donc pas à gérer les adresses vous-même. La bibliothèque s'en occupe pour vous, vous permettant de vous concentrer sur votre code pendant qu'elle gère la complexité du module.

    "Si oui ça s'applique seulement au DFR0464 qui est RGB ... mais pour le DFR0555 qui est de couleur bleue uniquement, on considère que son adresse est 0x3E, c'est ça ?"

    "la biblitohèque que vous indiquez est destinée aux LCD avec couleur RGB comme le DFR0464, mais le DFR0555 n'en a pas besoin ... je me trompe ?"
    C'est le point le plus important et la source de votre confusion. C'est une déduction très logique, mais... oui, vous vous trompez. Et la raison est subtile, elle est liée à la fabrication :

    • Votre DFR0555 (Bleu) utilise la même architecture et les mêmes puces que les modèles RGB.
    • Pour DFRobot, il est beaucoup plus économique de concevoir un seul circuit imprimé (PCB) avec les deux mêmes contrôleurs (AiP31068L et PCA9633) pour tous leurs écrans "Gravity".


    Vous devez bien utiliser la bibliothèque que j'ai mentionnée : DFRobot_RGBLCD1602.h.

    • Scanner I2C (Wire.h) : Ne sert qu'à trouver les adresses. Vous avez terminé avec lui.
    • Votre programme final : Doit inclure DFRobot_RGBLCD1602.h.


    Même si votre écran est bleu, cette bibliothèque est essentielle. Elle enverra :

    • Le texte à 0x3E.
    • Les commandes de luminosité (comme lcd.setPWM() ou lcd.setRGB(0, 0, 255)) à 0x60 pour allumer votre LED bleue.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 131

  7. #7
    Membre confirmé
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 279
    Par défaut
    Mille mercis à Fred1599 et Arthemus pour ces superbes explications complètes !

    J'utiliserai donc désormais la librairie "DFRobot_RGBLCD1602.h" car mes projets deviennent plus complexes (avec plusieurs périph I2C) et que le DFR0464 va être de la partie, et je l'utiliserai aussi pour le DFR0555.

    Jusqu'à présent avec le DFR0555 j'utilisais "DFRobot_LCD.h" qui marchait très bien, mais l'écran LCD était le seul périphérique I2C et les projets étaient plus simples.

    Merci pour votre patience face au nombre de bêtises que j'ai écrites....

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/07/2012, 10h43
  2. [Fenêtrage] Plusieurs fonctions d'agrégat pour un seul over
    Par Dominique49 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/03/2012, 19h46
  3. [OpenSSL] Plusieurs adresses email pour un seul certificat
    Par liberio dans le forum Sécurité
    Réponses: 2
    Dernier message: 24/09/2008, 10h18
  4. [MySQL] insérer plusieurs adresses pour une seule personne
    Par dev_deb dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 19/08/2008, 14h20
  5. Plusieurs devices de données pour une seule base
    Par The Wretched dans le forum Sybase
    Réponses: 4
    Dernier message: 12/10/2006, 10h27

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