Apprendre autrement.... Robot Opto-guidé
Chapitre 1. La problématique du robot opto-guidé
Chapitre 2. La mécanique
Chapitre 3. L'électronique
Chapitre 4. Les algorithmes de suivi de ligne et la programmation
4.1. Le suivi de ligne en tout-ou-rien
4.2. Le suivi de ligne en MLI simple
4.3. Le suivi de ligne en MLI double
4.4. Le suivi de ligne en quatre quadrants
Chapitre 5. Conclusion
Page d'accueil Table des matières Niveau supérieur Page précédente Bas de la page Page suivante

4.4. Le suivi de ligne en quatre quadrants

L'utilisation d'un étage de puissance par pont en H permet d'inverser le sens de rotation des roues
et donc d'augmenter encore les possibilités de suivi de ligne.

Exemple de programme C - Commande 4 Quadrants

 

#pragma symbols code debug objectextend optimize(4)
#include <reg51.h>
#include <stdio.h>
// robotaa2.c
// Amélioration de la correction trajectoire
// en inversant le sens de rotation des moteurs

//commandes L298 4 Quadrants 8capteurs HOA2498

sbit inGplus=P3^1; sbit inGmoins=P3^0;
sbit inDplus=P3^4; sbit inDmoins=P3^3;

sbit LED=P3^5;

//variables
unsigned char mem1;   
unsigned char mem2;
unsigned char mem3;   
unsigned char mem4;
unsigned char mem5;   
unsigned char mem6;
unsigned char sensG;   
unsigned char sensD;       
unsigned char capt;       
unsigned char ecart;   
unsigned int i;   
unsigned long j;

// Procédures d'interruptions

void MLID (void);        //timer0 pour le moteurD
void MLIG (void);        //timer1 pour le moteurG
void STOP (void);        // Int0

//Prog principal

void main (void)
{
  P1=0xFF;   
  TMOD=0x22;              //timer 1 en mode 2, timer 0 mode 8b horloge interne
  ET0=1;ET1=1;EX0=1;IT0=0;PX0=1;EA=1; //INITs interruptions
  TR0=1;TR1=1;

//Programme de suivi de ligne ***************************************
  do   
  {
     P1 = 0xFF;
     capt = P1;
     switch (capt)    // codage de la position
     {
        case 0x7F : sensD=0;sensG=1;mem2 = 0xF0; mem4 = 0x80;LED=0;break;   
        case 0x3F : sensD=0;sensG=1;mem2 = 0xF0; mem4 = 0x40;LED=0;break;   
        case 0xBF : sensD=0;sensG=1;mem2 = 0xF0; mem4 = 0x20;LED=0;break;   
        case 0x9F : sensD=1;sensG=1;mem2 = 0xF0; mem4 = 0x00;LED=1;break;   
        case 0xDF : sensD=1;sensG=1;mem2 = 0xF0; mem4 = 0x20;LED=1;break;   
        case 0xCF : sensD=1;sensG=1;mem2 = 0xF0; mem4 = 0x40;LED=1;break;   
        case 0xEF : sensD=1;sensG=1;mem2 = 0xF0; mem4 = 0x80;LED=1;break;   
        case 0xE7 : sensD=1;sensG=1;mem2 = 0xF0; mem4 = 0xF0;LED=1;break;  
        case 0xF7 : sensD=1;sensG=1;mem2 = 0x80; mem4 = 0xF0;LED=1;break;   
        case 0xF3 : sensD=1;sensG=1;mem2 = 0x40; mem4 = 0xF0;LED=1;break;
        case 0xFB : sensD=1;sensG=1;mem2 = 0x20; mem4 = 0xF0;LED=1;break;   
        case 0xF9 : sensD=1;sensG=1;mem2 = 0x00; mem4 = 0xF0;LED=1;break;   
        case 0xFD : sensD=1;sensG=0;mem2 = 0x20; mem4 = 0xF0;LED=0;break;   
        case 0xFC : sensD=1;sensG=0;mem2 = 0x40; mem4 = 0xF0;LED=0;break;   
        case 0xFE : sensD=1;sensG=0;mem2 = 0x80; mem4 = 0xF0;LED=0;break;
      }
      mem1=(255-mem2);
      mem3=(255-mem4);
    }
    while(1);
  }
// *************************************************************************
void MLID (void) interrupt 1    //Mli moteur D
{
    if(sensD==1)
        {       
            inDmoins=0;
            inDplus=!inDplus;
            if (inDplus==0) TL0=mem4;   
            else TL0=mem3;
        }
    else
        {
            inDplus=0;
            inDmoins=!inDmoins;
            if (inDmoins==0) TL0=mem4;   
            else TL0=mem3;
        }
}
// **************************************************************************
void MLIG (void) interrupt 3    //Mli moteur G
{
    if(sensG==1)
        {       
            inGmoins=0;
            inGplus=!inGplus;
            if (inGplus==0) TL1=mem2;   
            else TL1=mem1;
        }
    else
        {
            inGplus=0;
            inGmoins=!inGmoins;
            if (inGmoins==0) TL1=mem2;   
            else TL1=mem1;
        }
}
// ****************************************************
void STOP (void) interrupt 0    //Arret
{
    inGplus = 0; inGmoins = 0;
    inDplus = 0; inDmoins = 0;
    TR0=0;
    ET0=0;
    TR1=0;
    ET1=0;
    for (;;);
}

Page d'accueil Table des matières Niveau supérieur Page précédente Haut de la page Page suivante