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 :

Perte de signal BME280 avec un câblage RJ45


Sujet :

Arduino

  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2023
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2023
    Messages : 37
    Par défaut Perte de signal BME280 avec un câblage RJ45
    Bonjour,
    Je travaille sur un projet de station météo sur la base d'un ESP32 et de différents capteurs (classique quoi)
    Depuis 2 semaines je galère sur un problème de com avec le BME280
    Il est branché sur les ports GPIO22 et 21
    Lorsque le composant est branché en direct sur l'ESP 32 avec des câbles et une breadboard tout va bien j'ai les mesures.
    A terme mes capteurs seront éloignés de mon ESP donc je vais passer par des câbles RJ45 ça a très bien fonctionné pendant 3 semaines et maintenant mon BME280 est absent.

    J'utilise ceci pour les RJ 45

    https://www.amazon.fr/perfk-Prise-Co.../dp/B012JGN946

    Voici mes essais :

    1.Capteur branché en direct à l'ESP32 via la breadboard OK j'ai les mesures
    2.Je mets le connecteur RJ45 sur la breadboard en face du BME sans changer le câblage 1: OK
    3.Je branche un câble RJ45 sur le connecteur sans changer le câblage du BME280 et la ce dernier est absent ou envoie des températures ambiantes à 180°C
    J'ai essayé en changeant de câble RJ45, de capteurs BME et de connecteurs mais toujours le même défaut

    J'ai essayé d'être simple mais n'hésitez pas à me poser des questions

    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
    #include <Adafruit_BME280.h>                            
    // Constantes du programme
    #define adresseI2CduBME280                0x76            
    #define delaiRafraichissementAffichage    1500            
     
    // Instanciation de la librairie BME280
    Adafruit_BME280 bme;
     
    void setup() {
     
     
      Serial.begin(9600);
     
      Serial.print(F("Initialisation du BME280, à l'adresse [0x"));
      Serial.print(adresseI2CduBME280, HEX);
      Serial.println(F("]"));
      //Wire.begin(21, 22, 100000);
      if(!bme.begin(adresseI2CduBME280)) {
        Serial.println(F("--> ÉCHEC…"));
        while(1);                              
      } else {
        Serial.println(F("--> RÉUSSIE !"));
      }
      Serial.println();
      }
    void loop() {
      Serial.print(F("Température = "));
      Serial.print(bme.readTemperature());
      Serial.println(F(" °C"));
     
      delay(delaiRafraichissementAffichage);                
      Serial.println();                                    
    }

    Merci.

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 872
    Par défaut
    quelle est la distance ?

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 063
    Billets dans le blog
    47
    Par défaut
    Il me semble que certains câbles avec rj45 croisent des fils (câbles droits ou croisés).

    Edit :
    Il faut donc bien vérifier si c'est un câble droit ou croisé...
    Nom : Rj45-droit-croise.png
