PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schalter und Odometrie Test problem im Probelauf



listner
12.03.2008, 17:26
Hi leute,
hab zu meinem Geb nun endlich auch ein Asuro bekommen :) und ihn gleich mal zusammen gelötet!!
Das modul der seriellenschnitstelle funktioniert ohne probleme, gleich aufs erste mal löten :)
aber beim asuro hats n paar kleinere probleme...
die wären:

beim Switch test:
wenn ich T 4 +5 gleichzeitigdrücke, leuchten die Leds, aber der Linke motor dreht sich scwach...

beim drücken von T6 leuchtet die D16 ganz schwach auf....

Odeometrie Test
funktioniert überhaubt nix...




ned help.. thx im vorraus
gruß

harry3
12.03.2008, 18:40
Hört sich nicht weiter schlimm an.
Die Odometrie und die Taster muss man erst kalibrieren. Also mach dir mal selber ein paar Testprogramme mit denen du die Odometrie und die Taster auswertest und diese damit einstellen kannst.

listner
14.03.2008, 09:45
ok, hab nur ein paar codes draufgeflashed und ausprobieren wollen, aber da tut jetzt seit ich den selftest überschrieben habe rein NIX !!!!


#include "asuro.h"

int main(void)
{
Init();
FrontLED(ON);
BackLED(ON,ON);
StatusLED(GREEN);

MotorDir(FWD,FWD);
MotorSpeed(0,0);

while(1);
return 0;
}


diesen code hab ich u.a. ausprobiert, aber der asuro macht rein garnichts.. er geht an.. dan leutet die d12 kurz orange.. die back leds kurz leicht rot..

danach die d12 grün. egal was für nen code ich eingebe. laut flash tool hat alles geklappt!! kann mir jemand bitte helfen??

gruß

pinsel120866
14.03.2008, 10:23
Hi listner,

möglicherweise hast du den Code nicht gespeichert bevor du kompiliert hast.

Ausserdem kann dein Code nicht funktionieren, ich würde das so machen:


#include "asuro.h"

int main(void)
{
Init();
FrontLED(ON);
BackLED(ON,ON);
StatusLED(GREEN);
while(1);
{
MotorDir(FWD,FWD);
MotorSpeed(0,0);
}
return 0;
}

Die Schleife while(1) muss weiter vor.

listner
14.03.2008, 10:39
ok, vielen dank, ich hab das davorige speichern vergessen :P

ich werde jetzt mal ein paar tests machen, und mich dann wider melden

gruß

Ceos
14.03.2008, 10:45
der code würde schon funktionieren, dein code würde eher problematisch wenn jemand auf die idee käme die geschwindigkeit PERMANENT während der schleife zu verändern .... sein eigener code war da schon besser mit
while(1);

EDIT: Ich bin mir sogar ziemlich sicher das du mit dem sich permanent wiederholenden setDir() die autoencode funktion empfindlich störst und wenn da auch noch das setspeed ist sogar den PWM generator verwirrst

pinsel120866
14.03.2008, 11:09
OK, danke. Man sieht wieder einmal dass ich eine "Programmierpflaume" bin, na wenigstens hat der Tip mit dem Speichern gestimmt.

listner
14.03.2008, 11:31
^^so geht es mir auch, es lieg am proggen xD

und zwar:

#include "asuro.h"

int main(void)
{
Init();
FrontLED(ON);
BackLED(ON,ON);

if (PollSwitch()==0)
{StatusLED (RED);}
else
{StatusLED (GREEN);}

while(1);
{
if (PollSwitch()==0)
{StatusLED (RED);}
else
{StatusLED (GREEN);}

}
return 0;
}


er bootet
- die back leds leuchten, die front led leutet, die status led leutet rot

ich drücke nen taste
- nichts passiert


liegt bestimmt am code ](*,) ](*,) ](*,)

kann mir jemand mal n paar tipps geben auf was ich achten soll und was oben falsch ist?? :-b [-o<

m.a.r.v.i.n
14.03.2008, 11:51
Hallo listner,

nimm mal das Semikolon hinter dem

while(1)
weg. Dann sollte es funktionieren

Ceos
14.03.2008, 11:56
nur für den fall das es n tipp-fehler war, ignoier einfach folgendes

while(BEDINGUNG) ANWEISUNG; führe anweisung aus bis bedingung falsch
while(BEDINGUNG) ; führe praktisch NICHTS aus solange bis bedingung ungültig
while(BEDINGUNG) {ANWEISUNGSBLOCK} führe alle anweisungen imn dem block aus bis bedingung ungültig .... hier nie semikolon, ausser hintern den einzelnen anweisungen im block natürlich ^^

listner
14.03.2008, 15:09
ok, danke^^ hat alles so weit funktioniert!!!

nun wollte ich ein programm schreiben, durch das der asuro so weit gerade aus fährt, bis er wo anstöst und ab da nur noch rückwärts, hat aber nicht so ganz geklappt :


#include "asuro.h"

int main(void)
{
Init();
StatusLED(1);
MotorDir(FWD,FWD);
MotorSpeed(120,120);

while(1)
if (PollSwitch() != 0)
{ while(1)
{MotorDir(RWD,RWD);
MotorSpeed(120,120);}
}
else
{MotorDir(FWD,FWD);
MotorSpeed(120,120);}

return 0;
}


gruß

liggi
14.03.2008, 16:20
wenn ein schalter gedrückt wird fährt er ganz kurz rückwärts und im nächsten durch gang wieder vorwärts.

du musst noch eine pause einbauen.

mfg liggi

harry3
14.03.2008, 18:13
So in etwa sollte es funktionieren(nicht getestet!)


int flag=0;

while(1)
{
if(PollSwitch() != 0)
flag=1;


if (flag==0)
{
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}

else
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
}
}

