
Robot Suiveur de Ligne 2008
Débuté par PZaf, janv. 03 2008 09:14
8 réponses à ce sujet
#1
Posté 03 janvier 2008 - 09:14
Bonsoir,
Venant d'inscrire notre suiveur de ligne pour Montpellier 2008 et continuant les tests, je me pose une question concernant la MLI.
Comment réalisez-vous votre MLI sur vos robots ?
Pour ma part, j'incrémente une variable de 0 à 10 à chaque interruption et suivant une valeur donnée, je mets les moteurs en fonctionnement ou pas.
Mieux que des mots, voici un exemple :
*****
if (MLI == 10)
{
MLI = 0;
}
if (Moteur_Command == Avance || Moteur_Command == DroiRap || Moteur_Command == GaucRap)
{
if (MLI_Mo > MLI)
{
Vit_Dr = 1;
Vit_Ga = 1;
}
else
{
Vit_Dr = 0;
Vit_Ga = 0;
}
}
if (Moteur_Command == Gauche)
{
if (MLI_Mo > MLI)
{
Vit_Dr = 1;
Vit_Ga = 0;
}
else
{
Vit_Dr = 0;
Vit_Ga = 0;
}
}
if (Moteur_Command == Droite)
{
if (MLI_Mo > MLI)
{
Vit_Ga = 1;
Vit_Dr = 0;
}
{
Vit_Ga = 0;
Vit_Dr = 0;
}
}
if (Moteur_Command == Arret)
{
Vit_Dr = 0;
Vit_Ga = 0;
}
MLI++;
****
Par contre je ne trouve pas que ce soit très efficace et je me demande même si ça ne me génère pas de l'inertie.
Merci de vos réponses.
Venant d'inscrire notre suiveur de ligne pour Montpellier 2008 et continuant les tests, je me pose une question concernant la MLI.
Comment réalisez-vous votre MLI sur vos robots ?
Pour ma part, j'incrémente une variable de 0 à 10 à chaque interruption et suivant une valeur donnée, je mets les moteurs en fonctionnement ou pas.
Mieux que des mots, voici un exemple :
*****
if (MLI == 10)
{
MLI = 0;
}
if (Moteur_Command == Avance || Moteur_Command == DroiRap || Moteur_Command == GaucRap)
{
if (MLI_Mo > MLI)
{
Vit_Dr = 1;
Vit_Ga = 1;
}
else
{
Vit_Dr = 0;
Vit_Ga = 0;
}
}
if (Moteur_Command == Gauche)
{
if (MLI_Mo > MLI)
{
Vit_Dr = 1;
Vit_Ga = 0;
}
else
{
Vit_Dr = 0;
Vit_Ga = 0;
}
}
if (Moteur_Command == Droite)
{
if (MLI_Mo > MLI)
{
Vit_Ga = 1;
Vit_Dr = 0;
}
{
Vit_Ga = 0;
Vit_Dr = 0;
}
}
if (Moteur_Command == Arret)
{
Vit_Dr = 0;
Vit_Ga = 0;
}
MLI++;
****
Par contre je ne trouve pas que ce soit très efficace et je me demande même si ça ne me génère pas de l'inertie.
Merci de vos réponses.
#2
Posté 03 janvier 2008 - 09:50
salut, perso, j'utilise sur les 18F la sortie CCP1, une sortie speciale pour les MLI. si tu veux, j'ai la boucle quelque pars. je peu te la retrouver.
Chaque jour est le premier du reste de ta vie.
#3
Posté 03 janvier 2008 - 09:59
Moi , j'utilise aussi les PWM , mais sur un 16F876
#4
Posté 03 janvier 2008 - 10:10
merci pour vos réponses.
JEF je suis intéressé par ta boucle (si tu la trouves rapidement).
Paterson, j'utilise un 876 aussi. Comment utilises-tu ton PWM ? Si tu as un exemple, ça m'intéresse.
JEF je suis intéressé par ta boucle (si tu la trouves rapidement).
Paterson, j'utilise un 876 aussi. Comment utilises-tu ton PWM ? Si tu as un exemple, ça m'intéresse.
#5
Posté 03 janvier 2008 - 10:32
Avec CSS , sa donne sa :
Ps : j'ai fait vite fait la , car je voulais pas sortir mon programme ( sa seras la surprise lors du concours ... )
http://z.oumnad.123.fr/Microcontroleurs/PIC16F876-77-V1.pdf
P46 , sa peux t'aider pour comprendre se timer , car tu ne travaille peut être pas avec CSS .
Sinon tu travaille avec quelle compilateur ?
void main() { ///////////////////////////////////////////: //A placer au démarrage ( hors des boucles . ) // //////////////////////////////////////////// setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); setup_timer_2(T2_DIV_BY_16,255,1); setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); ////////////////////////////////////// //Dans ton programme tu as juste sa //Ps : je lui demander une fréquence de 1 K avec un quartz de 20 M , donc verrifier ///////////////////////////////////// ccp_1=255; // pwm1 a 100 % ccp_2=50; //PWM2 a 50 / 255 éme }
Ps : j'ai fait vite fait la , car je voulais pas sortir mon programme ( sa seras la surprise lors du concours ... )
http://z.oumnad.123.fr/Microcontroleurs/PIC16F876-77-V1.pdf
P46 , sa peux t'aider pour comprendre se timer , car tu ne travaille peut être pas avec CSS .
Sinon tu travaille avec quelle compilateur ?
#6
Posté 04 janvier 2008 - 08:06
c'etait mon prof d'electronique qui l'avait trouver sur internet et elle m'a servit au LED IR de wild wild bot, donc ça marche impecable. je te l'amene ce soir.
Chaque jour est le premier du reste de ta vie.
#7
Posté 04 janvier 2008 - 10:29
Un MLI peut être réaliser logiciellement ou matériellement.
C'est à dire soit utiliser une boucle d'interruption incrémentant un compteur MLI++, soit utiliser une ressource matérielle interne qui fait la même chose pendant que le prog fait autre chose.
Certains PIC possèdent une ressource (certains 18 broches), d'autres 2 (28 broches et plus) d'autres encore 4 6 8, mais c'est une autre histoire.
La ressource interne doit être initialisée au début d'un prog pour définir, la période, les broches utilisées.
Puis pendant le prog, il suffit de mettre à jour le rapport cyclique quand on le veut.
voici un exemple écrit en C pour le compilateur CCS
// Partie Initialisation
Set_tris_C(0x00); // Lignes RC1 et RC2 en sortie
output_C(0x00); // Mettre les deux lignes RC1 et RC2 à 0
setup_timer_2(T2_DIV_BY_4, 127, 1); // Choisir la période du signal MLI
// et sa précision
set_pwm1_duty(0); // rapport cyclique à 0%
set_pwm2_duty(0) ; // rapport cyclique à 0%
setup_ccp1(CCP_PWM); // Configure CCP1 pour générer MLI
setup_ccp2(CCP_PWM); // Configure CCP2 pour générer MLI
//==============================================================
// Changement du rapport cyclique dans le programme
set_pwm1_duty(64); // rapport cyclique de 50% sur RC1
set_pwm2_duty(96); // rapport cyclique de 75% sur RC2
Amusez vous bien
C'est à dire soit utiliser une boucle d'interruption incrémentant un compteur MLI++, soit utiliser une ressource matérielle interne qui fait la même chose pendant que le prog fait autre chose.
Certains PIC possèdent une ressource (certains 18 broches), d'autres 2 (28 broches et plus) d'autres encore 4 6 8, mais c'est une autre histoire.
La ressource interne doit être initialisée au début d'un prog pour définir, la période, les broches utilisées.
Puis pendant le prog, il suffit de mettre à jour le rapport cyclique quand on le veut.
voici un exemple écrit en C pour le compilateur CCS
// Partie Initialisation
Set_tris_C(0x00); // Lignes RC1 et RC2 en sortie
output_C(0x00); // Mettre les deux lignes RC1 et RC2 à 0
setup_timer_2(T2_DIV_BY_4, 127, 1); // Choisir la période du signal MLI
// et sa précision
set_pwm1_duty(0); // rapport cyclique à 0%
set_pwm2_duty(0) ; // rapport cyclique à 0%
setup_ccp1(CCP_PWM); // Configure CCP1 pour générer MLI
setup_ccp2(CCP_PWM); // Configure CCP2 pour générer MLI
//==============================================================
// Changement du rapport cyclique dans le programme
set_pwm1_duty(64); // rapport cyclique de 50% sur RC1
set_pwm2_duty(96); // rapport cyclique de 75% sur RC2
Amusez vous bien

#8
Posté 04 janvier 2008 - 05:44
void init_pwm(void)
{
CCP1CON = 0b00001100; // mode pwm
PR2 = 128; // periode
CCPR1L = PR2 >> 1; // D = 50
T2CON = 0b00000100; // ON prescale = 1
}
{
CCP1CON = 0b00001100; // mode pwm
PR2 = 128; // periode
CCPR1L = PR2 >> 1; // D = 50
T2CON = 0b00000100; // ON prescale = 1
}
Chaque jour est le premier du reste de ta vie.
#9
Posté 05 janvier 2008 - 06:47
Merci pour toutes vos réponses.
Je vais analyser tout ça et reviendrais (certainement) vers vous pour d'autres questions
Je vais analyser tout ça et reviendrais (certainement) vers vous pour d'autres questions

1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users