Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Fototransistor test funktioniert nicht!
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, 13: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
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, 13: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, 14: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.
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, 21: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.
okay dann werde ich das mal machen
naja die werte sind auf beiden seiten gleich
the.speciali
28.09.2009, 21: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
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
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, 11:31
Hast du text und test deklariert?
Genau...
Deine SerWrite zeilen sollten wie das folgende sein:
...
SerWrite (links, 6);
SerWrite ("\n\r", 2);
SerWrite (rechts, 6);
SerWrite ("\n\n\r", 3);
...
ok jetzt funktioniert er^^ jetzt muss ich den nur noch mein kumpel geben
maikel510
05.05.2012, 14: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, 15: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, 15: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, 17: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...
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.
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, 11: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?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.