lundi 1 juin 2020

Mesurer une distance avec le télémètre laser VL53L1X

Le VL53L1X de ST Microelectronics est un capteur qui permet de mesurer la distance d'un obstacle situé à 4 m ou moins au moyen d'un laser (inoffensif pour les yeux) de type VCEL de 940 nm (infrarouge). Pour mes tests, j'ai utilisé un module fabriqué par la compagnie Waveshare, mais Sparksfun et Pololu ont également leur modèle. Plusieurs modules moins chers comportent plutôt le VL53L0X, dont la portée n'est que de 2 m.



Connexion du capteur

Le capteur comporte 6 connecteurs, mais seulement 4 d'entre eux sont nécessaires: 2 pour l'alimentation, et 2 pour la communication I2C.

VCC: à brancher à une tension de 3,3V ou 5 V. Puisque le capteur VL53L1X fonctionne à 2,8 V, tous les modèles de module (breakout) comportent un régulateur de tension permettant de l'utiliser à 3,3 V. Les modules fabriqués par Waveshare et Pololu acceptent les tensions de 5 V, mais pas celui de Sparkfun.

GND: à brancher à GND.

SDA: à brancher à la broche SDA de votre microcontrôleur  (par exemple: A4 pour l'Arduino Uno, PB6 pour la STM32 Blue Pill, GPIO 4 pour l'ESP8266, D21 pour l'ESP32).

SCL: à brancher à la broche SCL de votre microcontrôleur (par exemple: A5 pour l'Arduino Uno, PB7 par la STM32 Blue Pill, GPIO 5 pour l'ESP8266, D22 pour l'ESP32).

SHUT: entrée optionnelle "shutdown control". Je ne l'ai pas utilisée lors de mes tests.

INT: sortie optionnelle "interrupt output". Je ne l'ai pas utilisée lors de mes tests.

Choix et installation d'une bibliothèque Arduino

J'ai installé la bibliothèque VL53L1X conçue par Sparkfun. Il en existe également une conçue par Pololu, que je n'ai pas essayée. Les deux peuvent être installées par l'entremise du gestionnaire de bibliothèque de l'IDE Arduino.

Sketch

Voici un sketch de base qui affiche régulièrement la distance mesurée (en millimètres) dans le moniteur série de l'IDE Arduino. Tout le travail est fait en arrière-plan par les bibliothèques Wire et VL53L1X, le programme est donc très court.

-
-

Si vous constatez que la distance mesurée par le capteur n'est pas tout à fait exacte, vous pouvez la corriger au moyen de la méthode "setOffset" (ligne 23). Dans mon cas, la distance affichée était environ 20 mm plus courte que la distance réelle, et j'ai donc fait setOffset(20) pour ajouter 20 mm au résultat.

Par défaut, le capteur est réglé en mode "longue distance", ce qui permet de mesurer une distance maximale d'environ 4 mètres. La méthode "setDistanceModeShort" (ligne 33) permet de régler le capteur en mode "courte distance". La portée maximale est alors d'environ 2 m, mais les mesures sont moins perturbées par l'éclairage ambiant.

L'angle du champ de vision du capteur est, par défaut, de 27°. Pour certaines applications, ça peut faire en sorte que les mesures sont affectées par la présence d'obstacles indésirables en périphérie. Il est possible de diminuer ce champ de vision en contrôlant la région d'intérêt (ROI: region of interest). Le capteur est constitué d'une matrice de 16 X 16 éléments, et le contrôle de la ROI consiste à n'activer qu'une partie de ces éléments. Le faisceau le plus étroit (qui rendra le capteur sensible uniquement aux objets situés droit devant) est obtenu en utilisant la commande: setROI(4,4,199) (ligne 36) où le premier argument est la largeur de la matrice active (4 est le minimum), le deuxième est la hauteur de la matrice active (4 est, encore une fois, le minimum) et le troisième est le numéro de l'élément situé au centre de la matrice active (voir le fichier "SparkFun_VL53L1X.h" de la bibliothèque pour connaître l'ordre de numérotation (pas très intuitifs) des éléments de la matrice).


Quelques tests

J'ai fait quelques tests en branchant le VL53L1X à un module STM32 Blue Pill mais, comme je le disais plus haut, vous pouvez utiliser une carte Arduino conventionnelle (comme le Uno).



J'ai placé un grand panneau blanc rigide à différentes distances devant le capteur, et j'ai vérifié que la distance mesurée par le VL53L1X était conforme à ce que je mesurais avec un simple ruban à mesurer. Tel que mentionné un peu plus haut, j'ai constaté un écart d'environ 20 mm que j'ai pu compenser dans le sketch grâce à l'instruction setOffset.

J'ai également constaté que, en laissant l'obstacle parfaitement immobile à une distance d'environ 1 mètre, la distance affichée n'était pas toujours identique: elle pouvait facilement varier de presque 10 mm.  Par exemple, la capture d'écran ci-dessous montre que le même obstacle immobile à été mesuré à 1014 mm et à 1022 mm (donc 8 mm d'écart alors que rien de bougeait).



