Résistance pull up et I²C

Bonjour,

Je rencontre un problème de lecture de capteur de température et d'humidité utilisant le protocole I2C.

J'ai installé le capteur sur une petite carte comprenant des résistance de pull up sur SDA et SCL comme l'indique le constructeur du capteur. Le SDA correspond à la sortie A4 et le SCL à la sortie A5 d'une carte arduino uno.

Dans un premier temps j'ai essayé sa lecture sur une carte arduino uno et ça fonctionne parfaitement.

Ensuite j'ai essayé de l'installer sur un module utilisant le même microcontrôleur Atmega32p. La seule différence se réside dans les résistances de tirage. En effet, contrairement à une carte arduino uno, les sortie A4(SDA) et A5(SCL) disposent déjà de résistances de tirage intégrés.

En installant ma carte, je fais donc une addition de résistance de tirage (2 résistances de tirage pour SDA et 2résistances de tirage pour SCL).

Je me demande donc si le problème de lecture du capteur dans le second module ne viendrait-il pas de cette addition de résistance de tirage ce qui empêcherait la comunnication I2C.

Merci d'avance.

Je rencontre un problème de lecture de capteur de température et d'humidité utilisant le protocole I2C.

Et si tu disais de quel composant il s'agit ?

Je me demande donc si le problème de lecture du capteur dans le second module ne viendrait-il pas de cette addition de résistance de tirage ce qui empêcherait la comunnication I2C.

On ne peux rien exclure par principe mais ce serait fort étonnant, je dis même quasiment impossible ou alors il y a erreur grossière sur la valeur des résistances .

Il y au minimum deux choses que tu n'a pas indiqué :

  1. les valeurs des résistances : si c'est des CMS indique ce qui est écrit dessus.

  2. les différentes tensions d'alimentation : en mode I2C il faut un niveau haut au minimum de 0,7* Vcc soit 3,5 V donc 3,3 ne passe pas.

Merci pour ta réponse.

