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

De troyesGEII
Aller à : navigation, rechercher
(Annulation des modifications 11593 de Penant (discussion))
Ligne 1 : Ligne 1 :
 
+
<accesscontrol>Acces:Prof</accesscontrol>
  
 
[[Cours:TPs_2103|{{Rouge|<big>'''Retour à la liste des Tps'''</big>}}]]
 
[[Cours:TPs_2103|{{Rouge|<big>'''Retour à la liste des Tps'''</big>}}]]

Version du 14 juin 2019 à 15:42

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

Retour à la liste des Tps

Les corrections sont en accès restreint

ArduinoPinout.png


UNO sans arduino : par commodité, nous utiliserons une carte arduino UNO pour programmer un ATMEGA328p.

Cependant, nous n'utiliserons ni la librairie arduino, ni le logiciel dédié.

La programmation de la carte sera réalisée sur l'IDE ECLIPSE et nous utiliserons la librairie avr-libc (avr/io.h, util/delay.h ...).


L'objectif est ici de faire une mesure de distance et d'afficher cette mesure à l'aide d'un curseur qui sera positionné sur un servomoteur.


C'est parti !

Usart atmega328.png

Pour simplifier débogage et mise au point, vous allez configurer la liaison série avec les caractéristiques suivantes :

  • 8 bits de données
  • pas de parité
  • 1 bit de stop
  • 9600 bauds

Vous vous servirez :

Question.jpg En utilisant les fonctions uart_putchar et uart_init, écrire un programme qui envoie en boucle "alive"

void uart_putchar(char c)
{
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
    UDR0 = c;
}

void uart_init()
{
  // a completer
}

int main()
{
  ....
  while(1)
  {
     ....
  }
}

HC-SR04

Vous pouvez commencer par lire la documentation du module.

Trigger

On souhaite faire une nouvelle mesure toutes les 100ms.

Pour effectuer cette action répétitive, il convient d'utiliser un timer. Ce sera le timer1.

Documentation simple du Timer 1 (16 bits)
La comparaison avec le Timer 1 (16 bits)

Question.jpg Configurez ce timer en mode CTC pour générer une interruption de comparaison toutes les 100ms

  • Attention à bien
    • autoriser l'interruption de comparaison : TIMSK1|=1<<OCIE1A
    • autoriser globalement les interruptions : sei()
    • la fonction d'interruption sera définie par : ISR(TIMER1_COMPA_vect)
  • Utiliser la led de la carte arduino (PB5) pour vérifier le bon fonctionnement

Question.jpg Modifier votre interruption pour générer le signal Trigger en respectant la durée indiquée dans la datasheet

Remarque : Un oscilloscope sera nécessaire pour vérifier la forme du signal

Echo

Bien, nous pouvons maintenant nous intéresser au signal echo, dont il vous faudra mesurer la durée.

Donc .... un autre timer ! Ce sera le timer2.

On souhaite avoir une précision au cm près :

sachant que t(uS)/58 = d(cm), chaque 58µs correspond donc à 1cm.

Question.jpg Configurer ce timer pour qu'il déborde toutes les 58µs, et incrémente une variable distance à chaque interruption de débordement

On utilisera la broche INT0 pour le signal echo.

Question.jpg Écrire un programme qui :

  • lance le timer1
  • répète
    • attendre que echo=1
    • lancer timer2
    • attendre que echo=0
    • arrêter timer2
    • envoie la distance sur la liaison série
    • remettre la distance à 0
    • remettre le timer à 0

Visualisation de la distance

Entre en jeu le servomoteur et sa mli .... et donc le dernier timer disponible : timer0 ! TiemposServo

Test du servo

Question.jpg Configurez le timer0 pour générer une MLI sur OCR0A ou OCR0B au choix

  • la fréquence de MLI a assez peu d'importance
  • on souhaite juste un déplacement du servomoteur entre 2 positions

Couplage avec mesure de distance

Question.jpg Faire en sorte que la position du servomoteur indique la distance mesurée par le capteur ultrason