VL53L1X ou HC-SR04?

Puisqu'on peut se payer environ 12 modules à ultrasons HC-SR04 pour le prix d'un seul VL53L1X, on peut se demander en quoi le VL53L1X serait supérieur au HC-SR04. 


J'ai effectué un test consistant à mesurer la distance d'un même obstacle au moyen d'un VL53L1X et d'un HC-SR04.  Pour des distances inférieures à environ 3 mètres, l'écart entre les mesures était inférieur à 5 cm.


J'ai aussi vérifié la stabilité de la mesure de la distance d'un objet immobile à environ 1 mètres, pour constater que le HC-SR04 donnait des mesures étalées sur une plage de 14 mm: un tout petit peu moins stable que le VL53L1X, mais à peine.

Bref, portée similaire et résultats comparables: personnellement, je ne vois rien qui justifierait de payer 12 fois plus cher pour un VL53L1X. 

Le module VL53L1X utilisé pour la rédaction de cet article a été fourni gratuitement par DigitSpace.

Yves Pelletier (TwitterFacebook)


vendredi 29 mai 2020

Micro:Bit - Première exploration avec MakeCode

Depuis le temps que j'en entendais parler, voici enfin l'occasion de faire l'essai du célèbre Micro:Bit. Voyons un peu si cette carte mise au point au Royaume Uni dans le but de faciliter l'apprentissage de la programmation à l'école saura me séduire, même si je ne fais pas tout à fait partie du public cible.



