La carte d'extension Motor Shield pour Raspberry Pi permet de contrôler :
Moteur | PWM | Avancer | Reculer |
---|---|---|---|
Moteur 1 | 17 | GPIO 27 | GPIO 22 |
Moteur 2 | 25 | GPIO 24 | GPIO 23 |
Moteur 3 | 10 | GPIO 11 | GPIO 09 |
Moteur 4 | 12 | GPIO 07 | GPIO 08 |
Flèche | GPIO |
---|---|
Avancer | 16 |
Reculer | 19 |
Droite | 13 |
Gauche | 26 |
Capteur | Réception | Emission |
---|---|---|
IR 1 | GPIO 04 (echo) | - |
IR 2 | GPIO 18 (echo) | - |
Ultrasons | GPIO 6 (echo) | GPIO 5 (trigger) |
La gestion d'un moteur nécessite :
Exemple pour le moteur 1 :
import RPi.GPIO as GPIO import time # Utiliser la numérotation électronique du GPIO GPIO.setmode(GPIO.BCM) # définir les broches du GPIO à utiliser en sortie dans un tableau associatif moteur1 = {"PWM":17, "Avancer":27, "Reculer":22} # Configurer les broches en sortie GPIO.setup(moteur1["PWM"], GPIO.OUT) GPIO.setup(moteur1["Avancer"], GPIO.OUT) GPIO.setup(moteur1["Reculer"], GPIO.OUT) # creation d'un objet PWM appelé moteurPWM en précisant le numero de broche (moteur1["PWM"]) et la frequence (50Hz) moteurPWM = GPIO.PWM(moteur1["PWM"], 50) # demarrage du PWM avec un cycle a 0 : moteur arrêté off moteurPWM.start(0) # définir le rapport cyclique à 20 pour faire tourner le moteur 1 à 20% de sa puissance moteurPWM.ChangeDutyCycle(50) # faire tourner le moteur dans un sens pendant 2 secondes GPIO.output(moteur1["Avancer"],GPIO.HIGH) GPIO.output(moteur1["Reculer"],GPIO.LOW) time.sleep(2) GPIO.output(moteur1["Avancer"],GPIO.LOW) GPIO.output(moteur1["Reculer"],GPIO.LOW) # Arreter le PWM moteurPWM.stop() # libérer le port du GPIO utilisé GPIO.cleanup()
Pour activer l'éclairage d'une flèche, il suffit :
import RPi.GPIO as GPIO import time # Utiliser la numerotation electronique du GPIO GPIO.setmode(GPIO.BCM) # définir les broches du GPIO a utiliser en sortie dans un tableau associatif fleche={"avancer":16, "reculer":19, "droite":13, "gauche":26} # Configurer les broches en sortie GPIO.setup(fleche["avancer"],GPIO.OUT) GPIO.setup(fleche["reculer"],GPIO.OUT) GPIO.setup(fleche["droite"],GPIO.OUT) GPIO.setup(fleche["gauche"],GPIO.OUT) print("Activer la flèche avancer pendant 1 seconde :") GPIO.output(fleche["avancer"],GPIO.HIGH) time.sleep(1) GPIO.output(fleche["avancer"],GPIO.LOW) time.sleep(1) print("Activer la flèche reculer pendant 1 seconde :") GPIO.output(fleche["reculer"],GPIO.HIGH) time.sleep(1) GPIO.output(fleche["reculer"],GPIO.LOW) time.sleep(1) print("Activer la flèche droite pendant 1 seconde :") GPIO.output(fleche["droite"],GPIO.HIGH) time.sleep(1) GPIO.output(fleche["droite"],GPIO.LOW) time.sleep(1) print("Activer la flèche gauche pendant 1 seconde :") GPIO.output(fleche["gauche"],GPIO.HIGH) time.sleep(1) GPIO.output(fleche["gauche"],GPIO.LOW) time.sleep(1) # libérer les ports du GPIO utilises GPIO.cleanup()
Un émetteur d’ultrasons (Tx) envoie un train d’ondes sonores (8 impulsions à 40kHz) qui se réfléchissent sur un obstacle et reviennent vers un récepteur (Rx). Connaissant la vitesse du son dans l’air (environ 340 m/s) il suffit de diviser par 2 le temps mis par les ondes pour faire l’aller-retour et calcule alors la distance de l'obstacle.
Pour en savoir plus :
Pour mesurer la distance d'un obstacle on procède de la manière suivante :
import RPi.GPIO as GPIO import time # Utiliser la numerotation electronique du GPIO GPIO.setmode(GPIO.BCM) # définir les broches du GPIO a utiliser en sortie pour envoyer le train d'onde et en entrée pour la réception ultrason={"envoi":5, "echo":6} # Configurer les broches GPIO.setup(ultrason["envoi"],GPIO.OUT) GPIO.setup(ultrason["echo"],GPIO.IN) # fonction qui retourne la distance d'un obtacle def distance(): # generation du train d’ondes ultrasonores GPIO.output(ultrason["envoi"], GPIO.HIGH) time.sleep(0.00001) GPIO.output(ultrason["envoi"], GPIO.LOW) start = time.time() # boucler tant que l'entree n'est pas à l'etat haut while GPIO.input(ultrason["echo"])==0: pass # enregistrement du temps de départ debutImpulsion= time.time() # boucler tant que l'entree n'est pas revenue à un etat bas while GPIO.input(ultrason["echo"])==1: pass # enregistre le temps quand l'entree n'est plus à l'état haut finImpulsion = time.time() # calcul de la distance en cm arrondie à l'entier distance = round((finImpulsion - debutImpulsion) * 343*100/2,1) # renvoyer la valeur de la distance return distance # lancer la fonction distance() jusqu'à l'appui d'une touche while True: try: # lancement de la fonction distance() et affichage du résultat obtenu print(distance()) # attendre 1 seconde avant de relancer la détermination de la distance time.sleep(1) except KeyboardInterrupt: # arreter le programme pass # libérer les ports du GPIO utilises GPIO.cleanup()