Beim C Programmieren happerts noch ein bisschen bei dir, schau dir z.B. diesen Online C Kurs an:
http://www.fh-augsburg.de/informatik/vorlesungen/c_cplus/tutorial/cyris/

listner
17.03.2008, 13:17
So in etwa sollte es funktionieren(nicht getestet!)


int flag=0;

while(1)
{
if(PollSwitch() != 0)
flag=1;


if (flag==0)
{
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}

else
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
}
}

Beim C Programmieren happerts noch ein bisschen bei dir, schau dir z.B. diesen Online C Kurs an:
http://www.fh-augsburg.de/informatik/vorlesungen/c_cplus/tutorial/cyris/

naja, mit deinem code fährt er nur rückwärts.. das kann es auch nicht sein, weis sonst einer weiter??

harry3
17.03.2008, 16:35
Mach dir mal über den Code Gedanken bevor du ihn als falsch abstempelst!
Ich tippe mal drauf dass du die PollSwitch Funktion noch nicht richtig eingestellt hast! Dazu gibts im Forum schon mehr als wie genug Tipps(PollSwitch mehrfach hintereinander aufrufen).

listner
19.03.2008, 23:27
ok, hab das mit dem PollSwitch() inzwischen recht gut im griff :) *freu*
und das problem, das mein asuro rürckwärts lief war, ich hab die motoren falschrumgepohlt eingelötet =;

nunja. das mit dem PollSwitch() klapt ja ohne probleme, wenn ich es mehrmals aufrufe, aber verstanden, warum dies so gehandhabt werden muss hab ich nicht, bzw, nirgends eine erklährung dazugefunden, kann man mir ma l wieder weiterhelfen \:D/ \:D/

thx im vorraus gruß

harry3
20.03.2008, 00:58
PollSwitch liefert manchmal einen falschen Wert(da Asuro keine Spannungsstabilisierung hat können z.B. durch die Motoren die genannten Störungen auftreten). Dies tritt aber in der Regel nur kurz auf. Ruft man PollSwitch nun 2mal hintereinander auf, und beide Male wird der gleiche Wert zurückgeliefert, kann man davon ausgehen dass wirklich derjenige Taster gedrückt wurde.
Sind die beiden Rückgabewerte nicht gleich, so kann man davon ausgehen dass sich da ein Fehler eingeschlichen hat.

ASURO-ASURO
20.03.2008, 09:59
ich habe auch das Problem, das mein Asuro ohne das ein Taster gedrückt wurde, nach ein paar sek einfach rückwärts fährt...
wo kann ich die Taster einstellen?
Oder wie muss ich das Prog schreiben um das zwei mal hintereinander ab zu fragen und zu vergleiche, wie du es beschrieben hast?

EDIT: er fährt auch leicht nach links, wie kann ich das verbessern? muss ich beim Programmieren, wenn ich geradeaus fahren will das eine rad ein bischen weniger laufen lasse z.B. anstatt 120 dann nur noch 110...?

harry3
20.03.2008, 12:37
Eine Möglichkeit besteht darin dass du vor die main Funktion folgende Funktion hinkopierst:

unsigned char fkt_taster(void)
{
unsigned char taster=0;

taster=PollSwitch();

if(taster==PollSwitch() && taster!=0)
return taster;
else
return 0;
}

Im main Programm kannst du von nun an statt PollSwitch die Funktion fkt_taster aufrufen, welche besser funktionieren sollte. Funktioniert auch das nicht, dann meld dich, dann muss man in der Funktion PollSwitch einen Wert korrigieren.

Dass Asuro nicht gerade fährt ist normal. Entweder man spielt sich solange mit den Werten der linken und rechten Geschwindigkeit, bis Asuro geradeausfährt.
Oder, und das ist natürlich die bessere Methode, man programmiert einen Regler der Asuro geradeausfahren lässt. Das lässt sich mit der Odometrie recht gut lösen, such mal im Forum, da gibts schon genug Themen dazu!

