Table des matières

Raspberry : utiliser la carte d'extension Motor Shield de SB Components

Ressources

Présentation

La carte d'extension Motor Shield pour Raspberry Pi permet de contrôler :

Branchement des moteurs

GPIO utilisés pour les moteurs

MoteurPWMAvancerReculer
Moteur 117GPIO 27GPIO 22
Moteur 225GPIO 24GPIO 23
Moteur 310GPIO 11GPIO 09
Moteur 412GPIO 07GPIO 08

GPIO utilisés pour les flèches

FlècheGPIO
Avancer16
Reculer19
Droite13
Gauche26

GPIO utilisés pour les capteurs

CapteurRéceptionEmission
IR 1GPIO 04 (echo) -
IR 2GPIO 18 (echo) -
UltrasonsGPIO 6 (echo)GPIO 5 (trigger)

Gérer les moteurs

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()

Gérer les flèches à LED

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()

Gérer le capteur à ultrasons

principe

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()

Les activités ...