mercredi 24 juin 2020

Mesurer une distance avec un HC-SR04 et un micro:bit


Les modules à ultrason HC-SR04 constituent une façon simple et économique de déterminer à quelle distance se trouve un obstacle. Dans cet article, nous construisons un télémètre grâce à un HC-SR04 branché à une carte micro:bit.



Le module HC-SR04 est un sonar: lorsque sa broche "Trig" est brièvement soumise à un signal logique haut, une brève impulsion ultrasonore est émise.  La broche "Echo" prend ensuite l'état logique haut pendant une durée égale à la durée du trajet aller-retour de l'ultrason.  Puisqu'on connaît la vitesse du son (environ 340 m/s), on peut  utiliser cette durée pour calculer la distance qui sépare le module HC-SR04 de l'obstacle qui a réfléchi l'impulsion ultrasonore.




Connexions 

Commençons par une bien mauvaise nouvelle: la très grande majorité des modules HC-SR04 sont conçus pour être alimentés par une tension continue de 5 V, alors que la carte micro:bit ne dispose que d'une sortie de 3 V. Ça risque de nous compliquer un peu la vie...

Hypothèse 1: vous disposez d'un module HC-SR04 spécialement conçu pour être alimenté à 3 V

C'est loin d'être la norme pour le moment, mais il existe des modules HC-SR04 qui ont été conçus pour être alimentés aussi bien à 3 V qu'à 5 V. Si vous devez vous procurer un capteur à ultrasons spécialement pour le brancher à un micro:bit, ce serait une bonne idée de vous procurer un tel modèle, ça va simplifier les choses. Si votre module HC-SR04 est de ce type, référez-vous au circuit #1 ci-dessous.

Hypothèse 2: votre module HC-SR04, même s'il a été conçu pour être alimenté à 5 V, accepte malgré tout de fonctionner à 3 V!

C'est loin d'être certain, mais votre module HC-SR04, même s'il n'a pas été conçu pour fonctionner dans ces conditions, acceptera peut-être de fonctionner avec une alimentation de 3 V. J'ai fait le test avec 3 modules, et l'un d'entre eux a très bien fonctionné à 3 V, alors que c'était insuffisant pour les deux autres. Vous avez déjà en votre possession un module HC-SR04?  Faites confiances à la vie!  Essayez d'abord le circuit #1 ci-dessous. Si votre dispositif indique obstinément une distance nulle, vous devrez faire le circuit #2 (plus compliqué).

Circuit #1: alimentation 3 V

C'est le circuit à utiliser pour les modules qui fonctionnement à 3 V, et à essayer dans un premier temps, en croisant les doigts, pour les autres modules.
  • Broche VCC du module HC-SR04: broche 3V du micro:bit
  • Broche Trig du module HC-SR04: broche P0 du micro:bit
  • Broche Echo du module HC-SR04: broche P1 du micro:bit
  • Broche GND du mocule HC-SR04: broche GND du micro:bit



Hypothèse 3: votre module HC-SR04 connaît parfaitement ses droits, et il refuse obstinément de fonctionner à une tension de 3 V.

Nous allons tout de même nous en tirer, mais les choses vont se compliquer pour deux raisons. D'une part, il sera nécessaire d'alimenter le module HC-SR04 avec autre chose que les sorties du micro:bit. D'autre part, il faudra abaisser la tension émise par le HC-SR04 sur sa broche "Echo" pour qu'elle soit sans danger pour le micro:bit. Voir le circuit #2 ci-dessous.

Circuit #2: alimentation de 5 V et diviseur de tension

