Cours:TPS 2103 tp evitementObstacles : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Annulation des modifications 11550 de Ech-01 (discussion))
(Annulation des modifications 11555 de Ech-01 (discussion))
(3 révisions intermédiaires par le même utilisateur non affichées)
(Aucune différence)

Version du 11 juin 2019 à 09:21

Il s’agit d’une page protégée.

Retour à la liste des Tps

Correction avec accès restreint

Gestion des moteurs

Dans un précédent TP, vous avez travaillé avec des Utilitaires de gestion des moteurs.

Pour information :

  • la marche avant du moteur gauche se fait en mettant à 0 PD6 tandis que la marche arrière consiste à mettre PD6 à 1
  • la marche avant du moteur droit se fait en mettant à 0 PE6 tandis que la marche arrière consiste à mettre PE6 à 1
  • les deux bits ci-dessus sont déjà configurés en sortie dans "void initMoteur()"

Question.jpg Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.

Gestion de l'infrarouge frontale

Principe

Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.

L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.

Récepteur

Il convient de configurer l'interruption de changement d'état associé à la broche PB0/PCINT0.

Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est PCINT0_vect.

On utilisera la led pour tester la bonne configuration de l'interruption (cf tp précédent).

Question.jpg A l'aide de la documentation atmel, pages 91, faire en sorte que la led s'allume à chaque réception

  • on utilisera la télécommande pour émettre un signal
  • on peut allumer la led dans l'interruption
  • l'éteindre au bout d'un certain temps dans la boucle principale
#include ....
volatile uint8_t flag=0;

ISR(PCINT0_vect)
{

}

void main()
{
  // configuration de l'interruption

  while(1)
  {
  }
}


Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.

Question.jpg Apporter les modifications nécessaires

Émetteur

Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :

Position Patte Timer
Droite PB4 ----
Gauche PC7 OC4A

Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0.

On rappelle que l'on aura besoin de code à travers une interruption pour basculer PB4 et PC7 puisqu'ils ne sont reliés à aucun OC0X.

émetteurs et Timer0

La comparaison avec le timer 0

Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.

Question.jpg Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz


Question.jpg Ajouter la configuration du timer a votre programme avec un sous-programme :

void setTIMER0_interrupt_ctc()
{
  // set PB4 and PC7 as output

  // choix du prédiviseur

  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!

  // valeur de OCR0A

  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) 
  
}

Question.jpg Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale "volatile uint8_t left;" qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :

volatile uint8_t left=0;
ISR(TIMER0_COMPA_vect)
{
  if (left)
    // émettre à gauche
  else
   //.....?????

}

A ce point, il faut bien comprendre ce que l'on est capable de faire :

  • un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable "left").
  • par conséquent l'interruption "ISR(PCINT0_vect)" comptera toujours les éventuels échos.
  • si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit OCIE0A du registre TIMSK0.

Émission droite/gauche

Pour commencer on utilisera les primitives "_delay_us()" pour attendre quelques microsecondes.

  • left <- 0
  • count <- 0
  • Répéter 20 fois :
    • Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison
    • Arrêter d'émettre : on coupe l'émission pendant 600 us
  • Lire valeur du compteur de réception.


On doit faire la même chose avec l'émission à gauche.

  • left <- 1
  • count <- 0
  • Répéter 20 fois :
    • Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison
    • Arrêter d'émettre : on coupe l'émission pendant 600 us
  • Lire valeur du compteur de réception.

Question.jpg Écrire un programme qui :

  • éteint la led lorsqu'il n'y a pas d'obstacles
  • allume en vert si obstacle à droite
  • allume en bleu si obstacle à gauche
  • allume en rouge si obstacle à droite et à gauche

Remarque :

Évitement d'obstacles

Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.

Question.jpg Écrire un programme qui répond au cahier des charges suivant :

  • Boucler
    • le robot avance en ligne droite
    • s'il y a un obstacle à droite (count >20 par ex) alors
      • reculer
      • tourner sur place vers la gauche
      • reprendre la ligne droite en marche avant
    • s'il y a un obstacle à gauche (count >20 par ex) alors
      • reculer
      • tourner sur place vers la droite
      • reprendre la ligne droite en marche avant