PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ProBot128 - LabyrinthRoboter mit Odometrie



Chrisbyrinth
10.02.2014, 15:47
Hallo erstmal,
ich bin neu hier und habe gerade vor einen Probot 128 so zu programmieren, dass er auch einem Labyrinth findet. Dazu nutze ich C Control (die Software von Conrad) und den ProBot 128.

Nun kam mir der Gedanke ich würde doch gerne auf Nummer sicher gehen, fallls mein Roboter im Labyrinth gegen eine Wandfährt und den Befehlt "vorwärts" erhält, dass er merkt dass sich die Reifen nicht gedreht haben und somit (meine Vermutung) der Odometrie Counter nicht erhöht. Sprich fährt er gegen die Wand achte ich auf die Radumdrehungen und dann weiß der Roboter ob er gerade vor einer Wand steht oder sich wirklich bewegt. Problematisch für mich ist nur die Odometrie Verwendung. Ich kann es mir gerade nicht vorstellen, wie das genau gehen soll.

Das verrät mir meine Standard Bib:
"
void ENC_RIGHT_ISR(void)
{
int irqreq_r;
ENCODER_RIGHT_CNT++; //Increment counter right wheel
ODO_RIGHT++;
irqreq_r=Irq_GetCount(INT_6); //Interrupt Request Counter = 0
}

//---[ Interrupt service routine stimulus lef t wheel
void ENC_LEFT_ISR(void)
{
int irqreq_l;
ENCODER_LEFT_CNT++; //Increment counter left wheel
ODO_LEFT++;
irqreq_l=Irq_GetCount(INT_7); //Interrupt Request Counter = 0
}

//---[ Odometer Reset
void ODO_RESET(void)
{
ODO_LEFT=0;
ODO_RIGHT=0;
}

//---[ IR Encoder LED ON ]
void ENC_LED_ON(void)
{
Port_WriteBit(Encoder_IR,PORT_OFF); //PORT_OFF = IR -> Ein
}

//---[ IR Encoder LED OFF ]
void ENC_LED_OFF(void)
{
Port_WriteBit(Encoder_IR,PORT_ON);
}
"

So jetzt hatte ich versucht daraus was entnehmen zu können bin aber nicht recht schlau geworden. Dass ich meinen Programmabschnitt dazu mit ENC_LED_ON(); beginnen muss ist mir bewusst, allerdings verstehe ich nicht wie ich jetzt den Counter (vorgegebene Variable in der Standard Bib) auslesen kann.

void Forward(void) //vorwärts Routine

{
FLL_ON(); FLR_ON(); ENC_LED_ON();
ODO_RESET();
DRIVE(220, 220);
AbsDelay(700);
if( ODO_LEFT < 3 || ODO_RIGHT < 3) backward();
... danach noch irrelevanter teil vom forward() code.

Die if Abfrage in der Art funktioniert nicht. Vermutlich auch deswegen weil die ODO_LEFT, ODO_RIGHT in der Standard bib als WORD definiert sind. Aber ich denke ihr versteht was ich abfragen will. Ich möchte, dass falls der Motor seine 700ms gelaufen ist und sich mindestens ein Rad nicht drei Felder (bei der vierer Aufteilung) bewegt hat, soll der Roboter zurücksetzen.

Doch wie mache ich diese Abfrage richtig? Könnt ihr mir weiterhelfen ?

Ich hoffe ihr könnt mir weiterhelfen.

LG Chris