Nous aurons besoin d'une source de tension continue de 5 V.  Il peut s'agir d'une alimentation USB, d'une alimentation de labo, ou tout simplement de 3 piles AA en série (personnellement, j'ai préféré tricher un peu en utilisant la sortie 5 V secrète du micro:bit, dont je parle un tout petit peu plus loin dans cet article).

Il ne faut pas oublier de relier la borne négative de l'alimentation de 5 V avec l'entrée GND de la carte micro:bit, afin que le module HC-SR04 et le micro:bit utilise la même référence pour communiquer.

Mais maintenant que le module HC-SR04 est alimenté en 5 V, il émettra sur sa broche "Echo" un signal de 5 V, qui faut impérativement abaisser à 3 V avant de l'acheminer au micro:bit. Pour ce faire, nous pouvons utiliser un diviseur de tension constitué d'une résistance de 1 kΩ placée en série avec une résistance de 1,8 kΩ.



Nous n'avons pas à prendre cette précaution sur la broche "Trig", car ce signal est émis par le micro:bit (à 3 V), et il sera donc sans danger pour le module HC-SR04.

Voici donc le circuit complet:
  • Broche VCC du module HC-SR04: borne positive de l'alimentation 5 V
  • Broche Trig du module HC-SR04: broche P0 du micro:bit
  • Broche Echo du module HC-SR04: branché à la résistance de 1 kΩ du diviseur de tension
  • Broche GND du mocule HC-SR04: broche GND du micro:bit, borne négative de l'alimentation 5 V, et résistance de 1,8 kΩ du diviseur de tension
  • Broche P1 du micro:bit: branché entre les deux résistances du diviseur de tension


En bonus: la sortie 5 V secrète de la carte micro:bit

Il y a quelque chose d'un peu intrigant concernant l'absence de sortie 5 V sur la carte micro:bit car, lorsque vous la branchez dans le port USB d'un ordinateur afin de la programmer, vous la soumettez bel et bien à une tension de 5 V. Un régulateur de tension abaisse cette tension à 3 V (3,3 V, en fait) avant de l'acheminer vers la sortie 3 V.

Ça signifie que, dans leur grande sagesse, les concepteurs du micro:bit ont jugé que je n'avais pas besoin d'avoir accès à la tension de 5 V. Mais moi, dans ma grande naïveté, j'ai bien l'impression que ça me serait utile!

Il existe une solution. Au verso de la carte, on trouve un certain nombre de petits points de test circulaires. L'un d'entre eux, celui qui est situé juste au-dessus du mot "ANTENNA", est à une tension de 5 V...


Grâce à une petite goutte de soudure, j'ai apporté une nouvelle amélioration à ma carte micro:bit...une sortie 5 V!



Programmation en microPython

Le principe de fonctionnement du HC-SR04 n'est pas aussi compliqué qu'il pourrait en avoir l'air: nous envoyons une brève impulsion à la broche "trig" pour lui demander de prendre une mesure, puis nous mesurons le temps pendant lequel la broche "echo" demeure au niveau logique "haut". Cette durée est égale au temps qui a été nécessaire pour que les ultrasons fassent le trajet aller-retour du capteur vers l'obstacle, puis de l'obstacle vers le capteur.

Sachant que:

vitesse = 2 * distance / temps

En supposant une vitesse de 343 m/s pour les ultrasons, on trouve que la distance en centimètres est égale au temps mesuré (en microsecondes) divisé par 58.

Nous demandons ensuite au micro:bit d'afficher la distance calculée sur sa matrice de LEDs.

-


-

Programmation en MakeCode

C'est le même principe dans MakeCode:


On peut aussi, si on préfère, installer l'extension "sonar" (disponible en cliquant sur la roue d'engrenage), et le programme est encore plus simple:

Les deux méthodes donnent exactement le même résultat...décevant!

Résultats...un bug dans MakeCode?

Le script en MicroPython fonctionne à merveille. Vous placez le capteur à 25 cm d'un mur et ça affiche 25. Vous le placez à 1 mètre du mur, ça affiche 100.

Mais le programme en MakeCode affiche de drôle de valeurs: vous placez le capteur à 25 cm d'un mur, le micro:bit affiche 16. Si le mur est à 1 mètre, le micro:bit affiche 70!!!

Sur la photographie ci-dessous, le micro:bit affiche 9 cm, alors que l'obstacle se trouve à environ 15 cm.



J'ai vérifié que le problème réside dans la brique "Pulse In" (traduite en français par "impulsion dans"): grâce à un analyseur logique branché à la broche Echo, j'ai mesuré une durée d'impulsion de 1455 µs lorsque l'obstacle se trouvait à 25 cm. Pourtant, le micro:bit mesurait une durée de 950 µs, qu'il utilisait pour calculer une distance erronée de 16 cm!

On pourrait croire que j'ai fait une erreur dans la conception du programme, mais il s'agit du même programme qui est cité en exemple d'application sur la page de référence de Pulse In! De plus, ça ne peut pas être une défectuosité de ma carte, puisque le script en micropython donne les bonnes mesures. 

J'obtiens de résultats assez bons, avec la version MakeCode du programme, si je divise par 38 plutôt que par 58 (ce qui n'a pas vraiment de sens...).

Vous trouverez aussi sur ce blog des conseils pour utiliser le télémètre HC-SR04 avec un Arduino Unoavec un Raspberry Piavec un ATTiny85,  avec une carte STM32 Nucleo programmée avec mbed et avec un microcontrôleur PIC.

Yves Pelletier (TwitterFacebook)


Aucun commentaire:

Enregistrer un commentaire