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 118,78 Ko
49 téléchargement(s)
IMG_20210615_154923.jpg 118,4 Ko
54 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
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).
Ici une comparaison entre les deux versions du capteur
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.