RobotGEII Roue Codeuse
Sommaire
Roue Codeuse
I-Introduction :
Afin de connaitre la position des roues et de savoir le nombre de tours elles ont tournés nous avons utilise un codeur rotatif. C’est un type de capteurs permettant de délivrer des informations des deux roues en mesurant la rotation effectuée autour d’un axe. L'information de vitesse peut alors être traduite par la variation de la position en fonction du temps.
II-Fabrication de la roue :
Nous avons pris les mesures du moteur afin de fabriquer notre roue codeuse, puis on a utilise un logiciel de création Charly robot pour la fabriquer.
III-Composants utilisés :
Le composant TCUT 1300 nous permet de compter les numéros d’encoche parcouru et savoir le sens de rotation grace aux 2 phototransistors .
Suite à un problème au niveau du microprocesseur, on a décidé d'utiliser la carte Arduino pour programmer en utilisant les 6 ports pareils que précédemment. On a fabriqué la carte avec Eagle :
Voici la carte :
IV-Principe de fonctionnement :
En comptant le nombre d’encoches passés en utilisant les photo-transistors de TUCT1300 et en déterminant le sens de rotation des roues, on peut ensuite déterminer la vitesse de mouvement du robot et finalement savoir sa position par rapport au point de départ.
D'après le chronogramme, on voit qu'on peut déterminer le sens de rotation grâce aux états des deux photo-transistors. On incrémente ou décrémente le nombre d'encoches selon leur états.
Finalement, on peut essayer de coder pour déterminer la distance du mouvement effectuée pour chaque période de calcul. (Pour plus de détail sur le principe de calcul : http://manubatbat.free.fr/doc/positionning/node5.html
Code complet pour afficher les sens de rotations de deux roues:
#define Avt 0
#define Arr 1
int AIA=3;
int AIB=6;
int BIA=4;
int BIB=5;
int d,v;
void setup(){
pinMode(AIA, OUTPUT);
pinMode(AIB, OUTPUT);
pinMode(BIA, OUTPUT);
pinMode(BIB, OUTPUT);
maz();
Serial.begin(115200);
}
void maz()
{
digitalWrite( BIB, LOW );
digitalWrite( BIA, LOW );
digitalWrite( AIA, LOW );
digitalWrite( AIB, LOW );
delay(150);
}
void gch(int d,int v)
{
if (d==Avt){
digitalWrite(AIB, LOW);
analogWrite(AIA,v);
}
else if (d==Arr){
digitalWrite(AIB, HIGH);
analogWrite(AIA,255-v);
}
}
void drt(int d,int v)
{
if (d==Avt){
digitalWrite(BIB, HIGH);
analogWrite(BIA,255-v);
}
else if (d==Arr){
digitalWrite(BIB, LOW);
analogWrite(BIA,v);
}
}
void mgd(int d, int v)
{
drt(d,v);
gch(d,v);
}
void loop()
{
boolean isValidInput;
// draw a menu on the serial port
Serial.println( "-----------------------------" );
Serial.println( "MENU:" );
Serial.println( "1) Moteur A avant" );
Serial.println( "2) Moteur A arriere" );
Serial.println( "3) Moteur B avant" );
Serial.println( "4) Moteur B arriere" );
Serial.println( "5) Deux moteurs avant" );
Serial.println( "6) Deux moteurs arriere" );
Serial.println( "-----------------------------" );
do
{
byte c;
Serial.print( "?" );
while( !Serial.available() )
;
c = Serial.read();
switch( c )
{
case '1':
Serial.println( "Moteur A avant..." );
maz();
gch(Avt, 200);
isValidInput = true;
break;
case '2':
Serial.println( "Moteur A arriere..." );
maz();
gch(Arr,200);
isValidInput = true;
break;
case '3': // 1) Fast forward
Serial.println( "Moteur B avant..." );
maz();
drt(Avt,200);
isValidInput = true;
break;
case '4':
Serial.println( "Moteur B arriere...");
maz();
drt(Arr,200);
isValidInput = true;
break;
case '5':
Serial.println( "Deux moteurs avant...");
maz();
mgd(Avt, 200);
isValidInput = true;
break;
case '6':
Serial.println( "Deux moteurs arriere...");
maz();
mgd(Arr, 200);
isValidInput = true;
break;
default:
// wrong character! display the menu again!
isValidInput = false;
break;
}
}
while( isValidInput == true );
}
Ancien code pour compter le nombre d'encoches :
volatile long cptRoueD, cptRoueG;
void setup()
{
pinMode(13,OUTPUT);
attachInterrupt(1,codeurD,CHANGE);
attachInterrupt(0,codeurG,CHANGE);
Serial.begin(9600);
cptRoueD=0;
cptRoueG=0;
}
void codeurD()
{
uint8_t etat=PIND&0b00101000;
switch(etat){
case 0b00000000:
cptRoueD--;
break;
case 0b00101000:
cptRoueD--;
break;
case 0b00001000:
cptRoueD++;
break;
case 0b00100000:
cptRoueD++;
break;
}
}
void codeurG()
{
uint8_t etat=PIND&0b00010100;
switch(etat){
case 0b00000000:
cptRoueG--;
break;
case 0b00010000:
cptRoueG++;
break;
case 0b00000100:
cptRoueG++;
break;
case 0b00010100:
cptRoueG--;
break;
}
}
void loop()
{
delay(500);
Serial.print("Droite = ");
Serial.println(cptRoueD,DEC);
Serial.print("Gauche = ");
Serial.println(cptRoueG,DEC);
}