Codage python d'un capteur HCSR04 avec upycraft
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Codage python d'un capteur HCSR04 avec upycraft



  1. #1
    DuddyZ

    Codage python d'un capteur HCSR04 avec upycraft


    ------

    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.

    -----
    Dernière modification par gienas ; 26/07/2020 à 16h28. Motif: Ajouté les balises code, obligatoires pour les programmes

  2. #2
    umfred

    Re : Codage python d'un capteur HCSR04 avec upycraft

    je vois que tu as modifié le projet du tuto (https://wiki.mchobby.be/index.php?ti...Python-HC-SR04) ^^ initialement, prévu une vingtaine de mesure, et tu es passé à 1000 mesures (tu aurais pu modifier l'affichage aussi print("%i/1000 ...").
    Donc, le nombre de mesure est défini par la boucle for de la fonction show_distance().
    une modification possible:
    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 )
        i=1
        while True:
            # Mesure la distance en cm
            distance = sr04.distance_in_cm()
            # Afficher la valeur
            print( "Mesure %i : Distance %s cm" % (i+1, distance) )
            # Attendre un seconde
            delay( 500 )
            i=i+1
    
    show_distance()
    On trouve aussi l'information qu'à grande distance, il faut que la surface de l'objet "visible" par le capteur soit d'au moins 0.5m² (la distance mesurée pouvant aller de 4cm à 400cm selon la doc)

  3. #3
    DuddyZ

    Re : Codage python d'un capteur HCSR04 avec upycraft

    Merci pour ta réponse !
    J'ai modifié le code comme tu me l'as proposé (c'est vrai que c'est plus propre avec une boucle while).
    Cependant je n'arrive toujours pas à traiter l'information "le capteur ne reçoit pas l'impulsion émise par l'émetteur." Imaginons que l'objet soit à une distance de plus de 4 mètres ou bien que l'obstacle soit d'une surface inférieure à 0.5m². Alors le capteur est sensé me donner l'information -1 (ou je ne sais pas quoi ? Je ne trouve pas cette information sur les forums...) pour me signaler qu'il n'a rencontré aucun obstacle.
    Pour cela dans la librairie ultrasonic, il y a un timeout (d'environ 30000 us, environ le temps d'un aller retour d'une onde sonore sur un objet placé à 4m), mais j'ai l'impression qu'il est inutile ! Quand le timeout est dépassé, il arrête tout le programme alors que j'aurai préféré qu'il renvoie une distance fictive de -1 cm...
    Est ce que tout cela est dû au "raise MeasurementTimeout(self.timeou t)" ? J'espère que mes propos sont claires car ce n'est pas forcément évident de l'écrire...

    Merci d'avance !

  4. #4
    umfred

    Re : Codage python d'un capteur HCSR04 avec upycraft

    pas de message d'erreur (un traceback) ? ça pourrait potentiellement venir de là. Du coup rajouter un try:
    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 )
        i=1
        while True:
            # Mesure la distance en cm
            try:
                distance = sr04.distance_in_cm()
                # Afficher la valeur
                print( "Mesure %i : Distance %s cm" % (i+1, distance) )
           except MeasurementTimeout:
                print("Mesure %i : Erreur de Timeout dans la mesure de distance!")
           except:
                print("Mesure %i : Autre Erreur")
            # Attendre un seconde
            delay( 500 )
            i=i+1
    
    show_distance()

  5. A voir en vidéo sur Futura
  6. #5
    DuddyZ

    Re : Codage python d'un capteur HCSR04 avec upycraft

    Merci beaucoup !! C'était bien un traceback. Tout marche parfaitement maintenant !

  7. #6
    umfred

    Re : Codage python d'un capteur HCSR04 avec upycraft

    Traceback, ça veut dire qu'il y a une erreur d'exécution du code. En l'analysant, ça indique en général assez clairement l'origine de l'erreur (et son type)

Discussions similaires

  1. Implémentation codage huffman (python)
    Par invitecff8806c dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 05/12/2018, 18h32
  2. Problème codage sur python
    Par invite4e3009cf dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 31/03/2018, 08h23
  3. [Python] subprocess, lancer un autre programme avec python
    Par Loupsio dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 30/11/2016, 18h56
  4. Python codage difficile
    Par invitecf158729 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 08/03/2015, 07h04