Aller au contenu


Photo
- - - - -

Capteur HC-SR04 et raspberry


12 réponses à ce sujet

#1 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris
  • Interests:Programmation et robotique

Posté 09 février 2017 - 11:21

Salut les makers,

 

Je bosse encore sur mon projet de drone autonome et j'ai (encore) un problème. Cette fois ci c'est les capteurs. En effet, j'essai depuis hier de faire fonctionner des capteurs à ultrasons HC-SR04 avec ma raspberry mais pas moyen.

 

Ce qu'il se passe est assez étrange. Quand le capteur n'est pas branché à la raspberry, les GPIOs changent bien d'état quand le programme leur demande, mais quand le capteur est branché, les GPIOs restent à 1 et ne changent pas.

 

Autre chose bizzare (quoi que peut être normal), quand le capteur est alimenté en 5v, je mesure une tension de 5v continue sur les pins ECHO et TRIG (peut être lié au fait que je ne puisse pas changer l'état des pins quand il est branché à la raspi).

 

 

Le tuto préconisais d'utiliser un diviseur de tension pour protéger les GPIO de la raspi (5v -> 3.3v) avec une résistance de 1K et une de 2K. Je n'avais pas ces résistances sous la mains et ai donc du utiliser à la place une résistance de 22K et une de 44K, ça devrais fonctionner pareil non ?

 

Le code (python) utilisé pour mes tests: 

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)

TRIG = 23 
ECHO = 24

print "Distance Measurement In Progress"

GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)

GPIO.output(TRIG, False)
print "Waiting For Sensor To Settle"
time.sleep(2)

GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)

while GPIO.input(ECHO)==0:
  pulse_start = time.time()

while GPIO.input(ECHO)==1:
  pulse_end = time.time()

pulse_duration = pulse_end - pulse_start

distance = pulse_duration * 17150

distance = round(distance, 2)

print "Distance:",distance,"cm"

GPIO.cleanup()

Des idées ?



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 10 février 2017 - 10:48

 

 

Le tuto préconisais d'utiliser un diviseur de tension pour protéger les GPIO de la raspi (5v -> 3.3v) avec une résistance de 1K et une de 2K. Je n'avais pas ces résistances sous la mains et ai donc du utiliser à la place une résistance de 22K et une de 44K, ça devrais fonctionner pareil non ?

 

 

Oui. 

 

Pour le reste je ne sais pas. Mais ça ne me paraît pas normal. 

c'est bien le bon pin de la pi ?
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris
  • Interests:Programmation et robotique

Posté 10 février 2017 - 11:25

Oui, les pins de la raspberry sont les bons.

Je viens d'essayer avec un autre HC-SR04 ce matin, j'ai eu exactement le même comportement :/



#4 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris
  • Interests:Programmation et robotique

Posté 10 février 2017 - 09:42

Je viens de jeter un oeil au schéma du circuit du HC-SR04, les pins TRIG et ECHO sont effectivement connectées au VCC via une résistance. Les tensions que je mesurait sur ces pins semblent donc normale.

Sinon, je viens de refaire quelques tests et les GPIOS de ma raspberry fonctionnent parfaitement, je ne comprend vraiment pas ce qui merde :/

 

Le schéma en question :

https://www.google.f...T7s9APwqwUBO0M:



#5 Didier

Didier

    Membre

  • Membres
  • 22 messages

Posté 11 février 2017 - 06:37

Bonjour.

 

Nouveau membre sur ce forum, je viens de prendre connaissance de ton problème.

 

Aujourd'hui, il est un peu tard. Mais dès que possible je fournirai ici le code utilisé pour faire fonctionner les capteurs de mon robot.

 

Didier.
(A bientôt, peut-être)


#6 Didier

Didier

    Membre

  • Membres
  • 22 messages

Posté 12 février 2017 - 03:20

Bonjour à tous.

 

Je viens de tester le code ci-dessus... Chez moi il fonctionne correctement.

 

Il me semble avoir lu quelque part que la dernière ligne :

GPIO.cleanup()

pouvait parfois poser problème si la librairie RPi.GPIO n'était pas à jour. ( A vérifier )

 

Sinon voici le code ( adapté ) que j'utilise pour KRT1.

 

Didier.

(A bientôt, peut-être)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
# Test d'un capteur ultrason
 
# Importation des librairies nécessaires et suffisantes
import RPi.GPIO as GPIO
import time
 
# Mode de numérotation des GPIO's ( Ici on est en mode BCM )
GPIO.setmode(GPIO.BCM)
 
# Définition des GPIO's pour le capteur ultrason droit
CapteurDroitEmission = 19
CapteurDroitReception = 13
 
GPIO.setup(CapteurDroitEmission, GPIO.OUT)
GPIO.setup(CapteurDroitReception, GPIO.IN)
GPIO.output(CapteurDroitEmission, False)
 
