TPE - Voitures autonomes
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".