PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Fototransistor test funktioniert nicht!



Dr.Know
26.09.2009, 12:17
Hallo Leute folgendes Problem!

Wenn ich den self test des ASURO starte fängt der roboter mit dem diodentest an... das funktionier auch alles, nur wenn jetzt die Fototransistoren getestet werden, leuchtet immer die LED D16

was ist da verkehrt?

Die LED muss bei dem Test aus sein und erst aufleuchten, wenn Licht auf den fototransistor fällt

bitte helft mir schnell

the.speciali
26.09.2009, 12:22
Hi,

Bist du dir sicher das kein Licht auf den Fototransistor fällt? Es reichen schon kleine "mengen" Licht aus das die LED leuchtet. Wie hast du sie abgedeckt das kein Licht drauffällt?

mfg
the.speciali

Dr.Know
26.09.2009, 12:30
Also... auf der linken Seite funktioniert alles einwandfrei.

nur die rechte seite macht mir probleme ich habe sogar schon nach dem widerstand geguckt und der hat auch seine 20k... auch wenn ich den widerstand zum fototransistor entferne leuchtet die d16 immer noch

hab auch schon nach kalten lötstellen und lötbrücken geguckt aber nichts gefunden

the.speciali
26.09.2009, 12:36
Du hast den Widerstand zum Fototransistor entfernt?? Dann könnte es gut sein das dein Fototransistor jetzt kaputt ist.

Vielleicht haste auch eine Leiterbahn durchtrennt. Hast du diese schon überprüft?

Besserwessi
26.09.2009, 13:23
Wenn man den Widerstand größer macht, oder gar entfernt, wird die Schaltung empfindlicher und es reicht weniger Licht.

Ist der Fototransistore den richtig herum drin, die Markierung ist ja nicht so groß ? Normalerweise sind die Fototransistoren nicht so leicht kaput zu kriegen bei nur 5 V.

Dr.Know
26.09.2009, 13:46
ja der fototransistor ist auch richtig drin.

ich werde gleich mal ein noch größeren widerstand einlöten mal gucken was er dann sagt

ja den widerstand hab ich entfernt so das er keine spannung mehr bekommt.

Hubert.G
26.09.2009, 20:15
Man kommt da am ehesten ans Ziel wenn man den Mega8 heraus nimmt.
Nachdem eine Seite funktioniert kannst du dann die Spannungen schön vergleichen.

Dr.Know
27.09.2009, 14:02
okay dann werde ich das mal machen

Dr.Know
27.09.2009, 19:13
naja die werte sind auf beiden seiten gleich

the.speciali
28.09.2009, 20:58
Hmm langsam vermute ich einfach ein Softwareproblem. Ist zwar unwahrscheinlich aber kann ja mal vorkommen das was am OriginallProgramm nicht passt (oder? :D )

Probier mal das hier draufzuflashen:



#include "asuro.h"
#include "stdlib.h"

int main (void)
{
int t;

unsigned int data[2];
unsigned char links[7];
unsigned char rechts[7];

for (t=0;t<25;t++)
{
LineData (data);

itoa (data[0], links, 10);
itoa (data[1], rechts, 10);

SerWrite (text, 6);
SerWrite ("\n\r", 2);
SerWrite (test, 6);
SerWrite ("\n\n\r", 3);

Sleep (215);
}
StatusLED (RED);
return 0;
}


Sollte - soweit ich noch die ganze AsuroLib in Erinnerung hab - die jetzigen Liniensensor Werte ausgeben. Und das 25 mal. Wenn du eine genaue Erklärung des Codes haben willst einfach bescheid geben ;)

Den Code compilieren, auf den Asuro überspielen, Hyperterminal einschalten sich verbinden und den Asuro anmachen. Oben wird dann der Wert des linken Sensors angezeigt und unten der des rechten. Es werden 25*2 Werte angezeigt also nicht wunder wenn auf einmal ziemlich viel herunterratert ;) Die Werte sollte irgendwas zwischen 0 und 1023 auf beiden Seiten sein.
Wobei die 0 ungewöhnlich wäre und darauf hindeutet das entweder an dem Programm was nicht stimmt (dann Entschuldige ich mich natürlich das mein Programm nicht funktioniert ;) wie gesagt ist alles eine Zeit lang schon her) oder aber es stimmt etwas an der Hardware nicht. Wobei wir ja dann den Softwareseitigen Fehlerfaktor ausgeschlossen hätten.