def CapteurEmission(Emission):
    # Envoi du signal
 
    GPIO.output(Emission, True)
    time.sleep(0.001)
    GPIO.output(Emission, False)
 
def CapteurReception(Reception, value, timeout):
    # Retour du signal
 
    count = timeout
 
    while GPIO.input(Reception) != value and count > 0:
        count -= 1
 
def CapteurDistance(CapteurEnvoi,CapteurRetour):
    # Calcul de la distance en centimètres
 
    CapteurEmission(CapteurEnvoi)
    CapteurReception(CapteurRetour, True, 10000)
    Debut = time.time()
    CapteurReception(CapteurRetour, False, 10000)
    Fin = time.time()
 
    return int (( Fin - Debut ) / 0.000058)
 
def EviterObstacle():
    # Calcul des distances de l'obstacle et action(s) selon les résultats
 
    # Cette petite pause ( à  ajuster ) améliore sensiblement les résultats !
    time.sleep(0.05)
 
    # Calcul des distances
    CapteurDroit = CapteurDistance(CapteurDroitEmission,CapteurDroitReception)
    #KRT1 CapteurGauche = CapteurDistance(CapteurGaucheEmission,CapteurGaucheReception)
 
    #KRT1 ...La suite des instructions pour KRT1...
    
    print "Obstacle à  " + str(CapteurDroit) + " cm "
 
 
while True:
 
    EviterObstacle()


#7 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 12 février 2017 - 04:48

Outch je viens de voir le post maintenant :(

 

- Comme la souligné Didier, mettre à jour le RPI.GPIO et même tant qu'à faire la mise à jour du système ^^

- Une mise à jour de ton python ça peux lui faire du bien par la même occasion.

- Pas de mauvais branchement ?

- Tu a une erreur pendant l’exécution du code ?

 

HC-SR04, Raspberry PI 3 pour Python 3.

import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

trigger1 = 23
echo1 = 24

GPIO.setup(trigger1,  GPIO.OUT)
GPIO.setup(echo1, GPIO.IN)

print ("Mesure")

GPIO.output(trigger1, False)

time.sleep(0.5)

try :
    while True :
    
        time.sleep(0.5)
        GPIO.output(trigger1, True)
        time.sleep(0.00001)
        GPIO.output(trigger1, False)
        
        while GPIO.input(echo1) == 0:
            start = time.time()

        while GPIO.input(echo1) == 1:
            stop = time.time()

        distance = round((stop - start) * 34000 / 2, 2)

        print ("Distance : {0} cm".format(round(distance, 2)))

except KeyboardInterrupt :
    print ("On stop")
    GPIO.cleanup()

Voilou.


signature_01.png -->

 

Mon Tipeee
 


#8 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris
  • Interests:Programmation et robotique

Posté 27 février 2017 - 02:01

Salut les gars,

 

J'ai finalement décidé d'acheter des nouveaux capteurs pour voir si le problème venait pas de la et il y a effectivement eu du changement. En effet, j'ai branché un des nouveau capteurs avec la même configuration que l'ancien et cette fois des mesures arrivent à l'écran.

 

Le seul problème c'est que ces mesures n'ont aucun sens et apparaissent comme totalement aléatoire. J'ai donc regardé un peut plus en détail en affichant les variables dans le code et il semble que le problème viennent directement de la source, c'est à dire la durée de la pulsation qui est pas bonne, je ne comprend vraiment pas ce qu'il ce passe :/

 

Pourtant, encore une fois tout est bien branché et j'ai tout triple check :/

 

Des idées ?

 

mon code :

File Edit Options Buffers Tools Python Help                                              
import RPi.GPIO as GPIO                    #Import GPIO library                          
import time                                #Import time library                          
GPIO.setmode(GPIO.BCM)                     #Set GPIO pin numbering                       
                                                                                         
TRIG = 23                                  #Associate pin 23 to TRIG                     
ECHO = 24                                  #Associate pin 24 to ECHO                     
                                                                                         
print "Distance measurement in progress"                                                 
                                                                                         
GPIO.setup(TRIG,GPIO.OUT)                  #Set pin as GPIO out                          
GPIO.setup(ECHO,GPIO.IN)                   #Set pin as GPIO in                           
                                                                                         
while True:                                                                              
                                                                                         
    GPIO.output(TRIG, False)                 #Set TRIG as LOW                            
    print "Waitng For Sensor To Settle"                                                  
    time.sleep(2)                            #Delay of 2 seconds                         
                                                                                         
    GPIO.output(TRIG, True)                  #Set TRIG as HIGH                           
    time.sleep(0.00001)                      #Delay of 0.00001 seconds                   
    GPIO.output(TRIG, False)                 #Set TRIG as LOW                            
                                                                                         
    while GPIO.input(ECHO)==0:               #Check whether the ECHO is LOW              
        pulse_start = time.time()              #Saves the last known time of LOW pulse   
                                                                                         
    while GPIO.input(ECHO)==1:               #Check whether the ECHO is HIGH             
        pulse_end = time.time()                #Saves the last known time of HIGH pulse  
                                                                                         
    pulse_duration = pulse_end - pulse_start #Get pulse duration to a variable           
    print "pulse duration: ", pulse_duration                                             
                                                                                         
    distance = pulse_duration * 17150        #Multiply pulse duration by 17150 to get di\
stance                                                                                   
    distance = round(distance, 2)            #Round to two decimal points                
                                                                                         
    if distance > 2 and distance < 400:      #Check whether the distance is within range
        print "Distance:",distance - 0.5,"cm"  #Print distance with 0.5 cm calibration   
    else:                                                                                
        print "Out Of Range"                   #display out of range  

L'output de ce dernier avec le capteur immobile à 30 cm d'un mur:

pi@raspberrypi:~ $ python sensor.py 
Distance measurement in progress
Waitng For Sensor To Settle
pulse duration:  0.0130839347839
Distance: 223.89 cm
Waitng For Sensor To Settle
pulse duration:  0.0101339817047
Distance: 173.3 cm
Waitng For Sensor To Settle
pulse duration:  0.0245370864868
Out Of Range
Waitng For Sensor To Settle
pulse duration:  0.00531911849976
Distance: 90.72 cm
Waitng For Sensor To Settle
pulse duration:  0.0117380619049
Distance: 200.81 cm
Waitng For Sensor To Settle
pulse duration:  0.00693798065186
Distance: 118.49 cm
Waitng For Sensor To Settle
pulse duration:  0.0242590904236
Out Of Range
Waitng For Sensor To Settle
pulse duration:  0.0104739665985
Distance: 179.13 cm
Waitng For Sensor To Settle
pulse duration:  0.0102732181549
Distance: 175.69 cm



#9 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 27 février 2017 - 03:12

Coucou, 

 

- le capteur est bien face au mur, pour que l'émetteur récepteur fonctionne bien ?

- as tu essayé avec un de nos code ??

 

Perso j'ai acheté mes HC SR04 en Chine avant que la boutique n'ouvre, enfin pour dire que ça fonctionne plutôt bien.

 

Je viens de regarder ton code rapidos, je n'ai rien vu de spécial.

Réduis peut être la valeur 

if distance > 2 and distance < 300: #Check whether the distance is within range

En fait cette valeur c'est la maxi, Mick m'avait conseillé de réduire cette valeur à 250 cm (si je me rappel bien), mais ça peut allez plus haut, maxi j'ai laissé 300 pour ma part.

Bon c'est sur ça ne va pas régler ton problème, bizarre bizarre.

 

Réduis aussi ton delay de 2 secondes dans ta boucle à 0.5 pour lire les valeurs plus rapidement histoire de voir se que ça donne.

 

Sors peut être cette ligne de ta boucle aussi 

GPIO.output(TRIG, False) #Set TRIG as LOW

Mais le mieux serait que tu prennes au moins un de nos codes et que tu essayes, perso ça fonctionne chez nous. ;)


