dimanche 25 octobre 2020

Mesure d'une distance avec télémètre laser VL53L1X et Raspberry Pi

J'ai déjà eu l'occasion de parler du télémètre laser VL53L1X il y a quelques mois: je l'avais alors utilisé avec une carte Arduino.  Il s'agit d'un dispositif qui mesure avec une assez bonne précision la distance d'un obstacle situé à 4 mètres ou moins, grâce à un laser infrarouge de type VCEL.

Cette fois, je l'utilise avec un Raspberry Pi et un programme en Python.


Connexions au Rasbperry Pi

Mon module VL53L1X a été conçu par la compagnie Waveshare.  Sparkfun et Pololu offrent également leur propre module à base de VL53L1X, j'imagine qu'ils se branchent de la même façon.

Le module comporte 6 connecteurs, mais je n'en ai utilisé que 4:
  • VCC: Branché à une sortie 3,3 V du Raspberry Pi (broche 1)
  • GND: Branché à une broche GND du Raspberry Pi (broche 6)
  • SDA: Branché à la broche SDA1 du Raspberry Pi (broche 3)
  • SCL: Branché à la broche SCL1 du Raspberry Pi (broche 5)
  • SHUT:  "shutdown control". Je ne l'ai pas utilisée.
  • INT:  "interrupt output". Je ne l'ai pas utilisée.

Installation de la bibliothèque de Sparkfun

Sparkfun a mis au point un module Python; pour l'utiliser avec Python 3, il s'agit de taper cette commande dans le terminal:

sudo pip3 install sparkfun-qwiic-vl53l1x


Exemple de script #1

Voici un premier script qui affiche la distance en millimètres.

-

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Mesure de la distance d'un obstacle avec un télémètre
laser VL53L1X branché à un Raspberry Pi.
Nécessite le module python Qwiic VL53L1X conçu par Sparkfun:
https://github.com/sparkfun/Qwiic_VL53L1X_Py
Pour plus d'infos:
https://electroniqueamateur.blogspot.com/2020/10/mesure-dune-distance-avec-telemetre.html
"""
import qwiic_vl53l1x as qwiic
import time
print("Inialisation du telemetre VL53L1X...")
ToF = qwiic.QwiicVL53L1X()
if (ToF.sensor_init() == None):
print("reussie!\n")
ToF.set_distance_mode(1) # 1: faible portée, 2: grande portée
while True:
try:
ToF.start_ranging()
time.sleep(.1)
distance = ToF.get_distance()
time.sleep(.1)
ToF.stop_ranging()
print("Distance: %s mm" % (distance))
except Exception as e:
print(e)
view raw VL53L1X_Rasp.py hosted with ❤ by GitHub

-


Exemple de script #2

Ce deuxième script utilise tkinter pour afficher la distance dans une fenêtre plus esthétique.


-

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Mesure de la distance d'un obstacle avec un télémètre
laser VL53L1X branché à un Raspberry Pi.
Nécessite le module python Qwiic VL53L1X conçu par Sparkfun:
https://github.com/sparkfun/Qwiic_VL53L1X_Py
Version à interface graphique avec tkinter.
Pour plus d'infos:
https://electroniqueamateur.blogspot.com/2020/10/mesure-dune-distance-avec-telemetre.html
'''
import qwiic_vl53l1x as qwiic
import time
from tkinter import *
ToF = qwiic.QwiicVL53L1X()
ToF.sensor_init()
ToF.set_distance_mode(1) # 1: faible portée, 2: grand portée
fenetre = Tk() # création d'une fenêtre
fenetre.geometry("300x100+150+150") # taille de la fenêtre et position initiale sur l'écran
fenetre.title("Télémètre laser") # titre de la fenêtre
label = Label(fenetre, text=" ") # ligne vide
label.pack()
label1 = Label(fenetre, fg="red", text="Distance mesurée:")
label1.pack()
label = Label(fenetre, text=" ") # ligne vide
label.pack()
label2 = Label(fenetre, text=" ") # contiendra la mesure totale
label2.pack()
def Majvaleur():
ToF.start_ranging()
time.sleep(.01)
label2['text'] = "{0:0.1f}".format(ToF.get_distance()) + " mm"
time.sleep(.01)
ToF.stop_ranging()
fenetre.after(1000, Majvaleur) # on recommence dans 1 seconde
fenetre.after(1000, Majvaleur)
fenetre.mainloop()

-

La précision est excellente pour un objet situé à quelques dizaines de centimètres (la mesure varie d'environ 5 mm pendant que l'objet demeure immobile). Pour des objets situés à 2 mètres, l'imprécision peut être de quelques centimètres.


Yves Pelletier (TwitterFacebook)


1 commentaire:

  1. Super !!!, merci Yves !!!
    Pour augmenter la precision à longue distance tu pourrais éventuelement augmenter le temps d emmission de laser infra rouge avec la fonction set_timing_budget_in_ms(self, TimingBudgetInMs). Essaie avec 200 et 500.


    def set_timing_budget_in_ms(self, TimingBudgetInMs):

    RépondreSupprimer