Une première caractéristique qui saute aux yeux, c'est la grande quantité d'éléments utiles présents sur la carte, malgré sa petite taille:
  • Un très respectable microcontrôleur ARM-Cortex M0 32 bits.
  • Une matrice de 25 LEDs (mine de rien, c'est 24 LEDs de plus que la plupart des autres cartes)
  • 2 boutons programmables, en plus du bouton reset
  • Bluethooth (pour communiquer à distance avec un téléphone ou un ordinateur)
  • Accéléromètre
  • Magnétomètre
  • Capteur de température (intégré au microcontrôleur)
  • Capteur de luminosité (ce sont les LEDs, en fait)
Par conséquent, on peut faire beaucoup de choses avec un Micro:Bit sans même y brancher quoi que ce soit.



Bien entendu, le micro:bit comporte aussi des connecteurs qui permettent de lui ajouter des capteurs, moteurs, afficheurs, etc. Sauf que...qui a eu l'idée de ces connecteurs????

Les 5 principaux connecteurs prennent la forme d'un trou jumelé à une surface plane conductrice d'environ 5 mm de largeur. Les trous ont la taille idéale pour y insérer une fiche banane...


...alors que la surface plane a tout juste la bonne largeur pour y installer une pince crocodile...



Sauf que ça ne nous fait que 5 connecteurs: deux pour l'alimentation (3 V et GND) et 3 entrées/sorties programmables. Je veux bien admettre que ces 5 connecteurs offrent certaines possibilités intéressantes, mais ce serait bien utile d'en avoir un peu plus!

Et il y en a, en fait, beaucoup plus: une vingtaine de surfaces conductrices dont l'épaisseur est de l'ordre du millimètre, et séparées d'une distance inférieure à celle qui sépare les trous d'une breadboard. Sauf qu'à moins d'avoir pensé à se procurer un module d'extension (une fente dans laquelle on insère la carte) ou d'utiliser des modules spécialement conçus pour le micro:bit, ces connecteurs sont difficilement utilisables.

Vous désirez brancher au micro:bit un capteur I2C? Il faut utiliser les connecteurs P19 et P20...inaccessibles sans module d'extension. Un capteur SPI? Ce sont alors les connecteurs P13, P14 et P15, également inaccessibles sans module d'extension.

Vous l'aurez deviné: je n'ai pas pensé à me procurer un module d'extension en même temps que mon micro:bit. J'ai une carte qui comporte plus d'une vingtaine d'entrées/sorties, mais je ne peux pour l'instant en utiliser que 5!!! C'est extrêmement frustrant.

Je comprends la pertinence de ces connecteurs dans un contexte scolaire: l'école se procure des périphériques conçus pour le micro:bit et les élèves n'ont qu'à y insérer la carte: c'est rapide, pratique, et ça évite les erreurs de connexions. Mais ça rend le micro:bit moins compatible avec l'écosystème de modules conçus pour les autres microcontrôleurs.

Un peu de programmation avec MakeCode

MakeCode est un environnement de programmation graphique similaire à Scratch ou à MIT App Inventor: puisque nous créons un programme en faisant glisser des briques, il n'est pas nécessaire de mémoriser la syntaxe d'un langage de programmation traditionnel. Remarquez qu'il existe bien d'autres façons de programmer le micro:bit: cet article sur Arduiblog en recense une bonne dizaine.

Je me suis donc dirigé vers makecode.microbit.org et j'ai cliqué sur le bouton "Nouveau projet".



L'écran est essentiellement divisé en trois zones: 
  • La moitié droite est l'endroit où nous construisons le programme. Dès le départ, deux blocs s'y trouvent déjà: "au démarrage" et "toujours".  Nul besoin de consulter la documentation pour deviner que les instructions que nous insérerons dans "au démarrage" s'exécuteront une seule fois, au démarrage du programme, et que celles que nous insérerons dans "toujours" s'exécuteront à répétition pendant toute la durée du programme.

  • Dans la partie centrale: un réservoir de blocs que nous pourrons insérer dans notre programme, en les faisant glisser dans la zone de droite.

  • À gauche: un simulateur qui permet de vérifier le fonctionnement correct de notre programme avant même de le téléverser dans la carte micro:bit. Puisque le téléversement dans la carte prend certain temps, ce simulateur s'est avéré beaucoup plus utile que prévu.

Je me suis amusé à improviser des programmes en navigant au hasard dans la réserve de blocs.

Mon premier programme consistait évidemment à contrôler la matrice de LEDs. Au démarrage,allumer des LEDs de façon à afficher un visage souriant, attendre 2 secondes, puis faire défiler continuellement le message "Eureka!!!".

Après avoir constaté grâce à la simulation que mon programme avait le comportement désiré, j'ai branché mon micro:bit à l'ordinateur (il est apparu comme une clé usb) et j'y ai enregistré le fichier ".hex" généré par MakeCode. La carte a automatiquement exécuté le programme au bout de quelques secondes.

Je bascule en mode JavaScript et je découvre avec plaisir que j'ai produit sans effort un programme en JavaScript assez élégant, malgré mon absence totale de connaissances en JavaScript.


Dans mon deuxième programme, j'ai utilisé les deux boutons. La LED centrale s'allume au démarrage. Le bouton de gauche déplace la LED allumée vers la gauche, alors que celui de droite la déplace vers la droite.


Puis je me suis un peu amusé avec l'accéléromètre: en inclinant la carte, on change la position de la LED qui s'allume...



Conclusion

Ça fonctionne bien, c'est extrêmement facile à programmer sans avoir à installer le moindre logiciel sur l'ordinateur, et ces foutus connecteurs sont tout simplement ridicules!

À lire aussi

Mes commentaires sur les livres 40 activités avec la carte micro:bit par Dominique Nibart et  Python pour la carte micro:bit par Julien Launay

La carte micro:bit utilisée pour la rédaction de cet article a été fournie gratuitement par DigitSpace.

Yves Pelletier (TwitterFacebook)




mardi 26 mai 2020

Kit: petit robot suiveur de ligne D2-1

Pour la troisième fois en quelques semaines, je vous propose un projet de robot suiveur de ligne, ce grand classique de la robotique récréative qui consiste en un véhicule qui, grâce à des capteurs optiques, suit fidèlement une ligne sinueuse tracée sur le sol.


Après le robot suiveur de ligne à base de Raspberry Pi et le robot suiveur de ligne à base d'Arduino, voici un robot suiveur de ligne basé sur le classique comparateur LM393 (aucun microcontrôleur, donc) qu'on peut se procurer en kit sous l'appellation "Smart Track Vehicle DIY Kit D2-1".

Avant de poursuivre, je vous présente une vidéo du petit robot au travail.


Assemblage du robot

Il faut construire le robot soit même, à partir d'une quarantaine de composants. Il ne manque que les 2 piles AA et, bien sûr, les outils: fer à souder, tournevis, pinces à dénuder...



Un bref coup d'oeil sur le feuillet d'instructions m'a convaincu de ne pas utiliser le feuillet d'instructions.


Le circuit imprimé sert également de plate-forme pour le véhicule. Voici le dessus, où se trouveront la plupart des composants...


...et le dessous, côté soudures, où on retrouvera les moteurs et les capteurs (paires LED/photorésistance).


J'ai commencé par souder les résistances. Le PCB indique clairement la valeur qu'il faut placer à chaque endroit, mais j'étais bien content d'avoir un multimètre pour les identifier car les bandes de couleur sont difficile à distinguer.  Deux résistances de 10 Ω (R9 et R10), deux résistances de 3,3 kΩ (R3 et R4), deux résistances de 1 kΩ (R7 et R8), et quatre résistances d'exactement 51 Ω, ce qui me semble inhabituel (R5, R6, R11 et R12).


Ensuite, les deux transistors PNP S8550. Grâce au profil imprimé sur le PCB, impossible de les placer à l'envers, à moins d'être vraiment très distrait...


Les 8 broches du support à circuit intégré sont très flexibles: assurez-vous que chacune d'entre elles passe bien dans son trou avant de souder,  car c'est possible d'en plier une par inadvertance  (IC1, à l'arrière du véhicule).