listner
20.03.2008, 15:23
ich habe auch das Problem, das mein Asuro ohne das ein Taster gedrückt wurde, nach ein paar sek einfach rückwärts fährt...
wo kann ich die Taster einstellen?
Oder wie muss ich das Prog schreiben um das zwei mal hintereinander ab zu fragen und zu vergleiche, wie du es beschrieben hast?

EDIT: er fährt auch leicht nach links, wie kann ich das verbessern? muss ich beim Programmieren, wenn ich geradeaus fahren will das eine rad ein bischen weniger laufen lasse z.B. anstatt 120 dann nur noch 110...?

ja, das gleiche problem habe ich auch, und durch die geschwindigkeits einstellung im code klapt es wunderbar!!!!

theoretisch könntest du ein geschwindigkeitsabgleich in der header vornehmen, dan müsstes du nicht jedesmal darauf achten

korrigiert mich wenn ich falschliege :)

gruß

ASURO-ASURO
20.03.2008, 15:25
danke, ich werde es mal ausprobieren.

kannst du zum Thema gerade aus fahren bitte einen link posten??

Gruß Matthias

damaltor
20.03.2008, 16:22
zum geradeausfahren solltet ihr mal die suchfunktion befragen, darüber git es hunderte threads da kein asuro normalerweise einfach geradeaufs fährt =)

zu pollswitch: ein weiteres problem ist der kondensator der parallel zu den tastern geschaltet ist (c6 oder c7 glaub ich). wenn er aufgeladen ist, wird beim messen von pollswitch seine spannung mit-gemessen. das führt zu störungen. ichhabe ihn bei meinem asuro kurzerhand entfernt, seitedem läuft pollswitch zu 99,999% korrekt. das muss aber nicht zwingend bei jedem asuro helfen.

eine möglichkeit diese fehler asuzugleichen, ist eine anpassung in der asuro.c, auch hier bitte suchfunktion benutzen.

harry3
20.03.2008, 16:26
bitte die Suchfunktion benutzen. Ich hab "asuro geradeausfahren" eingegeben und hab bereits auf der ersten Seite einige sinnvolle Treffer!

ASURO-ASURO
20.03.2008, 16:45
ok, ich habe es jetzt mal versucht um zu setzen...


#include "asuro.h"

int main(void)
{ Init();
unsigned char taster=0;
taster=PollSwitch();

while(1)
{

if(taster==PollSwitch() && taster!=0) /*die FrontLED sollte doch eigentlich
leuchten wenn der Taster gedrückt ist oder ...&&taster!=0*/
{
FrontLED(ON);
}
else
{
BackLED(ON,ON);
FrontLED(OFF);
}

}
}

also wie ich eigentlich gedacht habe, sollte die FrontLED leuchten, wenn ein Taster gedrückt ist also taster!=0 ist.

Dies klappt aber nicht, es leuchten nur die BackLEDs auch bei einem oder mehreren Tastendrucken oder drücken, wie das auch heißen mag...^^

an was kann das noch liegen?

damaltor
20.03.2008, 17:04
du musst den wert von pollswitch erstmal in eine variable speicchern, dnn kannst du sie in der if() schleife verwenden.

harry3
20.03.2008, 18:17
Zu Anfang des Programms speicherst du einen Wert in der Variable Taster(meistens 0).
Dann geht das Programm in die while Schleife und fragt jedes Mal ab ob die Variable taster!=0. Das kann natürlich nie erfüllt sein, auch wenn du noch so oft einen Taster drückst, da in taster der Wert 0 für die gesamte Laufzeit des Programms drinnensteht!


while(1)
{
taster=PollSwitch();
if(taster==PollSwitch() && taster!=0)
...

ASURO-ASURO
20.03.2008, 20:54
danke für die große hilfe.

ich werde mich morgen früh gleich noch mal dran setzen.

welchen kondensator kann man entfernen c6 oderc7?
hatdas irgend welche nebenwirkungen?

harry3
20.03.2008, 21:10
C7, das ist der, der parallel zu den Tastern liegt(siehe Schaltplan)

ASURO-ASURO
21.03.2008, 00:11
für was ist er denn ein gebaut woeden, wenn es ohne ihn besser geht, speich was kann ohne ihn passieren?

damaltor
21.03.2008, 02:38
das ist leicht paradox, er ist dazu da um störungen zu verhindern... :D

kondensatoren zwischen masse und vcc nehmen sämtliche hochfrequente störungen auf. dieser effekt fällt jedoch mit dem entfernen weg, es kann also durchaus sein dass keine besserung oder sogar eine verschlechterung eintritt.

tip: kneif ein bein des kondensators durch, und teste ob es besser wird. wenn ja, kneif das andere auch durch - du soarst das auslöten und vermeidest das risiko an der platine was zu zerstören. du kannst den kondensator auch einbeinig da hängen lassen. wenn keine besserung eintritt, dann verschliesse das gekappte bein mit etwas lötzinn.