Aller au contenu


ThieuThieux

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

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

Posté par ThieuThieux - 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.

 

IMG_20210615_154935.jpg

IMG_20210615_154923.jpg

 

 
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

 

IMG_20210615_155426.jpg
 

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).

 

i2c seul.PNG

 
Ici une comparaison entre les deux versions du capteur
 

Capture.PNG

 
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.