Affichages : 207
Taille : 101,5 Ko

    Citation Envoyé par Delba146 Voir le message
    [...] donc je vais passer par des câbles RJ45 ça a très bien fonctionné pendant 3 semaines et maintenant mon BME280 est absent.
    Cela dit, sauf changement de câble, cela n'explique pas pourquoi ça a bien fonctionné pendant un temps

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 276
    Par défaut
    Si j'ai bien vu dans le code, le BME280 communique avec de l'I2C.

    Dans ce cas, c'est un bus local, qui ne devrait pas sortir du PCB (ou de l'appareil).
    Si on a du distant, il faut un protocole électrique qui soit prévu pour, comme les RS... ou le CAN. Avec un câble RJ45, une solution à paire différentielle est préférable (RS422, RS485, CAN).

    En jouant avec les deux résistances de rappel du bus, on peut éventuellement le tenter, mais aucun professionnel ne le fera car c'est trop incertain.
    Il ne faut pas mettre une seule résistance par fil, mais deux à chaque extrémité du câble RJ45, ajuster leur valeur pour être en adaptation d'impédance avec le câble (à 100ohm, c'est très faible, donc pas faisable, mais s'en approcher au mieux) et éviter d'avoir d'autres composants I2C sur le bus. Chercher quelle est la valeur minimale des résistances de rappel admises par les composants (fonction de la tension VCC et du courant admissible par le micro et le BME280), doubler cette valeur (vu qu'on en met deux en //) ajouter un peu de marge, et mettre une résistance de cette valeur à chaque extrémité du câble RJ45 entre le VCC et chaque fil du bus I2C.

    Si cela marche de manière aléatoire, c'est dû à l'influence de l'environement électromagnétique.

    Delias

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2023
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2023
    Messages : 37
    Par défaut Perte de signal BME280 avec un câblage RJ45
    Merci pour ces premiers retours


    Citation Envoyé par f-leb Voir le message
    Il me semble que certains câbles avec rj45 croisent des fils (câbles droits ou croisés).

    Edit :
    Il faut donc bien vérifier si c'est un câble droit ou croisé...

    Cela dit, sauf changement de câble, cela n'explique pas pourquoi ça a bien fonctionné pendant un temps
    J'ai vérifié je n'ai que des câbles RJ45 droits

    Citation Envoyé par Jay M Voir le message
    quelle est la distance ?
    Concernant la distance le capteur sera à 2m max de l'ESP qui sera à l'intérieur de mon abri.

    Citation Envoyé par Delias Voir le message
    Si j'ai bien vu dans le code, le BME280 communique avec de l'I2C.
    Dans ce cas, c'est un bus local, qui ne devrait pas sortir du PCB (ou de l'appareil).
    Si on a du distant, il faut un protocole électrique qui soit prévu pour, comme les RS... ou le CAN. Avec un câble RJ45, une solution à paire différentielle est préférable (RS422, RS485, CAN).
    J'ai choisi ce protocole car c'est celui que j'ai trouvé le plus souvent donc je n'en suis inspiré.
    Maintenant je suis prêt à changer pour une solution plus fiable je suppose ne pas être le seul à avoir un capteur à 2m de l'ESP.

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 872
    Par défaut
    2m en I2C c'est beaucoup, sans doute trop sans adaptation des résistances de pullup et une vérification de l'impédance avec le câble

  7. #7
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2023
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2023
    Messages : 37
    Par défaut
    Citation Envoyé par Jay M Voir le message
    2m en I2C c'est beaucoup, sans doute trop sans adaptation des résistances de pullup et une vérification de l'impédance avec le câble

    Merci Jay
    A ton avis quel serait la meilleure solution pour contourner ce pb, à savoir un BME 280 à environ 2m d'un ESP, je suis ouvert à d'autres solutions.

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 872
    Par défaut
    il existe des solution alternatives comme https://learn.sparkfun.com/tutorials...okup-guide/all

    Sinon il faudrait trouver un capteur capable de parler en RS422 ou RS485. éventuellement considérez avoir un petit arduino au point d'acquisition et pas juste le capteur.

    Si vous voulez rester sur ce que vous avez, n'utilisez pas du câble torsadé comme le CAT5 qui a plus de capacitance que des fils parallèles (ou utilisez du CAT5 mais considérez chaque paire comme un fil unique) et jouez sur les résistances de pullup jusqu'à ce que vous ayez un signal à peu près correct.

  9. #9
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2023
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2023
    Messages : 37
    Par défaut
    Citation Envoyé par Jay M Voir le message

    Si vous voulez rester sur ce que vous avez, n'utilisez pas du câble torsadé comme le CAT5 qui a plus de capacitance que des fils parallèles (ou utilisez du CAT5 mais considérez chaque paire comme un fil unique) et jouez sur les résistances de pullup jusqu'à ce que vous ayez un signal à peu près correct.
    Peux-tu m’en dire un peu plus sur ce dernier ou me diriger vers une doc un exemple
    Merci

  10. #10
    Membre éclairé

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

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 225
    Par défaut Longueur I2C
    Bonjour,

    J'ai chez moi un MKR1010(Arduino) qui communique en I2C avec des capteurs BME280 et SHT31.
    Il y a un BME280 dans un shield solaire à +/- 5 mètre de l'arduino, avec un câble plat de 10 mètres de long.
    L’Arduino est à coté de mon PC et le capteur BME280 dehors près de ma fenêtre...

    J'ai vérifie avec mon oscillo le signal I2C, car en mettant un OLED sur le même I2C, cela posait problème.
    J'ai placé deux résistances de 220 ohm entre les signaux I2C( SDA et SCL) et le 3.3V.
    Le signal à l'oscillo est redevenu beaucoup plus propre (0 et 3.3V)

    J'ai aussi constaté que de temps en temps les capteurs SI702, BME280,SHT31, et d'autre peut être) envoi un retour comme "nan".
    Si le retour est place en variable, cela peut avec Arduino modifier la variable et dès lors elle contiendra toujours "NAN" même si un nouveau retour est correct.

    Moi j'ai vérifier le retour des capteurs lors de la lecture et si "NAN" alors on oublie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              double a = sht[i].readTemperature();
              if (!isnan(a)) Vmt[i].dTT = a;
    Cela fonctionne depuis +/- 2 mois sans problèmes

    J'enregistre les données dans une DB MariaDB sur un raspi, toutes le 5 minutes via Wifi et un Web Client.

    Dans la doc I2C, j'ai trouvé que cela pouvais fonctionner jusque 100 mètres, mais il faut alors prendre des précaution au niveau des câbles, blindés, torsadé, des résistances de pull-up, un renfort d'alim, modifier la fréquence de l'I2C voir les librairy (très mal documentées sur Arduino) ,etc.......

    Moi j'ai donc un câble de 10 mètres et sur un autre MKR1010 un multiplexeur I2C et quatre capteurs SHT31 avec des câbles plat de plus de 3 mètres (sans résistance de pull up et peu de problèmes.

    Voila

    Bon amusement

    Michel

  11. #11
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2023
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2023
    Messages : 37
    Par défaut
    BOnjour Michel,
    Merci pour cette réponse détaillée je vais me permettre de te demander des précisions car je debute dans ce domaine
    Citation Envoyé par michel.semal Voir le message
    Bonjour,
    J'ai placé deux résistances de 220 ohm entre les signaux I2C( SDA et SCL) et le 3.3V.
    Je vais tester cela donc au final le simple fait d'ajouter ces 2 résistances ont résolu ton pb quel type de câble as tu utilisé?

    Citation Envoyé par michel.semal Voir le message
    Bonjour,
    Dans la doc I2C, j'ai trouvé que cela pouvais fonctionner jusque 100 mètres, mais il faut alors prendre des précaution au niveau des câbles, blindés, torsadé, des résistances de pull-up, un renfort d'alim, modifier la fréquence de l'I2C voir les librairy (très mal documentées sur Arduino) ,etc.......
    Michel
    Qu'est ce que tu me conseilles pour câbles, blindés, torsadé

    résistances de pull-up je suppose que ca revient à faire ce que tu as proposé de mettre 2 résistances de 220

    renfort d'alim : je n'ai pas trouvé un renfort pour un esp32

    modifier la fréquence de l'I2C : si tu as des infos je suis preneur

  12. #12
    Membre éclairé

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

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 225
    Par défaut
    Bonjour Delba146
    Citation Envoyé par Delba146 Voir le message
    Je vais tester cela donc au final le simple fait d'ajouter ces 2 résistances ont résolu ton pb quel type de câble as tu utilisé?
    J'ai utilier du câble plat multiconducteur d'un diametre de 0.25 par fil ( en tapant cable plat sur amazone ou sur un autre fournisseur) tu trouve différent modèle.


    Citation Envoyé par Delba146 Voir le message
    Qu'est ce que tu me conseilles pour câbles, blindés, torsadé
    Cela dépend de l'utilisation , de l'endroit, de la distance,.....
    Torsadé, Augmente la capacité du fils, et donc reduit la distance....
    Blindé, permet d'éviter les interférences electromagnétique externe (attention aux boucles de masse )

    Citation Envoyé par Delba146 Voir le message
    résistances de pull-up je suppose que ca revient à faire ce que tu as proposé de mettre 2 résistances de 220
    Pour vérifier la cohérence des résistances, je regarde à l'oscilloscope la tête de mon signal, puis j'installe une résistance sur le SCL et je regarde l'évolution de la forme du signal. Quand le carré devient carré, c'est bon...dans man cas, des resistance 500ohm suffisent(Imax par GPIO =7mA avec 500ohm, I = 6.6 mA)
    Nom : Sans résistance 6m.png
