====== Raspberry : utiliser la carte d'extension Motor Shield de SB Components ======
===== Ressources =====
* Site de SB Component sur le Motot Shield : http://sb-components.co.uk/motor-shield.html
* schéma de la carte Motor Shield : {{:isn:motor_shield_schematic.pdf|}}
* Information sur le Pont-H L293D : https://wiki.mchobby.be/index.php?title=Pont-H_L293D
===== Présentation =====
La carte d'extension **Motor Shield** pour Raspberry Pi permet de contrôler :
* 4 **moteurs à courant continu** (DC) ou 2 **moteurs pas à pas** en utilisant le **Pont-H** de puissance moyenne (600mA) L293D qui a les caractéristiques et les fonctionnalités suivantes :
* fournir un **courant** de sortie jusqu'à **1A** et une tension maximale de **24 V**,
* réaliser **l'inversion** de la polarisation aux bornes des moteurs,
* contrôler la **vitesse** du moteur à l'aide d'un **signal PWM**.
* 2 **capteurs infrarouge** (IR),
* un capteur à **ultrasons**.
{{ :isn:motorshield_01.png?nolink |}}
==== Branchement des moteurs ====
{{ :isn:motorshield_02.png?nolink |}}
==== GPIO utilisés pour les moteurs====
^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|
==== GPIO utilisés pour les flèches====
^Flèche^GPIO^
|Avancer|16|
|Reculer|19|
|Droite|13|
|Gauche|26|
==== GPIO utilisés pour les capteurs====
^Capteur^Réception^Emission^
|IR 1|GPIO 04 (echo)| - |
|IR 2|GPIO 18 (echo)| - |
|Ultrasons|GPIO 6 (echo)|GPIO 5 (trigger)|
===== Gérer les moteurs =====
La **gestion** d'un moteur nécessite :
* de créer un **objet PWM** pour gérer la puissance du moteur
* d'**utiliser conjointement** les deux GPIO pour définir le **sens de rotation** du moteur.
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 :
* de **définir** les broches concernées en **sortie**,
* de mettre la sortie à l'**état haut** pour activer l'éclairage.
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.
{{ :isn:anim_ultrason.gif?nolink |}}
Pour en savoir plus :
* https://www.framboise314.fr/mesure-de-distance-par-ultrasons-avec-le-raspberry-pi/
* http://espace-raspberry-francais.fr/Composants/Mesure-de-distance-avec-HC-SR04-Raspberry-Francais/
Pour **mesurer** la distance d'un obstacle on procède de la manière suivante :
* on envoie sur l'entrée **Trig** du capteur HC-SR04 un train d'onde pendant un très bref instant de 10 micro secondes (0.00001 s),
* DES QUE LE TRAIN EST EMIS, l'entrée **Echo** délivre une tensions de 5 v
* dès que l'entrée **Echo** détecte le retour du train d'onde, l'entrée n'est plus à 5V.
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 ... ====
[[.:accueil|Je reviens à la liste des activités.]]