signature_01.png -->

 

Mon Tipeee
 


#10 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris
  • Interests:Programmation et robotique

Posté 27 février 2017 - 03:17

Salut Olivier17,

 

J'ai essayé avec le code que tu a posté, le resultat est le même, les valeurs sont aléatoires :/

Et oui le capteur est bien face à un mur rigide ;)



#11 Didier

Didier

    Membre

  • Membres
  • 22 messages

Posté 27 février 2017 - 04:52

Bonjour.

 

Je n'ai pas testé mais il me semble que tes 3 premières lignes après le While réinitialisent ton capteur et comme il lui faut un "temps de chauffe" avant de donner des infos cohérentes...

 

Teste en plaçant ces 3 lignes juste avant ton While et dis nous si ça améliore le bouzin.

 

Didier.

(A bientôt, peut-être)


#12 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 27 février 2017 - 05:25

Après, le raspberry ne te garanti pas que la mesure est bonne. Ce n'est pas un système temps réel (Prédictible).
Les écarts entre les mesures sont quand même énormes. Il y a quoi qui tourne en même temps que la mesure sur ton raspberry ?

#13 Newbies

Newbies

    Membre passionné

  • Membres
  • PipPipPip
  • 487 messages
  • Gender:Male
  • Location:Paris
  • Interests:Programmation et robotique

Posté 27 février 2017 - 09:04

Bon, j'ai essayé un autre capteur et j'ai refait le code en c++ par la même occasion et ca marche ! (le problème devais donc être hardware) ;)

 

Par contre j'ai remarqué que de temps en temps, le capteur sors une donnée totalement fausse ce qui peut être (très) gênant pour un drone qui repose sur ces données. Une idée d'algo pour lisser tout ca ? (pour l'instant f'ai fais le basique "prend 5 mesure, enlève le min et le max et fais la moyenne du reste" mais ca n'a pas l'air de suffire :/)





Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users