Affichages : 126
Taille : 5,8 Ko
    Ci dessus le signal sans resistance avec un cable plat de 2x3mètres de long. La tension max n'arrive plus à 3V
    Nom : Avec resistance 330.png
Affichages : 127
Taille : 6,2 Ko
    Et avec une résistance de 330 ohm.Attention à Imax des GPIO voir datasheet MKR1010
    L’oscilloscope me permet de résoudre le problème; "Y a-t-il une résistance de pullUp sur le capteur?" Si mon signal se rapproche d'un carré et que la tension maximum se rapproche de la tension d'alimentation(3,3V) je sui content et la communication se passe bien.(Rpullup avec 500 OK)

    Citation Envoyé par Delba146 Voir le message
    renfort d'alim : je n'ai pas trouvé un renfort pour un esp32
    Par renfort d'alimentation j’entends un dispositif électronique qui alimenté par une source externe va redonner des valeurs correctes à l'alimentation et au signaux SCL et SDA


    Citation Envoyé par Delba146 Voir le message
    modifier la fréquence de l'I2C : si tu as des infos je suis preneur
    La bibliothèque <Wire.h> de Arduino permet de modifier la fréquence des signaux I2C. Cependant cette possibilité est dépendante du processeur de ta carte. Il "suffit" de te plonger dans le datasheet du processeur pour voir si il supporte plusieurs vitesses de transmission.
    En théorie, plus la vitesse est basse, plus la distance acceptable est grande. Donc en reduisant la fréquence on augment la portée...
    Pour Info, je tavaille avec des Arduino MKR1010 WiFi, qui possède un µcontroller SAMD21 Cortex®-M0+ 32bit low power ARM® MCU .

    La lecture du Datasheet donne des infos, mais moi je ne suis pas arrivé à modifier la fréquence qui est à 1Mhz pour les MKR1010

    J'essaye, et je regarde les résultats.... parfois catastrophe, parfois beurk et parfois génial...... c'est là le plaisir de l'expérimentation........

    michel

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 78
    Par défaut
    Si tu n'as pas de possibilités de diminuer la fréquence de l'I2C, le "plus simple" reste d'en programmer une librairie basse vitesse. Tu mets d'abord ton signal SDA, puis ton signal SDC, ce qui laisse le temps de au module de lire un signal "propre".

    J'ai mis la version que j'avais faite ici :
    https://github.com/FroggyCorp/tinyI2...main/tinyI2C.h

    (désolé, je n'avais pas vu que cela datait un peu ^^)

Discussions similaires

  1. echantillonnage de signal son avec c++ builder
    Par pack8 dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/05/2008, 20h37
  2. Pertes de liens hypertextes avec \includepdf
    Par Brundle dans le forum Mise en forme
    Réponses: 0
    Dernier message: 13/04/2008, 17h03
  3. [Win 2000] Risque de perte de mes partitions avec FIXMBR ?
    Par Alcatîz dans le forum Windows 2000/Me/98/95
    Réponses: 2
    Dernier message: 22/12/2007, 16h34
  4. Perte de variables session avec IE6.0.28
    Par tom42 dans le forum Langage
    Réponses: 1
    Dernier message: 12/03/2007, 18h43
  5. Perte du modèle relationnel avec ce code...
    Par JeremieT dans le forum VBA Access
    Réponses: 11
    Dernier message: 22/05/2006, 08h06

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