top of page

La voiture évite les obstacles.

​

Nous avons créé un enclos avec du carton. Nous souhaitions que la voiture évite toujours les obstacles et se redirige vers l'endroit (gauche ou droite) où le futur obstacle était le plus loin. Pour cela, nous avons utilisé le capteur ultrason et son support Pan/Tilt ainsi que les moteurs.

​

Nous pouvons voir les composants utilisés sur le plan de câblage ci-dessous :

​

 

sudo nano ultrason_obstacles.py

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

motor1A=16
motor1B=20
motor1E=21

motor2A=9
motor2B=10
motor2E=11


GPIO.setup(motor1A,GPIO.OUT)
GPIO.setup(motor1B,GPIO.OUT)
GPIO.setup(motor1E,GPIO.OUT)


GPIO.setup(motor2A,GPIO.OUT)
GPIO.setup(motor2B,GPIO.OUT)
GPIO.setup(motor2E,GPIO.OUT)

motor1 = GPIO.PWM(motor1E,50)
motor1.start(0)
motor2 = GPIO.PWM(motor2E,50)
motor2.start(0)

TRIG = 7
ECHO = 8
pan = 5
Tilt = 6

GPIO.setup(pan, GPIO.OUT)
ajoutAngle = 5

def regarde_gauche():
 angle = 180
 pwm=GPIO.PWM(pan,100)
 pwm.start(5)
 angleChoisi = float(angle)/10 + ajoutAngle
 pwm.ChangeDutyCycle(angleChoisi)
 time.sleep(1)

def regarde_droite():
 angle = 90
 pwm=GPIO.PWM(pan,100)
 pwm.start(5)
 angleChoisi = float(angle)/10 + ajoutAngle
 pwm.ChangeDutyCycle(angleChoisi)
 time.sleep(1)

def regarde_devant():
 angle = 130
 pwm=GPIO.PWM(pan,100)
 pwm.start(5)
 angleChoisi = float(angle)/10 + ajoutAngle
 pwm.ChangeDutyCycle(angleChoisi)
 time.sleep(1)


#fonctions pour les moteurs
def avant(speed):
 print "Avant"
 GPIO.output(motor1A,GPIO.HIGH)
 GPIO.output(motor1B,GPIO.LOW)
 motor1.ChangeDutyCycle(speed+10)
 GPIO.output(motor2A,GPIO.HIGH)
 GPIO.output(motor2B,GPIO.LOW)
 motor2.ChangeDutyCycle(speed)

def arriere(speed):
 print "Arriere"
 GPIO.output(motor1A,GPIO.LOW)
 GPIO.output(motor1B,GPIO.HIGH)
 motor1.ChangeDutyCycle(speed)
 GPIO.output(motor2A,GPIO.LOW)
 GPIO.output(motor2B,GPIO.HIGH)
 motor2.ChangeDutyCycle(speed)

def pivot_droite(speed):
 print "Pivot Droite"
 GPIO.output(motor1A,GPIO.HIGH)
 GPIO.output(motor1B,GPIO.LOW)
 GPIO.output(motor2A,GPIO.LOW)
 GPIO.output(motor2B,GPIO.HIGH)
 motor1.ChangeDutyCycle(speed)
 motor2.ChangeDutyCycle(speed)

def pivot_gauche(speed):
 print "Pivot Gauche"
 GPIO.output(motor1A,GPIO.LOW)
 GPIO.output(motor1B,GPIO.HIGH)
 GPIO.output(motor2A,GPIO.HIGH)
 GPIO.output(motor2B,GPIO.LOW)
 motor1.ChangeDutyCycle(speed)
 motor2.ChangeDutyCycle(speed)

def stop():
 motor1.ChangeDutyCycle(0)
 motor2.ChangeDutyCycle(0)

def distance():
 #Capteur ultrason
 print "Mesure en cours"
 GPIO.setup(TRIG,GPIO.OUT)
 GPIO.setup(ECHO, GPIO.IN)
 GPIO.output(TRIG,False)
 #print "Attente"
 #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
 d = pulse_duration * 17150
 d = round(d,2)
 return d


# Boucle du programme pour lire le capteur ultrason et utiliser les moteurs
def Boucle():
 regarde_devant()
 while True:
  d = distance()
  if d < 30 :
   print "distance %.1f" %d
   stop()
   regarde_gauche()
   d_gauche = distance()
   time.sleep(1)
   regarde_droite()
   d_droite = distance()
   time.sleep(1)
   regarde_devant()
   if d_gauche < d_droite :
    pivot_droite(50)
    time.sleep(1)
   else :
    pivot_gauche(50)
    time.sleep(1)
  else :
   avant(80)
   print "distance %.1f" %d
   time.sleep(0.5)  

def Reinitialisation(): # Reinitialiser le circuit GPIO
    GPIO.cleanup()                     # Relacher les ressources

# Le programme demarre ici
if __name__ == '__main__':
    #Parametrage()
    try:
        Boucle()
    except KeyboardInterrupt:  # Si on interrompt le programme, on passe d'abord par la fonction suivante
        Reinitialisation()

 

Nous avons créé ce programme nous-mêmes en nous aidant de la revue "Micro portables test".

​

bottom of page