Bonjour,
Dans le cadre de mon TIPE pour ma 2e année de prépa, j'ai pour ambition d'utiliser un capteur de distance HCSR04 et une pyboard. Cependant j'ai très peu de connaissance dans tout ce qui est programmation python pour les capteurs (auparavant j'ai uniquement codé un petit robot... et encore c'était assez guidé !). Jusqu'à présent j'ai réussi à trouver une librairie python qui permet de calculer le temps d'aller retour de l'impulsion sonore émis par la capteur (pour en déduire une distance) que voici (appelé ultrasonic.py) :
Code:from time import sleep_us from machine import Pin, time_pulse_us class MeasurementTimeout(Exception): def __init__(self, timeout): super().__init__("Measurement timeout, exceeded {} us".format(timeout)) class Ultrasonic(object): def __init__(self, trigger_pin, echo_pin, timeout_us=30000): # WARNING: Don't use PA4-X5 or PA5-X6 as echo pin without a 1k resistor # Default timeout is a bit more than the HC-SR04 max distance (400 cm): # 400 cm * 29 us/cm (speed of sound ~340 m/s) * 2 (round-trip) self.timeout = timeout_us # Init trigger pin (out) self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None) self.trigger.off() # Init echo pin (in) self.echo = Pin(echo_pin, mode=Pin.IN, pull=None) def distance_in_inches(self): return (self.distance_in_cm() * 0.3937) def distance_in_cm(self): # Send a 10us pulse self.trigger.on() sleep_us(10) self.trigger.off() # Wait for the pulse and calc its duration time_pulse = time_pulse_us(self.echo, 1, self.timeout) if time_pulse < 0: raise MeasurementTimeout(self.timeout) # Divide the duration of the pulse by 2 (round-trip) and then divide it # by 29 us/cm (speed of sound = ~340 m/s) return (time_pulse / 2) / 29
Puis j'ai codé le dossier "main.py" qui, en fonction de mes entrées et sorties, me permet d'afficher cette distance sur upycraft :
Code:import pyb from pyb import delay from pyb import Pin from ultrasonic import Ultrasonic TRIGGER_PIN = Pin(Pin.board.Y5,Pin.ANALOG) ECHO_PIN = Pin(Pin.board.Y6,Pin.OUT_PP) def show_distance(): """ Cette fonction mesure la distance et affiche la valeur en centimètre. Effectue la mesure une 20 de fois.""" sr04 = Ultrasonic( TRIGGER_PIN, ECHO_PIN ) for i in range( 1000 ): # Mesure la distance en cm distance = sr04.distance_in_cm() # Afficher la valeur print( "%i/20: Distance %s cm" % (i+1, distance) ) # Attendre un seconde delay( 500 ) show_distance()
En apparence tout semble bien fonctionner. La distance entre l'obstacle et le capteur est bien affichée. Cependant lorsque l'obstacle est trop loin (environ à plus de 200 cm) le capteur semble ne plus recevoir de valeur, donc il met fin à la boucle au lieu de continuer les mesures. Cela est assez problématique car je souheterai une prise de mesure en continue... Comment puis-je modifier le code pour faire en sorte qu'il ne s'arrête pas ?
Merci d'avance pour vos réponses.
-----