Cours:TPS 2103 tp miniqv2

De troyesGEII
Aller à : navigation, rechercher

Retour à la liste des Tps

Éléments de correction

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!Attention à bien poser le robot au sol lors de tout déplacement !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

moteur !

Cette partie ayant été étudiée en TD, on partira du code suivant :

#include <avr/io.h>
#include <util/delay.h>

// prototype des fonctions
void initMoteur();
inline void setVitesse (int8_t, int8_t) __attribute__((always_inline));
inline void setMoteurG (int8_t) __attribute__((always_inline));
inline void setMoteurD (int8_t) __attribute__((always_inline));

#define topPWM 100    // la vitesse des moteurs varie de -topPWM à topPWM

int main()
{
	initMoteur();
	while(1)
	{
	}
}

void initMoteur()
{
	DDRD |= (1<<PD7) | (1<<PD6);
	DDRE |= 1<<PE6;
	DDRC |= 1<<PC6;
	TCCR4B |= (1<<PWM4X)                               // inverse les sortie OCRxA et OCRxA/
		 |(1<<CS42)|(1<<CS41)|1<<CS40;             // prédiviseur
	TCCR4A |= (1<<PWM4A) | (1<<COM4A0);                // PWM sur COM4A/
	TCCR4C |= (1<<PWM4D) | (1<<COM4D0) | (1<<COM4D1);  // PWM sur COM4D
	TC4H=0;
	OCR4C=topPWM;                                      // valeur max PWM -> fmli = fq / (topPWM * prediv )
}

void setVitesse(int8_t vG, int8_t vD)
{
	setMoteurD(vD);
	setMoteurG(vG);
}

void setMoteurG(int8_t vit)
{
	if (vit<0)
	{
		vit = -vit;
		PORTD |= (1<<PD6);
	}
	else PORTD &=~ (1<<PD6);
	if (vit>topPWM) vit=topPWM;
	OCR4A = vit;
}

void setMoteurD(int8_t vit)
{
	if (vit<0)
	{
		vit = -vit;
		PORTE |= (1<<PE6);
	}
	else PORTE &=~ (1<<PE6);
	if (vit>topPWM) vit=topPWM;
	OCR4D = vit;
}

Question.jpg Utiliser ces fonctions pour que la trajectoire du robot soit un cercle

Question.jpg Comment parcourir le cercle dans le sens inverse ?

Question.jpg Comment faire varier le rayon du cercle ?


light tracking robot

2 capteurs de lumière sont positionnés sur le robot. Ce sont des LDR (résistances variant en fonction de l'intensité lumineuse) qui sont câblés en pont diviseur comme indiqué sur la figure ci-contre.

Les informations nécessaires à la lecture de ce capteur sont :

  • entrée analogique AN0
  • valeur environ 400 si la lumière est dans l'axe
  • valeur ?? augmente/diminue ?? si elle est à droite du robot
  • tension de référence du CAN : AVCC

Nous souhaitons faire un robot qui suit une source lumineuse. Pour cela, la vitesse des roues (plus exactement la vitesse de rotation du robot) doit dépendre de la valeur renvoyée par l'entrée analogique AN0.

On aura donc :

  • vt : vitesse de translation (ex 20)
  • wr : vitesse de rotation
  • vitMoteurD = vt + wr
  • vitMoteurG = vt - wr
  • wr = f(AN0)

Question.jpg Ecrire un programme permettant de réaliser ce comportement.