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.