PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rechter Motor hat keine Power



schocksnert
04.06.2009, 11:36
Hallo zusammen, bin seit kurzem auf den Asuro und dieses Forum gestoßen. Hab mir auch dann direkt einen zugelegt.

Habe nur folgendes Problem:
Bei der anweisung GoTurn dreht er entweder endlos oder fährt einfach nur mit Links (recht´s hängt, erst mit hilfe fährt er los)

Warum auch immer dem Rechten Motor fehlt einfach die Power. Hab mitlerweile schon alles versucht:

Die Schaltung habe ich mitlerweile 4x kontrolliert, habe die Wellen auf einer Drehbank Poliert und mit spezialöl behandelt. Die Bohrung der Zahnräder um 0,1mm vergrößert. Die Motoren getauscht.
Versucht die Odometrie mit hilfe von Sternthalers Programm zu ermitteln (Danke nochmal´s super Programm).
Hab die Odometrie sensoren abgedeckt (jedoch ohne dabei Schanps zu trinken O:) )

Weiß langsam echt nicht mehr was ich noch Probieren soll.
Kann mir hier einer weiter Helfen??

BurningBen
04.06.2009, 13:58
Hast du Zahnräder in der richtigen Reihenfolge montiert?

schocksnert
04.06.2009, 14:03
Kann man die denn anders montieren???
Wenn man die Tauscht passt es doch gar nicht.

cele93
04.06.2009, 14:07
nee so wie ich das weis kann man die garnicht falsch montieren, da sonst das Rad nicht mehr auf das Zahnrad passt.

Gruß Jonas Weber

Thomas$
04.06.2009, 15:35
geht das getriebe leicht zu drehe oder klemmt das? mess mal die stromaufnahme vom linken und vom rechten motor.

Besserwessi
04.06.2009, 17:56
Könnte es sein, dass einer der Basisvorwiderstände zu groß ist ?

schocksnert
04.06.2009, 18:45
Wow, danke für die schnellen Antworten.

Also den Strom kann ich grade leider nicht messen (Abendschule ](*,) )
Welche Widerständ sind denn die Basisvorwiderstände???
R1-7 haben alle den Farbcode:Braun, Schwarz, Rot, Gold. 1kOhm

schocksnert
04.06.2009, 19:42
Hab grade noch etwas rum probiert und folgendes Festgestellt.

Wenn ich die Motordrehzahl über eine for-Schleife hochzählen lass, fährt er fast grade und der Motor hat auch power \:D/

Nur wenn die Odometrie mit ins Spiel kommt, spinnt er rum.
Jemand eine Idee???

schocksnert
04.06.2009, 19:42
Hab grade noch etwas rum probiert und folgendes Festgestellt.

Wenn ich die Motordrehzahl über eine for-Schleife hochzählen lass, fährt er fast grade und der Motor hat auch power \:D/

Nur wenn die Odometrie mit ins Spiel kommt, spinnt er rum.
Jemand eine Idee???

Besserwessi
04.06.2009, 21:13
Gemeinst war einer der Widerstämde R1-R8. Aber so wie es aussieht ist es ja auch kein Hardwareproblem, sondern mehr was mit der Software. Je nach Software eventuell auch eine Problem mit der Hardware der Odometriesensoren.
Eine Wechselwirkung könnte es eventuell durch das schreiben von PortD ergeben, wenn da ein Fehler beim maskieren der Bits gemacht wird. Sonst eventuell auch ein Problem mit Stack overflow.

Valen
04.06.2009, 21:35
Werden die odoleds angeschaltet im betrieb? Und hast du den beleuchtungswerten angepast an deiner asuro im odometrie algorithmus?

Postet deine program bitte.

ExMachina
04.06.2009, 21:43
Hallo,

prüfe mal die äußeren Radmuffen, manchmal verhakt der Bot sich da und man muß sie am äußersten Ende der Achse anbringen.

Gruß
Matthias

schocksnert
04.06.2009, 22:18
Also hier mein Programm:

Ist ein wenig durcheinander, aber der gedanke war der
das ich über den Pollswitch in einzelne Modi´s springe (Demomode, und steuern über Seriell) Ist aber noch nicht ganz fertig :-b


#include "asuro.h"
#include "myasuro.h"

int x=0; //Zählvariablen für diverse Zählschleifen
char emfangene_daten[10];

void Goo(int d,int l) //eigene goturn anweisung
{ //Nur zum Test!!!!!!
if (l>0)
MotorDir(FWD,FWD);
else
MotorDir(RWD,RWD);

MotorSpeed(d,d+8); //die +8 sind nur zum gradeaus fahren
Msleep(5000);
MotorSpeed(BREAK,BREAK);
}