Lorsqu'on insère le circuit intégré (un double comparateur LM393), on prend soin de l'orienter avec la petite coche semi-circulaire vers l'avant du véhicule.


Complètement à l'arrière du véhicule: les deux potentiomètres et l'interrupteur marche/arrêt.


C'est très important de placer les deux condensateurs électrolytiques de 100 µF (C1 et C2) dans le bon sens: la broche négative (la plus courte) dans le demi-cercle blanc, à l'avant du véhicule.


Les LEDs rouges doivent également être insérées dans le bon sens: la broche la plus courte est dans le trou le plus rapproché du bord du véhicule.


On fixe le support à piles à l'endroit prévu à cette fin, après avoir retiré le papier qui recouvre sa face adhésive.  On fait passer les fils par un petit trou...


... afin de les souder, de l'autre côté du PCB, là où c'est écrit "BT1 3V" (le fil rouge va là où il y a un signe +).


Les espaces réservés au photorésistances sont R13 et R14 GR. Il s'agit des capteurs qui recevront la lumière réfléchie par le plancher, donc on les place sous le véhicule...

Pour qu'elles soient proches du plancher lorsque le véhicule roulera, gardez une bonne longueur de broche: 2,5 cm environ.


Les LEDs transparentes qui servent à éclairer le plancher vont dans les espaces identifiés D4 et D5. L'orientation est importante: c'est la broche la plus courte qui est à l'avant du véhicule.


Le trou à l'avant du véhicule sert à insérer la grosse vis qui fera office de "roue" avant.


Chaque roue motrice est insérée dans l'axe d'un moteur à engrenages. Une petite vis est fournie pour que la roue demeure bien en place.


Les 4 bouts de fil conducteur fournis servent à la connexion des moteurs.


Les moteurs se branchent sur le PCB là où c'est écrit "M". C'est important de faire la connexion dans le bon sens, sinon le moteur tentera de faire reculer le véhicule.  Chaque moteur a un côté adhésif: le fil conducteur le plus éloigné du côté adhésif est celui qui se branche le plus près de l'avant du véhicule.



On fixe les moteurs à la plate-forme grâce à l'adhésif fourni...



... et notre robot suiveur de ligne est terminé!



Après avoir inséré des piles et appuyé sur le bouton poussoir à l'arrière du véhicule, les LEDs situées sous le véhicule devraient immédiatement s'allumer. Le verso du feuillet d'instruction peut être utilisée comme parcours, ou vous pouvez en faire un vous même avec du ruban gommé noir sur fond blanc.



Vous devrez probablement tourner les potentiomètres (au moyen d'un petit tournevis) afin de trouver un ajustement qui permet à votre robot de suivre fidèlement la ligne noire, comme il le fait sur la vidéo présentée en début d'article.

Principe de fonctionnement

Les photorésistances captent la lumière réfléchie par le sol. Lorsqu'une photorésistance est au-dessus d'une surface blanche (beaucoup de lumière réfléchie), sa résistance est plus faible que lorsqu'elle se trouve au-dessus d'une surface noire (peu de lumière réfléchie).

Chaque photorésistance est associée à un potentiomètre de façon à former un diviseur de tension: la tension entre les deux résistances ne sera pas la même, selon que la surface est blanche ou noire.

Les deux comparateurs du LM393 comparent entre elles les deux tensions associées aux photorésistances. Un des comparateurs émet un signal de sortie si la photorésistance de gauche produit une tension plus grande que la photorésistance de droite. L'autre comparateur fait le contraire: il produit une tension de sortie à la condition que la tension de la photorésistance de droite soit supérieure à celle de la photorésistance de gauche. Le signal de sortie de chaque comparateur commute un transistor relié à un moteur.

Ainsi, lorsqu'une photorésistance se trouve au-dessus de la ligne noire, un des moteurs s'arrête afin de provoquer une légère rotation du véhicule.



En conclusion

Le robot est facile assembler, même par un soudeur débutant. La partie la plus délicate est probablement l'ajustement des potentiomètres afin que le robot se comporte de la façon désirée. Si désiré, la plate-forme, les moteurs et les roues pourraient probablement être réutilisés, plus tard, pour concevoir un robot plus sophistiqué.

Le kit dont il est question dans cet article a été fourni gratuitement par Digitspace.

Yves Pelletier (TwitterFacebook)