Cours:TPS 2103 tp miniqv2
Révision datée du 17 mai 2016 à 08:28 par Bjacquot (discussion | contributions)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!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;
}
Utiliser ces fonctions pour que la trajectoire du robot soit un cercle
Comment parcourir le cercle dans le sens inverse ?
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)