Nous avons déjà évoqué plusieurs capteurs pour la détection et la mesure de distance d'objets à proximité: sonars acoustiques bon marché, télémètres laser très chers et divers capteurs optiques entre deux. Parmi ceux-ci, nous n'avions pas encore testé le LIDAR-Lite v4 de Garmin.
Succédant au premier LIDAR-Lite que nous avions testé il y a six ans et à la version plus récente illustrée lors de la sortie du Yocto-I2C, ce capteur semble utiliser une nouvelle optique plus compacte:
Le LIDAR-Lite v4 est plus compact que les versions précédentes
L'électronique a aussi changé puisque cette version offre de nouvelles options de connectivité. Pour ce qui nous intéresse, la connexion par I2C utilise désormais officiellement des niveaux à 3.3V, ce qui est nous arrange. On constate par contre que sur ce nouveau boîtier, Garmin a oublié d'offrir des points de fixation, dommage.
Raccordement
Le LIDAR-Lite v4 dispose d'un petit pad sur lequel on peut souder jusqu'à 10 fils suivant les applications, mais seuls quatre fils sont nécessaires pour l'utiliser en I2C avec le firmware fourni d'usine par Garmin: deux pour l'alimentation 5V, et deux pour la lige I2C:
Raccordement du LIDAR-Lite v4 au Yocto-I2C
Lecture du capteur
L'adresse I2C du LIDAR-Lite v4 à la sortie d'usine est 0x62, mais elle peut être modifiée si nécessaire. De manière très similaire à la v3, pour obtenir une mesure, il faut écrire 0x04 dans le registre 0x00 pour déclencher la mesure, attendre que le bit 0 du registre 0x01 passe à zéro pour signaler la fin de la mesure, puis lire la distance en cm, codée sur deux bytes dans le registre 0x10, en little-endian. La mesure retournée est en réalité la moyenne de plusieurs mesures prises par le capteur et combinées pour améliorer la précision.
On peut représenter ce protocole à l'aide d'une petite machine à états, qui pourra être implémentée directement avec le système de tâches dans le Yocto-I2C de sorte à ce que celui-ci interroge directement le capteur et publie les mesures comme s'il s'agissait d'un capteur Yoctopuce natif:
Interrogation par I2C du LIDAR-Lite v4
Voici le job correspondant à utiliser pour le Yocto-I2C
- Tâche "init" (périodique, une fois, pour initialiser)
- assert !isset($state)
- compute $state = 0
- Tâche "mesure" (périodique, 10ms, pour lancer la mesure)
- assert isset($state)
- assert $state == 0
- writeLine @62:0004
- expect 62:{A}{A}{A}
- compute $state = 1
- Tâche "lecture" (périodique, 2ms, pour attendre le résultat)
- assert isset($state)
- assert $state == 1
- writeLine @62:01xx
- expect 62:{A}{A} 62:{A}($ready:BYTE)
- assert ($ready & 1) == 0
- writeLine @62:10xxxx
- expect 62:{A}{A} 62:{A}($1:WORDL)
- compute $state = 0
Notez que nous avons pu combiner les états 1 et 2 dans la tâche "lecture", puisque la commande assert au milieu de la tâche a pour effet de rester dans l'état courant et de recommencer la tâche plus tard si la condition n'est pas remplie.
Nous avons volontairement utilisé des périodes de répétition très courtes, car ce capteur est capable de prendre des mesures très rapidement lorsque l'objet est proche. Mais attention, plus l'objet sera loin, plus la mesure prendra longtemps, et donc la valeur mesurée changera moins fréquemment.
Résultats
Garmin annonce que ce capteur est capable de mesurer des distances jusqu'à dix mètres. Nous étions un peu sceptiques vu nos expériences précédentes avec d'autres modèles, et voyant que les spécifications précisent que ces dix mètres ne sont garantis qu'en intérieur et avec une surface réflective à 90%. En réalité, nous avons été surpris en bien: les mesures sont remarquablement stables grâce au moyennage intégré, et nous avons obtenu des valeurs correctes au-delà de 5 mètres même en extérieur avec une luminosité moyenne (entre 30'000 et 50'000 lux).
L'utilisation de ce capteur avec le Yocto-I2C est donc une alternative tout à fait intéressante au Yocto-RangeFinder pour les applications nécessitant la mesure de distances dépassant 1 ou 2 mètres ou nécessitant un angle de vue plus concentré.