On est tombé plus ou moins par hasard sur le télémètre TR-EVO-60M-I2C fabriqué par la société TeraBee. Il promet une distance de détection de 0.5 à 60 mètres avec un angle de vue de 2°. Tout ça dans le volume d'un cube de 3cm d'arête avec une interface I2C et série. A environ 100 francs pièce, on n'a pas pu résister à la tentation d'en acheter un pour jouer avec.
Le TR-EVO-60M-I2C se présente sous la forme d'un parallélépipède noir clipsé sur un support en plastique jaune qui sert d'interface électrique. Cette interface est accessible via un connecteur Hirose DF13 9pins.
Le module TR-EVO-60M-I2C de TeraBee
L'interface électrique permet de contrôler le module soit par I2C soit par série TTL, ce qui nous laisse le choix entre un Yocto-I2C et un Yocto-Serial pour interfacer le capteur. Les deux sont capables d’interroger automatiquement le capteur tout en l'alimentant.
Utilisation avec un Yocto-I2C
La connexion avec un Yocto-I2C est relativement triviale, il suffit d'interconnecter respectivement les contacts GND, SDA, SCL et PWR du Yocto-I2C aux contacts 3, 4, 5 et 8 du capteur.
Le module TR-EVO-60M-I2C de TeraBee connecté à un Yocto-Serial
La même chose, en vrai
Noter que la documentation mentionne que le capteur a des résistances de pull-up de 10KΩ intégrés. Ce qui n'est pas forcément un bon plan si on compte mettre plusieurs de ces capteurs sur le même bus I2C, ce qui est censé être prévu puisque qu'on peut changer l'adresse I2C du capteur. Toujours est-il qu'un seul capteur connecté au Yocto-I2C, qui a lui aussi des pull-up intégrés, fonctionne sans problème. On n'a pas essayé avec plusieurs.
Utiliser le système de jobs
On peut évidemment utiliser le système de jobs du Yocto-I2C pour interroger automatiquement le capteur, le protocole est juste trivial. L'adresse I2C par défaut du capteur est 0x31 sur 7 bits. Il faut donc utiliser la valeur 0x62 pour une opération d'écriture et la valeur 0x63 pour une opération de lecture. Pour obtenir une mesure, il suffit d'envoyer la valeur 0x00 au capteur, patienter au moins 500µs, et ensuite lire le résultat qui est la valeur en mm encodée sur 16 bit, suivie d'un CRC encodé sur un byte. Enfin on utilise expect pour mapper le résultat sur le "genericSensor1" du Yocto-I2C.
writeLine {S}6200{P} wait 1 writeLine {S}63xx{A}xx{A}xx{N}{P} expect 31:{A}($1:WORD)($CRC:BYTE)
Il suffit donc de coder tout ça dans une tâche périodique avec une période 20ms, et le tour est joué.
Avec un Yocto-Serial
Pour connecter le capteur, il faut relier les contacts GND, RT, TD et PWR avec contacts 3, 2, 1 et 7 du connecteur Hirose. Remarquez le croisement TX/RX propre aux communications séries.
La même chose, en vrai
Lorsqu'il est connecté en série, le capteur envoie par défaut le résultat de ses mesures en binaire à un rythme tellement soutenu que le Yocto-Serial a parfois du mal à séparer les trames. Il est plus facile de travailler en mode ASCII, parce que dans ce mode les mesures sont clairement séparées par des retours chariot.
Il faut donc configurer le Yocto-Serial en
- Power output voltage= 5V
- Line-based ASCII protocol
- Encoding = 115200, 8N1
- Flow control=no
- Voltage level= TTL 3.3V
Interrogation automatique
Écrire un job pour que le Yocto-Serial interroge automatiquement le capteur ne prend vraiment pas longtemps. Il faut écrire une tâche périodique, exécutée une seule fois, qui envoie les 4 bytes 0x00, 0x11, 0x01 ,0x45 pour configurer le capteur en mode ASCII.
writeHex 00110145
Et une deuxième tâche, réactive celle-là, pour parser chaque valeur envoyée par le capteur et la mapper sur le "genricSensor1" du Yocto-Serial.
expect ($1:INT)
Et ça marche ?
Honnêtement, ça marche furieusement bien, le TR-EVO-60M-I2C est le meilleur télémètre bon marché qu'on ait testé depuis des années, il est rapide et détecte sans ambiguïté des mouvements comme une porte qui s'ouvre et se referme à une bonne quinzaine de mètres. On n'a pas pu tester la distance maximale de 60 mètres faute de locaux assez grands.
Ça marche plutôt pas mal
On a aussi essayé en extérieur, où les conditions sont notoirement plus difficiles pour ce genre de capteur. On l'a posé au bord de la route qui passe devant les locaux de Yoctopuce, on n'a aucun mal à distinguer les voitures qui passent.
Compter des trucs qui passent relativement vite? pas de problème
Par contre, en extérieur, on a eu du mal a atteindre la distance annoncée de 60 mètres, en particulier en plein soleil. Passés trente mètres, on a dû utiliser un réflecteur.
En conditions difficiles, un réflecteur peut aider
Il y a aussi une version USB
Si vous avez déjà visité le site de TeraBee, vous avez sans doute remarqué que le petit socle jaune existe aussi en version USB et peut-être vous demandez-vous pourquoi vous achèteriez un Yocto-Serial ou un Yocto-I2C pour connecter le capteur à votre ordinateur par USB alors que cette interface est déjà proposée par TeraBee.
TeraBee propose aussi une interface USB (photo TeraBee)
Pour une utilisation basique, vous auriez effectivement intérêt à utiliser la version de TeraBee. Par contre, pour une utilisation un peu plus avancée, la version Yoctopuce offre de nombreux avantages.
- La version TeraBee fonctionne avec un port COM virtuel, qui peut nécessiter l'installation d'un driver. De plus, si cette technologie basée sur des ports COM est très facile d'accès, elle peut rapidement tourner au cauchemar dès lors que plusieurs appareils, identiques ou non, sont branchés sur le même ordinateur.
- Les modules Yoctopuce n'utilisent pas de port COM, ne nécessitent pas de driver, et sont facilement identifiables ce qui permet d'en brancher plusieurs sur la même machine sans que cela pose le moindre problème.
- On l'a vu, un Yocto-Serial ou un Yocto-I2C peuvent se charger d'interroger le capteur et présenter directement le résultat à la façon d'un capteur générique standard
- Le Yocto-Serial et le Yocto-I2C disposent d'un datalogger intégré qui permettra d'enregistrer automatiquement les mesures
- Le Yocto-Serial et le Yocto-I2C peuvent être connectés à un YoctoHub qui permettra d'y accéder à distance à travers le réseau.
- L'API Yoctopuce permet d'interroger les capteurs directement, mais aussi de fonctionner en mode callback, permettant ainsi de créer facilement des applications extrêmement réactives
Conclusion
On a vraiment été agréablement surpris par les performances de ce petit capteur en plastique relativement bon marché qui, à première vue, ressemblait plus à un jouet qu'à un instrument de mesure performant. Si vous avez besoin de mesurer une distance de plusieurs dizaines de mètres ou de détecter de loin des objets qui se déplacent, ça vaut définitivement la peine de s'y intéresser. Enfin, si vous voulez utiliser les jobs qu'on a écrit pour tester le TR-EVO-60M-I2C, vous pouvez les télécharger ici.