TP détection d`obstacles corrigé

Transcription

TP détection d`obstacles corrigé
DÉTECTION D’OBSTACLES
Chronogrammes illustrant le fonctionnement du télémètre :
ROBOT OPTOGUIDÉ ET DÉTECTION D’OBSTACLES
TOP_DEC
A. OBJECTIFS
-
page 1 / 4
PROGRAMMATION PAR ORDINOGRAMME (FLOWCODE) (CORRIGÉ)
Programmer un PIC par ordinogramme pour réaliser la fonction « détection d’obstacle » d’un
Robot Optoguidé.
Réaliser un ordinogramme utilisant la fonction « suivi de ligne » et la fonction « détection
d’obstacle ».
Vérifier expérimentalement la validité des programmations.
t
Émission
B. DOCUMENTS NÉCESSAIRES
-
t
Cours : « Implantation d’un algorithme ».
Cours : « Mise en oeuvre d’un microcontrôleur PIC ».
Réception
C. MATÉRIEL UTILISÉ
-
Ordinateur équipé du logiciel Flowcode et du programmateur ICD2.
Un Robot Optoguidé.
t
D. PRÉSENTATION
TMesure
I.
PRÉSENTATION DU SONAR
Le sonar utilisé est équipé d’un émetteur et d’un récepteur à ultrason. Si on applique un front
descendant sur son entrée TOP_DEC alors le sonar émet une salve d’ultrason à 40kHz. Au même
instant, un signal de sortie nommé TMesure passe au niveau haut.
Lorsqu’un obstacle se trouve devant le sonar, les ultrasons sont réfléchis et sont détectés par le
récepteur, ce qui provoque la remise à zéro du signal de sortie TMesure. La durée au niveau haut
de TMesure dépend donc de la distance entre le sonar et l’obstacle.
Obstacle
Distance
Entrée
TOP_DEC
Durée fonction de la
distance
t
Calculs préliminaires :
?
Sachant que la vitesse du son est d’environ 346m/s, montrer que la variable DURÉE
peut être exprimée sous la forme :
DURÉE = DISTANCE / 173
Émetteur
2 x DISTANCE = Vitesse x DURÉE
DURÉE = 2 x DISTANCE / Vitesse
DURÉE = DISTANCE / 173
Sortie
TMesure
Récepteur
?
On se propose de détecter les obstacles avec une précision de 1cm. Calculer la durée
correspondant à une distance Robot-Obstacle de 1cm.
DURÉE (1cm) = 0,01 / 173 = 57,8µs
DÉTECTION D’OBSTACLES
II.
ENTRÉES SORTIES DU PIC16F877A
Ordinogramme Principal :
Le composant qui contrôle le robot est un microcontrôleur PIC16F877A. Trois PORTS sont
partiellement utilisés pour commander la vitesse de rotation des deux moteurs, recevoir les
informations provenant des capteurs et communiquer avec le télémètre :
-
page 2 / 4
PROGRAMMATION PAR ORDINOGRAMME (FLOWCODE) (CORRIGÉ)
DEBUT
Les bits B5 à B0 (PORTB) sont les sorties de commande de vitesse du moteur gauche,
Les bits D5 à D0 (PORTD) sont les sorties de commande de vitesse du moteur droit,
Les bits C7 à C2 (PORTC) sont les entrées qui reçoivent respectivement l’état logique des
capteurs CAPT6 à CAPT1.
Le bit C1 (PORTC) est la sortie de validation des capteurs optiques.
Le bit D6 (PORTD) est la sortie TOP_DEC permettant de déclancher une mesure du télémètre.
Ce signal est actif sur front descendant.
Le bit C0 (PORTC) est l’entrée TMesure qui provient du télémètre. Sa durée au niveau haut est
proportionnelle à la distance Robot-Obstacle.
Initialisation
DISTANCE=50
TMesure =
Oui
0
E. TRAVAIL DEMANDÉ
I.
Non
ÉVITEMENT D’OBSTACLES
L’ordinogramme à réaliser doit permettre au Robot d’aller tout droit. Si un obstacle est détecté,
le Robot doit tourner à droite.
On se propose d’utiliser la méthode suivante :
De façon périodique1, on génère une impulsion au niveau bas sur TOP_DEC (donc un front
descendant). On attend une durée qui correspond à la distance Robot-Obstacle minimale
désirée. Après cette durée, on vient lire le niveau logique sur le signal TMesure.
Dans l’ordinogramme principal effectué en boucle, on teste le niveau logique du signal
TMesure :
•
Si TMesure n’est pas au niveau bas, c’est que l’onde ultrasonore n’a pas
rencontrée d’obstacle. Dans ce cas le Robot va tout droit.
•
Si le signal TMesure est au niveau bas, c’est que l’onde ultrasonore a rencontrée
un obstacle. Dans ce cas le Robot tourne à droite.
?
?
Réalisation de l’ordinogramme principal
Compléter l’ordinogramme principal suivant afin qu’il réponde à la description cidessus.
Avec le logiciel Flowcode, ouvrir le fichier evitement_eleve.fcf et compléter son
ordinogramme principal.
PORTD = 22
PORTB = 40
PORTB = 38
FIN
(1) L’ordinogramme de gestion du sonar est effectué périodiquement et indépendamment de l’ordinogramme principal.
On utilise le timer 0 (TMR0) intégré dans le PIC16F877A pour réaliser cette période d’exécution.
Lors de l’exécution de l’ordinogramme de gestion du sonar, l’ordinogramme principal est interrompu puis reprend son
cours. En informatique, ce phénomène est appelé interruption.
1.
PORTD = 40
2.
Étude de l’ordinogramme de traitement des interruptions
Le TIMER0 du PIC16F877A permet de générer des interruptions avec une fréquence réglable.
La fréquence minimale de ces interruptions est de 76,2939Hz ce qui correspond à une période de
13,1ms.
Pour fonctionner correctement, le sonar ne doit pas être déclenché avec une période inférieure à
20ms.
L’ordinogramme suivant permet donc de lancer la gestion du sonar toutes les deux interruptions
c’est-à-dire toute les 26,2ms.
?
Traduire l’ordinogramme suivant en langage algorithmique.
DÉTECTION D’OBSTACLES
PROGRAMMATION PAR ORDINOGRAMME (FLOWCODE) (CORRIGÉ)
Pour réaliser les temporisations en µs, on utilise la commande en langage C : delay_us(d);
Avec d le nombre de µs compris entre 1 et 255. Exemple pour une temporisation de 10µs :
Ordinogramme de traitement des interruptions :
DEBUT
Boucle = 1
Remarque : La variable BOUCLE est
initialement à 0.
Langage algorithmique :
Non
?
Début
Oui
Gestion_sonar
BOUCLE = BOUCLE +1
BOUCLE = 0
3.
Si BOUCLE = 1
Faire macro Gestion_sonar
Faire BOUCLE=0
Sinon
Faire BOUCLE=BOUCLE+1
Fin Si
Fin
FIN
Réalisation de l’ordinogramme de gestion du sonar
L’ordinogramme de gestion du sonar doit réaliser les tâches suivantes :
-
Générer une impulsion au niveau bas sur TOP_DEC.
Attendre une durée correspondante à : DURÉE = DISTANCE x DURÉE(1cm)
Lire l’état de TMesure.
La variable DISTANCE est initialisée au début de l’ordinogramme principal. Elle représente
la distance Robot-Obstacle en centimètres. Afin de ne jamais perdre la valeur initiale de cette
variable, on utilise une autre variable A pour réaliser la boucle d’attente.
L’état de TMesure est conservé dans une variable TMesure afin d’être testée dans
l’ordinogramme principale.
Algorithme de gestion du sonar :
DÉBUT
Faire TOP_DEC = 0
Faire TEMPO de 10µs
Faire TOP_DEC = 1
Faire A = DISTANCE
Tant que A<>0
Faire TEMPO correspondante à 1cm
Faire A = A – 1
Fin Tant que
Faire lire TMesure
FIN
page 3 / 4
delay_us(10);
?
Traduire l’algorithme de gestion du sonar en ordinogramme :
DÉTECTION D’OBSTACLES
?
?
?
PROGRAMMATION PAR ORDINOGRAMME (FLOWCODE) (CORRIGÉ)
Avec le logiciel Flowcode, éditer et compléter la macro Gestion_sonar qui est appelée
par l’ordinogramme de traitement des interruptions étudié précédemment.
Compiler et tester votre programme sur le Robot.
Renouveler les essais en modifiant la variable DISTANCE : DISTANCE doit être
comprise entre 1 et 255.
II.
SUIVI DE LIGNE AVEC DÉTECTION D’OBSTACLES
L’ordinogramme à réaliser doit permettre au Robot de suivre une ligne noire sur fond blanc. Si
un obstacle est détecté, le Robot doit s’arrêter.
?
Compléter l’ordinogramme suivant.
DEBUT
?
Enregistrer votre travail sous le nom de suivi_sonar.fcf et modifier l’ordinogramme
principal :
Pour réaliser la macro SUIVI_LIGNE :
placer un composant macro, éditer ses propriétés et cliquer sur Nouvelle Macro…
Entrer son nom (SUIVI_LIGNE), cliquer sur OK puis sur OK et Éditer.
Avec l’explorateur Windows, double cliquer sur votre fichier Flowcode de suivi de ligne
réalisé lors du TP précédent. Ceci a pour effet d’ouvrir une nouvelle fenêtre Flowcode
contenant votre ordinogramme de suivi de ligne. Sélectionner tout et copier-coller le
contenu dans votre nouvelle macro SUIVI_LIGNE.
Attention, Le PORTD est partagé entre la commande du moteur droit (D0 à D5) et le
signal TOP_DEC (D6). Afin de ne pas générer un déclenchement du télémètre à chaque
changement de vitesse du moteur droit, il faut utiliser un masque sur les bits D0 à D5 lors
de chaque écriture de vitesse.
?
?
?
Oui
0
PORTD = STOP
SUIVI_LIGNE
Que se passe t-il si un obstacle est détecté alors que le Robot se trouve à l’extérieur du
tracé ?
Proposer une solution afin de remédier à ce problème.
Dans la macro SUIVI_LIGNE, il ne faut pas écrire directement les valeurs pour les vitesses des
moteurs mais passer par des variables intermédiaires pour les mémoriser. Par exemple :
DISTANCE=50
Non
Compiler et tester votre programme avec le Robot sur la piste.
Il ne redémarre plus.
Initialisation
TMesure =
page 4 / 4
PORTB = STOP
MOTEUR_DROIT=63
MOTEUR_GAUCHE=40
PORTB= MOTEUR_GAUCHE
PORTD= MOTEUR_DROIT
Pour le cas où le Robot se trouve tout dans le blanc, il faut réécrire les dernières valeurs
mémorisées :
PORTB= MOTEUR_GAUCHE
PORTD= MOTEUR_DROIT
FIN
?
Apporter les modifications à votre fichier, compiler et tester votre programme avec le
Robot sur la piste.