Aller au contenu


ThieuThieux

Inscrit(e) (le) 29 oct. 2019
Déconnecté Dernière activité sept. 09 2021 10:00
-----

Sujets que j'ai initiés

Test du Capteur à ultrasons HC-SR04 en I2C et UART

15 juin 2021 - 04:08

Bonjour à tous,
Je vais tester aujourd'hui une nouvelle version des bien connus capteur à ultrason HC SR04. Cette nouvelle version permet de communiquer en I2C et en UART.

D’après mes recherche cette nouvelle version serait sortie en 2020 et peu de ressource existe actuellement sur le net sur son fonctionnement. Ci-dessous vous pouvez voir la différence entre la nouvelle version et l'ancienne.

 

Fichier joint  IMG_20210615_154935.jpg   118,78 Ko   41 téléchargement(s)

Fichier joint  IMG_20210615_154923.jpg   118,4 Ko   40 téléchargement(s)

 

 
On peut remarquer ce qui semble être des petits points de brasure qui permettent de sélectionner le mode de communication (à noter que si aucun pont n'est relié le capteur fonctionne de la même façon qu'avant à l'aide de la pin trig et echo)
 
Pour le fonctionnement en I2C j'ai pu déterminer que la valeur de l'adresse I2C du capteur était 0x57 et la valeur 0x01 permettait de récupérer la mesure de distance en mm.
J'ai donc réalisé ce code ci-dessous qui m'a permis de réaliser mes tests sur deux capteurs afin de comparer les deux méthodes :
 

#include <Wire.h>

#define echoPin 2
#define trigPin 3

int mode = 0;
int flagDuo = 1;
int flagI2C = 0;
int flagNorm = 0;
long distance;
long distance_i2c;

long readI2C();
long readClassic();

void setup() {
  // put your setup code here, to run once:*
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an OUTPUT
  pinMode(echoPin, INPUT);
  Wire.begin();
  Serial.begin(9600);
}


void loop() {
  mode = Serial.read();
  switch(mode){
    case '0':
      flagDuo = 1;
      flagI2C = 0;
      flagNorm = 0;
      break;
     case '1' :
      flagDuo = 0;
      flagI2C = 1;
      flagNorm = 0;
      break;
     case '2':
      flagDuo = 0;
      flagI2C = 0;
      flagNorm = 1;
      break;
  }
  if (flagDuo) {
    distance_i2c = readI2C();
    distance = readClassic();
    Serial.print("Distance I2C : ");
    Serial.print(distance_i2c);
    Serial.print(" mm // ");
    // Displays the distance on the Serial Monitor
    Serial.print("Distance : ");
    Serial.print(distance);
    Serial.println(" mm");
    delay(100);
  }
  else if (flagI2C) {
    distance_i2c = readI2C();
    Serial.print("Distance I2C : ");
    Serial.print(distance_i2c);
    Serial.println(" mm // ");
    delay(100);
  }
  else if (flagNorm) {
    distance = readClassic();
    Serial.print("Distance : ");
    Serial.print(distance);
    Serial.println(" mm");
    delay(100);
  }
}


long readI2C()
{
  uint32_t data;
  Wire.beginTransmission(0x57);
  Wire.write(0x01);
  Wire.endTransmission();
  delay(120);
  Wire.requestFrom(0x57, 3);
  data  = Wire.read(); data <<= 8;
  data |= Wire.read(); data <<= 8;
  data |= Wire.read();
  return long(data) / 1000;

}

long readClassic() {
  long dist;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin HIGH (ACTIVE) for 10 microseconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Reads the echoPin, returns the sound wave travel time in microseconds
  long duration = pulseIn(echoPin, HIGH);
  // Calculating the distance
  dist = duration * 0.34 / 2;
  return dist;
}

 

Voici le montage réalisé, la distance entre le carton et le capteur est d'environ 39.5cm

 

Fichier joint  IMG_20210615_155426.jpg   78,11 Ko   41 téléchargement(s)
 

On obtient les valeurs suivante (L’écart de mesure est sans doute dû aux éléments adjacents au capteur ainsi qu'à la taille de l'obstacle).

 

Fichier joint  i2c seul.PNG   133 Ko   41 téléchargement(s)

 
Ici une comparaison entre les deux versions du capteur
 

Fichier joint  Capture.PNG   173,8 Ko   40 téléchargement(s)

 
Il semblerait aussi qu'il est possible de changer l'adresse i2c du capteur, mais je ne sais pas comment faire à l'heure actuelle :(

De plus, je n'ai toujours pas réussi à communiquer en UART ou à trouver des informations sur la façon de le faire.