int main(void)
{


Init(); //Devinierter Zustand vom ATMEL


while(1)
{
while (PollSwitch() == 0)
{
StatusLED (GREEN);
Msleep (500);
StatusLED (RED);
Msleep (500);
}

switch (PollSwitch()) //Auswahlmenü gesteuert über Pollswitch
{
case 1:emfang();
break;
case 4: //Kleine Fahranweisung zu Demo zwecken.
StatusLED (YELLOW);
Msleep (2000);

EncoderInit ();
for (x=1; x<=4; x++) //Asuro fährt ein quadrat
{GoTurn ( 0, 45, 200); //45° hier entspricht 90° drehung im real, da "grobe" encoderscheibe eingebaut
GoTurn (150, 0, 200);}
Msleep(1000);

for (x=1; x<=2; x++) //Asuro fährt einen kreis vorwärts und rückwärts
{if (x==1)
GoTurn (300, 90, 255);
else
GoTurn (-300, -90, 255);
Msleep(500);}
break;


default: //Bei falscheingabe blinkt die Status LED 5x Gelb
for(x=1; x<=5; x++)
{StatusLED(OFF);
Msleep(500);
StatusLED(YELLOW);
Msleep(500);}
break;
}

return 0;
}
}

int emfang(void) //Steuerung über Seriel
{
EncoderInit ();


StatusLED (YELLOW);
BackLED (ON, OFF);
Msleep (500);
BackLED (OFF,ON);
Msleep (500);
BackLED (OFF,OFF); //AUS damit!!!!

SerWrite ("READY", 10);
SerRead (emfangene_daten, 1, 0); //Warte auf Daten, ohne timeout!!

switch (emfangene_daten[0])
{
case'T': //keine Daten erhalten
break;

case '1': //Wenn daten =1 fahr vor.
GoTurn(10, 0, 150);
break;

case '2': //wenn daten =2 fahr zurück
Goo (200, 1);
break;

default: //sonst sendefehler 5xgelb
for(x=1; x<=5; x++)
{
StatusLED(OFF);
Msleep(500);
StatusLED(YELLOW);
Msleep(500);
}
break;
}
return 0;
}


@ ExMachina: einen fehler durch die Radmuffe kann ich ausschließen, da es über Motorspeed keine probleme gibt. Nur bei GoTurn.

Aber danke für die Idee.

Valen
04.06.2009, 23:31
Ob es deine problehm verursacht weiss ich nicht genau, aber MotorSpeed(x,x) muss 'unsigned int' werten haben. Nicht 'int' werten wie in dein Goo-header.

Aber wesentlicher ist es den EncoderInit (); (in deine Empfang code) gleich hinter den letzten BackLED zu schreiben. Den BackLED function schaltet den odoleds einfach aus, und werden danach nicht wieder eingeschaltet. Und deshalb sind den verschiedene Goturn's und Go's auf dem falschen Weg.

schocksnert
05.06.2009, 07:56
Hallo Valen, Danke für die schnelle Antwort.

Ja hast recht es muss 'unsigned int' sein, hatte ich gar nicht drauf geachtet. Ist aber zum glück nicht aufgefallen, da ich nur mit Positiven Werten im Wertbereich gearbeitet hatte.

Das mit dem EncoderInit() hab ich an einer weiteren Stelle im Programm noch mal eingebaut ohne BackLeds:

case 4: //Kleine Fahranweisung zu Demo zwecken.
StatusLED (YELLOW);
Msleep (2000);

EncoderInit ();
for (x=1; x<=4; x++) //Asuro fährt ein quadrat
{GoTurn ( 0, 45, 200); //45° hier entspricht 90° drehung im real, da "grobe" encoderscheibe eingebaut
GoTurn (150, 0, 200);}
Msleep(1000);

for (x=1; x<=2; x++) //Asuro fährt einen kreis vorwärts und rückwärts
{if (x==1)
GoTurn (300, 90, 255);
else
GoTurn (-300, -90, 255);
Msleep(500);}
break;


Gruß Alex

Valen
05.06.2009, 10:33
Das habe ich gesehen, aber das macht nichts wenn du '1' oder '2' gesendet hast. Die Goo und Goturn danach mussen auch den odoleds an haben.

Was du uberhaupt zum Asuro sendet oder dem welchen Taster eindrucken du machst hast du auch noch nicht erzahlt. Sehr wichtig weil wir nicht sehen konnte welchen funktionen Asuro in seinem gehirn auf jeder stelle anruft. Und du kanst das eigentlich aucht nicht. Das geht manch zu schnell. Aber glucklich hast du viel StatusLED funktionen und Msleep's um das zu beurteilen. Das ist aber nicht immer so.

schocksnert
05.06.2009, 13:19
Hmm am besten wir Versteifen uns jetzt nicht nur auf mein anfänger Programm. Habe den Fehler des Schwachen motor´s auch wenn ich andere Programme wie z.b. die Examples aus der 2.71 Lib aufspiele.

