ölgötz
09.05.2006, 21:28
Moinsen zusammen,
ich hab' ein Problem mit der Odometrie-Funktion "encoder" aus der erweiterten asuro.c, wie sie hier herunterzuladen ist. Ich hab' mehrere asuros da (für ein Praktikum) und will die Odometrie einsetzen.
Aber weil von meinen Kleinen kaum einer eine gerade Linie fahren will, hab' ich mir jetzt mal ein kleines Progrämmchen geschrieben, das mir über PrintInt die mit encoder(LEFT) und encoder(RIGHT) abgefragten Werte ausgibt.
Dabei ist mir aufgefallen, dass nur bei einigen meiner asuros die Zähler stehen bleiben, wenn auch die Räder still stehen, bei den meisten laufen die Zähler einfach weiter, ich hab' den Eindruck, es passiert immer dann, wenn das Zahnrad genau auf dem Hell/Dunkel-Übergang vor der Lichtschranke zum stehen kommt, aber weil die Bauteile der Schranke und der Abstand zwischen Scheibe und Sender/Empfänger ja relativ gross sind, lässt sich das nicht so genau beurteilen.
Jetzt also drei bis vier Fragen an euch:
1. Hilft es etwas, die Aufkleber mit den 12 Hell/Dunkel-Segmenten gegen die mit 8 zu tauschen ?
2. Hilft es, den Fotottransistor und die LED abzuschirmen, ich hab' das gerade probeweise gemacht, aber hatte den Eindruck, dass es keinen Effekt hatte, im Dunklen rennen die Zähler ja auch manchmal einfach weiter ?
3. Weil ich mich bisher noch nicht in den Assembler des ATM eingearbeitet habe - kann mir jemand hier kurz erklären, was in der Interrupt-Routine der (erweiterten) asuro.c eigentlich passiert ?
Oder mache ich 4. noch irgend was anderes völlig verkehrt ?
/************************************************** *****************************
*
* Asuro IR-Detektor Testprogramm
*
* Es sind die Versionen der asuro.c und der asuro.h zu verwenden, wie sie bei
* https://www.roboternetz.de/phpBB2/viewtopic.php?t=11114
* herunterzuladen sind
************************************************** ***************************/
#include "asuro.h"
#include <stdlib.h>
#define avgspeed 120
void PrintStr(unsigned char *data) {
unsigned char i = 0;
while(data[i++]!=0x00);
SerWrite(data,i);
}
int main(void)
{
int el,er,diff,run = 0,sw = 0;
PrintStr("Programm ENCODERTEST\r\n");
Init();
Encoder_Init();
MotorDir(FWD,FWD);
MotorSpeed(0,0);
while(1) {
sw = PollSwitch();
if ((sw>0)&(run==0)) run=1;
if ((sw>0)&(run!=0)) run=0;
el = encoder[LEFT];
er = encoder[RIGHT];
diff = el - er;
if (run!=0) MotorSpeed(avgspeed-diff,avgspeed+diff); else MotorSpeed(0,0);
PrintInt(el);
PrintStr(" | ");
PrintInt(er);
PrintStr(" | ");
PrintInt(diff);
PrintStr(" | ");
PrintInt(run);
PrintStr("\r\n");
}
return 0;
}
Grüsse vom ölgötz
ich hab' ein Problem mit der Odometrie-Funktion "encoder" aus der erweiterten asuro.c, wie sie hier herunterzuladen ist. Ich hab' mehrere asuros da (für ein Praktikum) und will die Odometrie einsetzen.
Aber weil von meinen Kleinen kaum einer eine gerade Linie fahren will, hab' ich mir jetzt mal ein kleines Progrämmchen geschrieben, das mir über PrintInt die mit encoder(LEFT) und encoder(RIGHT) abgefragten Werte ausgibt.
Dabei ist mir aufgefallen, dass nur bei einigen meiner asuros die Zähler stehen bleiben, wenn auch die Räder still stehen, bei den meisten laufen die Zähler einfach weiter, ich hab' den Eindruck, es passiert immer dann, wenn das Zahnrad genau auf dem Hell/Dunkel-Übergang vor der Lichtschranke zum stehen kommt, aber weil die Bauteile der Schranke und der Abstand zwischen Scheibe und Sender/Empfänger ja relativ gross sind, lässt sich das nicht so genau beurteilen.
Jetzt also drei bis vier Fragen an euch:
1. Hilft es etwas, die Aufkleber mit den 12 Hell/Dunkel-Segmenten gegen die mit 8 zu tauschen ?
2. Hilft es, den Fotottransistor und die LED abzuschirmen, ich hab' das gerade probeweise gemacht, aber hatte den Eindruck, dass es keinen Effekt hatte, im Dunklen rennen die Zähler ja auch manchmal einfach weiter ?
3. Weil ich mich bisher noch nicht in den Assembler des ATM eingearbeitet habe - kann mir jemand hier kurz erklären, was in der Interrupt-Routine der (erweiterten) asuro.c eigentlich passiert ?
Oder mache ich 4. noch irgend was anderes völlig verkehrt ?
/************************************************** *****************************
*
* Asuro IR-Detektor Testprogramm
*
* Es sind die Versionen der asuro.c und der asuro.h zu verwenden, wie sie bei
* https://www.roboternetz.de/phpBB2/viewtopic.php?t=11114
* herunterzuladen sind
************************************************** ***************************/
#include "asuro.h"
#include <stdlib.h>
#define avgspeed 120
void PrintStr(unsigned char *data) {
unsigned char i = 0;
while(data[i++]!=0x00);
SerWrite(data,i);
}
int main(void)
{
int el,er,diff,run = 0,sw = 0;
PrintStr("Programm ENCODERTEST\r\n");
Init();
Encoder_Init();
MotorDir(FWD,FWD);
MotorSpeed(0,0);
while(1) {
sw = PollSwitch();
if ((sw>0)&(run==0)) run=1;
if ((sw>0)&(run!=0)) run=0;
el = encoder[LEFT];
er = encoder[RIGHT];
diff = el - er;
if (run!=0) MotorSpeed(avgspeed-diff,avgspeed+diff); else MotorSpeed(0,0);
PrintInt(el);
PrintStr(" | ");
PrintInt(er);
PrintStr(" | ");
PrintInt(diff);
PrintStr(" | ");
PrintInt(run);
PrintStr("\r\n");
}
return 0;
}
Grüsse vom ölgötz