Il s'agit du capteur d'humidité/température Honeywell HIH6120. (plus d'info ici et ici)

les résistances que j'ai choisi pour la carte correspondent à la documentation du constructeur à savoir 2.2 KOhm et les résistances de tirage interne du module GPS sont des résistances de 1.5 KOhm.

La tension d'alimentation est la même utilisé pour le premier essai avec une carte arduino uno c'est à dire 3.3 V.

La tension d'alimentation est la même utilisé pour le premier essai avec une carte arduino uno c'est à dire 3.3 V.

Une UNO fonctionne sous 5V !

Les résistances ne devrait pas poser de problème.
L'I2C utilise des modules à collecteur ouvert (documentation -> voir gogole) donc sache qu'une seule résistance est obligatoire sur SCL et 1 sur SDA.
Si un module à déjà des résistances ce n'est pas la peine d'en ajouter sur les autres sauf grand nombre de modules connectés mais ce n'est pas le cas ici.
Par défaut la bibliothèque I2C active les pull-up internes sur A4 et A5. Ces pull-up internes (~50 kohms) sont trop élevées pour un fonctionnement optimum mais elles permettent d'éviter de bloquer le programme en cas "d'oubli" de résistances autour de 4,7 k .

Ensuite j'ai essayé de l'installer sur un module utilisant le même microcontrôleur Atmega32(8 ?)p

C'est une réalisation maison ?
Est-ce que le montage fonctionne correctement ?
Les fuses sont configurés ?
Si Vcc = 3,3V quelle fréquence horloge ?

La vérif avec un blink a-t-elle été faite avant de demander de l'aide ?

Oui, pardon, c'est bine an atmega328p.

Oui mais le capteur est alimenté par la sortie 3,3 V de la carte arduino au même titre que le capteur est alimenté par la sortie 3,3 V du module GPS.

voici la photo du module gps ainsi que le schematic eagle:
ici

L'idée était de rajouter le capteur aux GPIO I2C du module GPS.

  • Lorsque j'ai branché la carte avec le capteur sur la carte arduino uno aux bornes 3.3V/GND/A4/A5, le moniteur de série affichait bien les résultats de mesure.

  • Ce n'est pas le cas quand la carte est branché sur le module GPS aux même GPIO.

  • Le module utilise une fréquence d'horloge de 12Mhz à la différence des IDE arduino qui sont prévu par défaut pour 8 ou 16 Mhz

voici le code :

main

#include <SoftWire.h>
#include <HIH61xx.h>
#include <AsyncDelay.h>

HIH61xx hih;
AsyncDelay samplingInterval;
float temp = 0;
unsigned int hum = 0;




bool measure (float *temp, unsigned int *hum);



void setup()

{
  Serial.begin(9600);

}



void loop()
{

  measure(&temp, &hum);

  Serial.print("Temperature =");
  Serial.print(temp);
  Serial.println(" C");
  Serial.print("humidity = ");
  Serial.print(hum);
  Serial.print(" %");
  Serial.println("");
  Serial.println(" **************** ");
  Serial.print("");

  delay(2000);

}

fonction de mesure

bool measure (float *temp, unsigned int *hum)

{
  boolean finish = false;
  hih.initialise(A4, A5);
  samplingInterval.start(1000, AsyncDelay::MILLIS);

  while (!finish)
  {

    if (samplingInterval.isExpired() && !hih.isSampling()) {

      hih.start();
      //printed = false;
      samplingInterval.repeat();
      Serial.println("Sampling started");

    }

    hih.process();

    if (hih.isFinished())
    {
      finish = true;
    }

    if (temp) *temp = (hih.getAmbientTemp() / 100.0);

    if (hum) {
      *hum = (unsigned int)(hih.getRelHumidity() / 100.0);
    }

  }

  return true;
}

Tu dis qu'avec le module tout fait "atmega328p + gps I2C" seul cela marchait bien ?

Ensuite tu dis que quand tu ajoute le capteur plus rien ne fonctionne ?
Ni le GPS, ni le capteur ou le GPS oui mais pas le capteur ?

As tu contrôlé les tensions d'alim avec et sans capteur ?
As tu essayé avec un scanner I2C pour voir si dans le deuxième montage le capteur est toujours reconnu ?

Scanner I2C = petit programme pour arduino qui liste tous les modules I2C qui sont présents, et détectés, sur le bus.
Se trouve sur le playground et par l'intermédiaire de gogole.

Bonjour j'ai un peu avancé sur le projet :

J'ai relevé les signaux I2C sur un oscilloscope :

  • Dans un premier temps j'ai téléversé un programme très simple de lecture de mon capteur HIH6120 dans le module GPS. Les signaux I2C semble fonctionner dans la mesure où il y a bien les "acknowledge" aux 9eme bit du clock. (info I²C)

image

  • En téléversant le programme complet (le programme du module GPS HidnSeek en intégrant le programme de lecture de capteur HIH6120) et sans changer aucun branchement je me retrouve avec un signal I2C avec "No acknowledge" ( au 9eme bit de l'horloge, la ligne de donné SDA est à l'état haut).

image

Ça explique donc pourquoi les valeurs retournés du capteur sont mauvaises.

Maintenant reste à savoir pourquoi il arrive a communiquer avec le premier programme mais pas avec le deuxième. Je pense peut être un erreur de programmation.

voici les deux programmes :

PROGRAMMES

68tjs:
Tu dis qu'avec le module tout fait "atmega328p + gps I2C" seul cela marchait bien ?

Oui le module seul marchait bien. Il n'arrive juste pas à renvoyer les valeur du capteur HIH6021 que j'ai rajouté au module aux GPIO libre I2C disponible.

68tjs:
Ensuite tu dis que quand tu ajoute le capteur plus rien ne fonctionne ?

non juste les valeur renvoyé sont pas les bonnes.

68tjs:
As tu contrôlé les tensions d'alim avec et sans capteur ?
As tu essayé avec un scanner I2C pour voir si dans le deuxième montage le capteur est toujours reconnu ?

Scanner I2C = petit programme pour arduino qui liste tous les modules I2C qui sont présents, et détectés, sur le bus.
Se trouve sur le playground et par l'intermédiaire de gogole.

Oui elle est bien alimenté.

Oui déjà essayé mais compliqué à mettre en oeuvre. Le module GPS n'a pas de liaison série.Et malgré le Software Serial qui permet de créer une liaison série virtuelle à l'aide d'une autre carte arduino, je n'ai pas pu récupérer l'intégralité des donnés série.