Werd auch später mal die 2.80 Lib ausprobieren, vielleicht bringt mir das mehr oder vielleicht ist der Fehler da auch ganz weg.

Hatte bisher bei der neuen Lib probleme mit dem Flashen, wenn ich da änderungen gemacht hab.
Werd euch heut abend mehr dazu erzählen können.

Valen
05.06.2009, 13:25
Hmm am besten wir Versteifen uns jetzt nicht nur auf mein anfänger Programm. Habe den Fehler des Schwachen motor´s auch wenn ich andere Programme wie z.b. die Examples aus der 2.71 Lib aufspiele.Ok, dan wurde es moglicherweisse etwas anderes sein. Du weisst das die 2.71 und 2.8 lib neu kompiliert sollten werden mit deine odometrie 'dunkelheit'-werten und den 'tick-pro-meter'-faktor im myasuro.h???

schocksnert
06.06.2009, 13:55
Hallo Valen, hab die Lib jetzt bestimmt 20x Übersetzt immer das gleiche ergebnis.

Hab daher noch mal etwas rumgebasstelt und nun Versteh ich es gar nicht mehr.
Auch bei der 2.80 Lib ist es das gleiche.
Daher hab mal angefangen mein Goo richtig zu machen.


void Goo(int d,int l) //eigene go anweisung
{
StatusLED(GREEN);

SetMotorPower(d,d+5); //Fahr los mit vorgegebenem Tempo,richtung über +/- Wert

l=l*38/10; //l ist die Strecke die zurück gelegt werden soll. 1cm = 3.8 ticks
EncoderInit();
for(encoder[1]=0; encoder[1]<=l; x++)
{
Msleep (10);
}
MotorSpeed(BREAK,BREAK);
}

Das komische an der ganzen sache ist hier funktioniert das ganz wunderbar. Asuro fährt grade UND beide Motoren haben die gleiche Power. :-k :-s

Valen
06.06.2009, 14:19
Wenn du es komplet umgebastelt hat wurde es naturlich besser sein den complet geanderten code zu posten. Damit jeder etwas davon lernen kan. Aber nun alles klapt is es auch ok naturlich. =D> Aber welche modifikation hat das gemacht. :-k



for(encoder[1]=0; encoder[1]<=l; x++)Vernunftige losung, aber die x++ ist optionel in diesen fall. Den for-Schleife endet dan in:


for(encoder[1]=0; encoder[1]<=l; )

Du machts nicht mit den zahler x weiterhin, oder es hat gar keine relation mit die variabele l. deshalb kan es weg. Und den for-schleife geht doch weiter bis die encoder[1] wert grosser wie l ist. Im princip sind die for-schleife und while-schleife sehr ahnlich. Den for-schleife hat nur ein initialisierung und moglicherweise ein zahler eingebaut. Aber nicht verpflichted.

Valen
06.06.2009, 14:34
Hmm, versuch die selbe code eins mal mit encoder[0]. Wie geht das? Im vergleich mit dem encoder[1] fall.

schocksnert
06.06.2009, 16:36
Ohh man, das ich da nicht früher drauf gekommen bin ](*,)

Wenn ich mit encoder[0] arbeite hab ich genau das gleiche Problem.

Werd also die Schaltung noch mal in diese Richtung prüfen müssen.
Vielen Vielen Dank!!!!

Hab da aber ein anderes kleines Programmtechnisches Problem.
Vielleicht kann mir da mal jemand helfen. Hab wahrscheinlich ne kleine Denkblockade.

Denn jedesmal wenn ein case im Switch fertig ist hängt sich mein Programm auf.




#include "asuro.h"
#include "myasuro.h"

int x=0; //Zählvariablen für diverse Zählschleifen
char emfangene_daten[10];


void Goo(int d,int l) //eigene go anweisung
{
StatusLED(GREEN);

SetMotorPower(d,d+5); //Fahr los mit vorgegebenem Tempo,richtung über +/- Wert

l=l*38/10; //l ist die Strecke die zurück gelegt werden soll. 1cm = 3.8 ticks
EncoderInit();
for(encoder[1]=0; encoder[1]<=l; ) //Abfrage nur von einem Encoder, da der andere defekt ist!
{
Msleep (10);
}
MotorSpeed(BREAK,BREAK);
}