Könnte jemand von den "erfahrenen" sich den Code anschauen? Ich bin mir zwar ziemlich sicher das er funktioniert, aber mein Asuro liegt nur gerade in der Elektronikwerkstatt der Schule weswegen das mit dem Testen eher schwierig ist^^ Danke schon mal.

beste Grüße
the.speciali

Dr.Know
28.09.2009, 21:54
ok danke... kann ich jetzt aber auf die schnelle nicht testen da der asuro grad bei einem anderen projekt mitglied ist der da mal nach schaut

habe ihm aber gesagt er soll das programm mal drauf schreiben und die werte überprüfen

Dr.Know
30.09.2009, 10:11
ich bekomme eine fehlermeldung wenn ich den code compilieren will

#include "asuro.h"
#include <stdlib.h>

int main (void)
{
int t;

unsigned int data[2];
unsigned char links[7];
unsigned char rechts[7];

for (t=0;t<25;t++)
{
LineData (data);

itoa (data[0], links, 10);
itoa (data[1], rechts, 10);

SerWrite (text, 6);
SerWrite ("\n\r", 2);
SerWrite (test, 6);
SerWrite ("\n\n\r", 3);

Sleep (215);
}
StatusLED (RED);
return 0;
}



Fehlermeldung:

test.c: In function `main':
test.c:19: error: `text' undeclared (first use in this function)
test.c:19: error: (Each undeclared identifier is reported only once
test.c:19: error: for each function it appears in.)
test.c:22: error: `test' undeclared (first use in this function)
make: *** [test.o] Error 1

> Process Exit Code: 2

021aet04
30.09.2009, 10:31
Hast du text und test deklariert?

Valen
30.09.2009, 15:30
Genau...

Deine SerWrite zeilen sollten wie das folgende sein:


...
SerWrite (links, 6);
SerWrite ("\n\r", 2);
SerWrite (rechts, 6);
SerWrite ("\n\n\r", 3);
...

Dr.Know
30.09.2009, 15:38
ok jetzt funktioniert er^^ jetzt muss ich den nur noch mein kumpel geben

maikel510
05.05.2012, 13:02
ich hab mal ne frage wie kann ich die phototransistoren so programmieren dass beide gleichzeitig weiß und schwarz unterscheiden? geht des überhaupt? also ich will ein programm schreiben dass wenn der boden weiß ist eine bestimmte aktion ausgeführt wird und wenn er schwarz ist etwas anderes gemacht wird. er soll dann im prinziep einen schwarzen punkt auf einer großen fläche finden ist das möglich oder soll ich dafür eine abdunkeln und die andere hell lassen oder so?
gibt es auch eine möglichkeit dass der asuro den schwarzen gegenstand findet un dann einer schwarzen linie folgt um ihn irgendwo hin zu bringen?hat jemand n lösungsvorschlag?

oberallgeier
05.05.2012, 14:13
... phototransistoren so programmieren dass beide gleichzeitig weiß und schwarz unterscheiden ...Das geht im Prinzip. Du hast diese beiden Phototransistoren an den Eingängen PC2 und PC3 also an ADC2 und ADC3 angeschlossen. Nun kannst Du bei geeigneter Programmierung bzw. Initialisierung der ADCs die aktuelle Spannung an diesen Eingängen abfragen, entweder im Wert 0 ... 255 (8 bittig) oder 0 ... 1023 (10 bittig).

Die Helligkeitsunterscheidung liefe dann so ungefähr (hier die Werte NUR als Beispiel für 8 Bit):
0 bis 100 <=> schwarz (bzw. dunkel)
150 bis 255 <=> weiß (bzw. hell)

Der SFH300 ist über den für unser Auge sichtbaren Wellenbereich des Lichtes empfindlich, damit sollte die Unterscheidung schon gut gehen.

Viel Erfolg

maikel510
05.05.2012, 14:29
okay dann bin ich schonmal erleichtert dass meine idee möglich ist =D wie müsst ich des dann in nem programm schreiben? also halt dass beide zB einen wert zw 150-255 haben? ich hab schonmal angefangen:

#include <asuro.h>
#include <myasuro.h>

int main (void)
{

unsigned int data [2]
Init();
FrontLED(ON);
LineData(data);
if(
{

}




}

ich weis jetzt aber nicht was ich nach if schreiben soll
ich bin ned wirklich gut im programmieren des ist das problem xD

maikel510
05.05.2012, 16:11
okay also ich hab jetzt mal n programm geschrieben aber ich hab da n paar probleme also ich wollt dass mein asuro an der wand entlang fährt und in einer art wohnung also auch mit mehreren zimmern einen gegenstand sucht.
ich hab jez mithilfe von internet und beispielprogramme ein eigenes programm geschrieben aber er tut ned ganz was er soll...
ich hab mir des so gedacht:
wenn der boden weiß ist soll er einen bogen fahren, damit er mit dem taster rechts außen an der wand anstößt. dann dreht er sich ein stück auf der stelle um von der wand weg zu kommen und fährt wieder einen bogen bis zur wand sollte er sich mal zu weit drehen warum auch immer und stößt mit dem linken taster an der wand an dreht er sich wieder so dass er richtig rum steht. sobal der boden unter ihm schwarz wird oder er einen schwarzen gegenstand erreicht bleibt er stehen. dann sollen die backleds blinken und die statusled wechselt mehrfach die farbe (grün-gelb-grün-gelb...). und anschliesend könnte er noch über eine schwarze linie wieder nach draußen finden.

mein programm funktioniert allerdings nicht wirklich. wenn ich den asuro einschalte dann bleibt er stehen die vordere led leuchtet die backled rechts hinten leuchtet ebenfalls und die statusled leuchtet gelb. ich weis nicht woran es liegt

hier das programm:


#include <asuro.h>
#include <myasuro.h>

int main (void)
{

int anzahlwiederholungen=0, i=6;
int ldata[2];


unsigned int data[2]
;unsigned char t1, t2; <- ich weis nicht warum aber ohne das ";" am anfang wurde mir ein error angezeigt

Init();
FrontLED(ON);
LineData(ldata);


if(ldata[0]>125,ldata[1]>125)
{

while (1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0) /* keine Taste */
{
MotorDir(FWD,FWD); /* Rechtsbogen fahren */
MotorSpeed(150,120);
/* FrontLED(ON);
BackLED(OFF,OFF);*/

}
else if (t1 && t2 && t1 == t2)
{
MotorDir(BREAK,BREAK);
if (t1 & 0x07) /* Tasten links gedrückt? */
{
MotorDir(RWD,RWD); /* auf der Stelle umdrehen */
MotorSpeed(150,150);

/*FrontLED(OFF);
BackLED(ON,OFF);*/
}
if (t1 & 0x38 ) /* Tasten rechts gedrückt? */
{
MotorDir(FWD,FWD); /* Vorwärts Linkskurve */
MotorSpeed(100,150);

/* FrontLED(OFF);
BackLED(OFF,ON);*/
}
Msleep(1000); /* 1 Sekunde fahren */
}



}

}


else if(ldata[0]<125,ldata[1]<125)

{


while (anzahlwiederholungen<i)
{
MotorDir(BREAK,BREAK);
MotorSpeed(BREAK,BREAK);
StatusLED(GREEN);
BackLED(ON,OFF);
StatusLED(YELLOW);
BackLED(OFF,ON);
anzahlwiederholungen++;
}

}
else if(ldata[0]>ldata[1])

{

MotorDir(FWD,FWD);
MotorSpeed(175,125);

}

else if(ldata[0]<ldata[1])

{

MotorDir(FWD,FWD);
MotorSpeed(125,175);

}

return 0;
}


weis jemand wo der fehler liegen könnte? ich komm irgendwie nicht weiter...

Valen
05.05.2012, 18:58
Was meinst die mit diese If abfrage?


if(ldata[0]>125,ldata[1]>125)

Versuch dich deine Code so zu schreiben, mit weitere tiefe einsprungen (Tab-Taste) bei jedes neue {} Code-block:


#include <asuro.h>
#include <myasuro.h>

int main (void)
{

int anzahlwiederholungen=0, i=6;
int ldata[2];


unsigned int data[2];
unsigned char t1, t2; <- ich weis nicht warum aber ohne das ";" am anfang wurde mir ein error angezeigt

Init();
FrontLED(ON);
LineData(ldata);


if(ldata[0]>125,ldata[1]>125)
{
while (1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0) /* keine Taste */
{
MotorDir(FWD,FWD); /* Rechtsbogen fahren */
MotorSpeed(150,120);
/* FrontLED(ON);
BackLED(OFF,OFF);*/

}
else if (t1 && t2 && t1 == t2)
{
MotorDir(BREAK,BREAK);
if (t1 & 0x07) /* Tasten links gedrückt? */
{
MotorDir(RWD,RWD); /* auf der Stelle umdrehen */
MotorSpeed(150,150);

/*FrontLED(OFF);
BackLED(ON,OFF);*/
}
if (t1 & 0x38 ) /* Tasten rechts gedrückt? */
{
MotorDir(FWD,FWD); /* Vorwärts Linkskurve */
MotorSpeed(100,150);

/* FrontLED(OFF);
BackLED(OFF,ON);*/
}
Msleep(1000); /* 1 Sekunde fahren */
}
}

}
else if(ldata[0]<125,ldata[1]<125)
{
while (anzahlwiederholungen<i)
{
MotorDir(BREAK,BREAK);
MotorSpeed(BREAK,BREAK);
StatusLED(GREEN);
BackLED(ON,OFF);
StatusLED(YELLOW);
BackLED(OFF,ON);
anzahlwiederholungen++;
}

}
else if(ldata[0]>ldata[1])
{
MotorDir(FWD,FWD);
MotorSpeed(175,125);
}
else if(ldata[0]<ldata[1])
{
MotorDir(FWD,FWD);
MotorSpeed(125,175);

}

return 0;
}Das macht deine Code viel übersichtlicher.

BerndJM
05.05.2012, 20:02
Hi,



unsigned int data[2]
;unsigned char t1, t2; <- ich weis nicht warum aber ohne das ";" am anfang wurde mir ein error angezeigt


Ist klar, das ist das fehlende ; am Ende der oberen Zeile.


unsigned int data[2];
unsigned char t1, t2;

Die eine if Abfrage hat ja Valen schon nachgefragt - das gleiche Fragezeichen ergibt sich bei dem dazugehörigen else if Zweig.

Dieses

else if (t1 && t2 && t1 == t2)
erschließt sich mir auch nicht wirklich ...

Damit

MotorDir(RWD,RWD); /* auf der Stelle umdrehen */
MotorSpeed(150,150);
dreht er nicht auf der Stelle um sondern fährt einfach rückwärts.

Soweit erstmal. Ich würde das ganze erstmal in kleinen Stückchen probieren - also die einzelnen erwünschten Abläufe einzeln testen und mich erst dann, wenn sie funktionieren an die ganze ver"if"zerei machen.

Grüßle Bernd

maikel510
12.05.2012, 10:34
ja also mein problem war dass ich das programm wie ihr auch gesagt habt in einem schritt geschrieben habe und es nicht in kleine schritte unterteilt habe. deshalb habe ich neu angefangen. ich will nun zuerst ein programm schreiben, bei dem er sobald ein taster gedrückt ist, ein stückchen rückwärts fährt und sich dreht. danach fährt er wieder ein bisschen vorwärts und kommt dann auf eine art kreisbahn dann wird wieder ein taster gedrückt und es fängt von neuem an. damit möchte ich ihn an einer wand entlang fahren lassen.


#include <asuro.h>
#include <myasuro.h>


int rwd(int a, int b)
{

MotorDir(RWD,RWD);
MotorSpeed(130,100);
Msleep(1000);

}

int main (void)
{
unsigned char taste;
unsigned char pollswitch;

Init ();


taste = PollSwitch ();

if(taste>0)
{
rwd;
}

else
{

MotorDir(FWD,FWD);
MotorSpeed(100,100);
Msleep(500);
MotorDir(FWD,FWD);
MotorSpeed(130,100);

}
return 0;
}

so sieht mein programm bis jetzt aus aber irgendwie will er weiterhin gerade aus fahren auch wenn ein taster gedrückt ist weis jemand woran das liegen könnte?