Problème codage python capteur HCSR04

Fermé
DuddyZ - 26 juil. 2020 à 17:23
 Fabien - 2 août 2020 à 23:01
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) :






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 :






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.
A voir également:

2 réponses

georges97 Messages postés 11842 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 23 avril 2024 2 251
26 juil. 2020 à 19:01
Bonjour,

Je n'ai utilisé le capteur HCSR04 que sur une carte à micro-contrôleur Arduino.

Cependant, le problème que vous posez ne me semble pas soluble car la portée du capteur lui-même, (de mémoire) théoriquement de 400 mm, dépend grandement de la nature des matériaux environnants .

La mesure devient fausse quand le capteur atteint une limite, variable selon l'angle par rapport à la surface de l'obstacle vertical le plus proche et le programme ne peut la prendre en compte si l'obstacle est hors d'atteinte. C'est une caractéristique du composant.

Il faut donc établir des abaques de portée et corriger le programme en conséquence.

Il faut tenir compte aussi du fait que Python ou plus précisément micropython, utilisé sur une pyboard n'est pas un environnement temps réel et qu'il faut tenir compte du délai de traitement des données.

D'autant qu'en demandant l'affichage toutes les demi-secondes, delay (500), le programme ne démarre l'affichage de la distance (dans la boucle for) que s'il a mesuré quelque chose, ce qui ne se produit pas si l'obstacle est hors de portée.

Cordialement
0
DuddyZ Messages postés 1 Date d'inscription dimanche 26 juillet 2020 Statut Membre Dernière intervention 26 juillet 2020
26 juil. 2020 à 23:01
Merci pour votre réponse,

J'ai réussi à résoudre le problème en modifiant un peu le code et plus particulièrement le timeout.

Cordialement.
0
georges97 Messages postés 11842 Date d'inscription lundi 31 janvier 2011 Statut Contributeur Dernière intervention 23 avril 2024 2 251 > DuddyZ Messages postés 1 Date d'inscription dimanche 26 juillet 2020 Statut Membre Dernière intervention 26 juillet 2020
27 juil. 2020 à 06:17
Bonjour,

Merci pour votre retour. Ce serait bien de nous transmettre le nouveau code.

Cordialement
0
Bonsoir,

Si ça peut t'aider, j'avais fait ce tuto sur le même capteur il y a quelques temps https://letmeknow.fr/shop/fr/blog/47-tuto-detecteur-de-presence
0