int main(void)
{


Init(); //Devinierter Zustand vom ATMEL


while(1)
{
while (PollSwitch() == 0)
{
StatusLED (GREEN);
Msleep (500);
StatusLED (RED);
Msleep (500);
}

switch (PollSwitch()) //Auswahlmenü gesteuert über Pollswitch
{
case 1:emfang(); //aufruf von Emfang
break;

case 4: //Kleine Fahranweisung zu Demo zwecken.
StatusLED (YELLOW); //Funktioniert nicht!!!!
Msleep (2000);

EncoderInit ();
for (x=1; x<=4; x++) //Asuro fährt ein quadrat
{GoTurn ( 0, 45, 200); //45° hier entspricht 90° drehung im real, da "grobe" encoderscheibe eingebaut
GoTurn (150, 0, 200);}
Msleep(1000);

for (x=1; x<=2; x++) //Asuro fährt einen kreis vorwärts und rückwärts
{if (x==1)
GoTurn (300, 90, 255);
else
GoTurn (-300, -90, 255);
Msleep(500);}
break;


default: //Bei falscheingabe blinkt die Status LED 5x Gelb
for(x=1; x<=5; x++)
{StatusLED(OFF);
Msleep(500);
StatusLED(YELLOW);
Msleep(500);}
break;
}

return 0;
}
}

int emfang(void) //Steuerung über Seriel
{
EncoderInit ();


StatusLED (YELLOW);
BackLED (ON, OFF);
Msleep (500);
BackLED (OFF,ON);
Msleep (500);
BackLED (OFF,OFF); //AUS damit, sonst probleme mit Odometrie!!!!

SerWrite ("READY", 10);
SerPrint ("\n\r");
SerRead (emfangene_daten, 1, 0); //Warte auf Daten, ohne timeout!!

switch (emfangene_daten[0])
{
case'T': //keine Daten erhalten
break;

case '1': //Wenn daten =1 fahr vor.
Goo( 100, 10);
break;

case '2': //wenn daten =2 fahr zurück
Goo (-100, 10);
break;

default: //sonst sendefehler 5xgelb
for(x=1; x<=5; x++)
{
StatusLED(OFF);
Msleep(500);
StatusLED(YELLOW);
Msleep(500);
}
break;
}
return 0;
}

Schon einmal Danke im Vorraus O:)

Besserwessi
06.06.2009, 17:11
Hinter dem Case Statement ist das programm ja auch irgendwie zuende. Das Resturn 0 ist da zuviel, da sollte das Porgramm nie hinkommen. Wo solle es auch zurück hingehen von Main.

Sternthaler
07.06.2009, 03:23
Hallo schocksnert (erinnert mich an 'Schock schwere Not'),

erst einmal ein 'Willkommen im Forum'.

Wenn ich alles richtig mitbekommen habe, dann hast du dir selber schon die Lösung gegeben.
Der rechte Motor tut es 'angeblich' nicht. Aber halt nur beim GoTurn().
Im letzten Post von dir steht im Kommentar: "Abfrage nur von einem Encoder, da der andere defekt ist! "
Jepp, [1] ist der rechte Motor. Und da scheint deine Odometrie ja zu funktionieren.
Also ist klar, das deine linke ODO-Seite eine Macke hat.
In GoTurn() aber versuchen beide Seiten ausgewogen zu agieren. Also muss bei defekter linker ODO-Seite der Motor drehen, drehen, drehen. Aber es passiert nichts an den linken ODOs.
Das Programm denkt also links ist keine Drehung und regelt die RECHTE Seite auf 0-Speed bis endlich Impulse von der linken Seite kommen.
Die aber bleiben aus, und somit dreht der linke Moter die Zahnräder platt.

Du hast also die mühevolle Aufgabe, dass du erst die linke Odometrie reparieren musst.

Gruß Sternthaler.

P.S.: Schön, dass dir mein Programm gefällt. Auch wenn es hier nicht helfen kann.
Gib mal ne'n Tipp, wo hier Schnaps getrunken wird. Den Thread muss ich mir unbedingt ansehen ;-)

schocksnert
07.06.2009, 09:35
Hey danke für die schnelle Antwort.
Werd die änderungenspäter mal ins Programm einpflegen und dann natürlich darüber berichten. Das mit dem Schnapps hatte ich bei der Suche nach der "Perfekten" abdeckung der Odometrie entdeckt und fand die Idee einfach nur Klasse Underberg (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=45551&highlight=underberg)

Valen
08.06.2009, 00:22
Das ist am ende deine main code:


...
return 0;
}
}Siehst du warum er absturtzt? Den einer-letzte hacke ist noch von den while(1)-schleife. Den return 0; gehört dahinter.

schocksnert
08.06.2009, 07:34
Hey danke für die Hilfe, manchmal sieht man vor lauter Bäumen den Wald nicht.

Aber jetzt Funktioniert er einigermaßen. Muss jetzt nur noch den Fehler am Encoder finden. Bin aber guter Dinge das ich das Finde.

Noch einmal VIELEN VIELEN DANK an alle die mir geholfen haben!!!!

Grüße Alexander