PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro: Ein Motor langsamer



dehein2
20.02.2006, 10:43
Hallo,
ich habe gerade meinen Asuro fertig zusammen gebaut und habe ine kleines Problem: Eingenlich scheint alles zu klappen beim selftest, nur der linke Motor dreht aus irgend einem Grund langsamer. Die Kontakte sind eigentlich ganz ordentlich gelötet und beide Motore sind auch auch gleich leichtgängig zu drehen... wenn ich aber beide mit 255 anstuere macht der roboter eine doch recht beachtliche Linkskurve.... hat da jmd eine Idee?


und dann habe ich mich mal an einer ersten Kleinigkeit probiert: Der ROboter fährt gerade aus (wenn die Motoren das machen würden :) ) und wenn ein Sensor gedrückt wird fährt er mit ner linkskurve zurück und nach ein paar Sek wieder geradeaus... so weit so gut nun fährt der roboter los und wenn ich nen Taster drücke fährt er auch zurück, aber danach macht er was er will, mal vor dann zurück.. woran kann das liegen? Hier mal der Code:


#include "asuro.h"

int main(void)
{
Init();
int i;


while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(255,255);
StatusLED(GREEN);

unsigned char taster;
taster = PollSwitch();
taster = PollSwitch();
taster = PollSwitch();


if(taster>0)
{

for (i=0; i<900; i++)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(100,200);
Sleep(216);
}

MotorSpeed(0,0);
}
}

while(1);
return 0;
}

wäre für Hilfe dankebar - gruß dennis

SeveQ
20.02.2006, 11:34
Wenn das hier so ist, wie in echtem ANSI C, dann solltest du erstmal die verwendeten Variablen initialisieren.



int i = 0;
.
.
.
unsigned char taster = 0;


Ob das allerdings dein Problem behebt, wage ich zu bezweifeln.

dehein2
20.02.2006, 11:56
ich initialisiere i doch ganz am amfang mit "int i;" und setzte dann i bei jedem schleifenaufruf auf 0 zurück, oder?

SeveQ
20.02.2006, 12:16
Du deklarierst i mit


int i;


Danach hat i aber einen undefinierten Wert. i initialisieren, also ihm einen definierten Anfangswert geben, tust du mit


int i = 0;


Wobei i danach dann statt des undefinierten Zustands logischerweise den Wert 0 hat.

dehein2
20.02.2006, 12:18
ok, ich probiere es mal aus - kann ja nie schaden :))

SeveQ
20.02.2006, 12:24
Genau... Erwarte deinen Bericht. :)

dehein2
20.02.2006, 13:16
Hallo,
hat leider nichts gebracht.. :(((

SeveQ
20.02.2006, 13:24
Hmm, aber wenigstens ist es jetzt programmatisch korrekt. :)

Jetzt kann ich dir aber nicht weiterhelfen, da der Code für mich als reiner Programmierer zwar unsauber, aber doch lauffähig aussieht. Ich kenne mich mit den Funktionen des Asuro gar nicht aus. Deshalb kann ich dir auch nicht sagen, welchen Wert 'taster' haben müsste, nach dem der eigentliche Taster einmal gedrückt und einmal wieder losgelassen wurde. Hätte er - was nach meinem Verständnis so sein müsste - nach dem Loslassen wieder den Wert 0, müsste dein Programm funktionieren. Das scheint nicht der Fall zu sein. Hast du die Möglichkeit, dir den Wert von 'taster' ausgeben zu lassen? Irgendwie mit 'nem Display oder so? Oder gibt es eine Art "Simulator" oder Debugger für solche Zwecke?

Manni2k
20.02.2006, 17:48
Hi, habe gerade meine Vermutung nochmal in der Praxis bestätigen lassen:
es liegt an deiner Abfrage


unsigned char taster;
taster = PollSwitch();
taster = PollSwitch();
taster = PollSwitch();


if(taster>0)
{


stattdessen:


if(PollSwitch()>0)
{

Dann funktionierts ;)

Wieso hast du überhaupt drei Mal hintereinander den Wert übergeben?

Also meiner Meinung nach müsste es am Typ "unsigned char" liegen - PollSwitch() gibt doch eine integer Wert zurück oder? Musste mal in die asuro.h oder asuro.c schaun

EDIT: hm nach einer kleinen recherche käme ich auch auf deinen code wenn ich es ausformulieren müsste...versteh nicht, warum dein code nicht funktiniert, aber irgendwie liegt es trotzdem daran - bei mir zumindest

SeveQ
20.02.2006, 18:07
Drei mal hintereinander vermute ich mal zur Entprellung des Tasters.

Und solange der von einer Funktion zurückgegebene Wert <= 255 (bei unsigned) ist, ist es kein Problem, einen int nach char zu casten. Bei Werten > 255 gibt es allerdings einen Überlauf.

dehein2
20.02.2006, 18:26
also im Asuro Handbuch ist das genau so wie ich das gemacht habe, mit unsigned char!?!?!?!?!?!?! ändern hilft auch leider nichts..

hat noch jmd. ne idee zu dem langsameren Motor?

Manni2k
20.02.2006, 18:32
ändern hilft auch leider nichts
öh? bei mir schon...probier bitte folgenden code nochmal:



#include "asuro.h"

int main(void)
{
Init();
int i=0;

while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(255,255);
StatusLED(GREEN);

if(PollSwitch() > 0)
{
for(i=0; i<900; i++)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(100,200);
Sleep(216);
}

MotorSpeed(0,0);
}
}

return 0;
}

MSSputnik
21.02.2006, 09:04
Hallo,

ich hatte mal den Fall, das ich einen Motor austauschen mußte.
Ein anderes mal war es aber das Programm.

Daher teste zuerst mal mit einem total simplen Programm:

#include "asuro.h"

int main(void)
{
Init();
int i=0;

MotorDir(FWD,FWD);
MotorSpeed(150,150);
while (1) ;

return 0;
}

dehein2
21.02.2006, 11:29
Hallo,
danke ihr beiden, also das Programm mit dem Taster macht auch was es will, eigentlich komisch, die Taster haben mit dem Testprogramm gut funktioniert... der fängt sofort an mit vor-zurück-zuück,1sek vor, zurück, vor :)))))

naja und bei dem Motortest ist leider der linke wesentlich langsamer, an wen kann ich mich denn da wenden um nen neuen zu bekommen?

MSSputnik
21.02.2006, 11:45
Hallo,

ich habe mich einfach an meinen nächsten Elektronikhändler (Conrad) gewandt.

kostet nicht die welt.

Martin

dehein2
21.02.2006, 11:51
dann werd ich da mal mit dem Motor vorbei gucken, die sollten ja erkennen welchen ich dann brauche.. danke


aber mit den Tastern das ist doch komisch, oder?

Manni2k
21.02.2006, 16:20
naja und bei dem Motortest ist leider der linke wesentlich langsamer, an wen kann ich mich denn da wenden um nen neuen zu bekommen?
ist das nicht normal dass die beiden motoren nicht perfekt justiert sind? müsstest du ein programm schreiben, das über die lichtschranken seitlich die motoren so einstellt, dass der asuro geradeaus fährt.

dehein2
21.02.2006, 16:25
nicht genau justiert wäre ja schön, aber linke dreht echt wesentlich langsamer, höchstens 30% so schnell

dehein2
26.02.2006, 17:37
ok, habe einen neuen Motor, klappt soweit, jetzt habe ich noch ein Problem mit den Tastern, alle Wiederstände sind ok, aber irgenwie stimmt da etwas nicht... habe folgendes Programm, welches soweit funktioniert: habe es erst ohne den "Rechts" Teil gemacht und alles klappt" mit dem "Rechts" Teil, führt er immer die if schleife für rechts aus... etwas komisch...



#include "asuro.h"

int main(void)
{
Init();
int i=0;
unsigned char t1, t2;
while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);
SerWrite("Norm.",5);



t1 = PollSwitch();
t2 = PollSwitch();
if(t1 && t2 && t1 == t2)
{
if((t1 == 16) || (t1 == 18) || (t1 == 2))
{
SerWrite("Front",5);
for(i=0; i<500; i++)
{

StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(100,200);
Sleep(216);
}

MotorSpeed(0,0);
}
}



t1 = PollSwitch();
t2 = PollSwitch();
if(t1 && t2 && t1 == t2)
{
if((t1 == 32) || (t1 == 48))
{
SerWrite("Left.",5);
for(i=0; i<300; i++)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(30,150);
Sleep(216);
}

MotorSpeed(0,0);
}
}



t1 = PollSwitch();
t2 = PollSwitch();
if(t1 && t2 && t1 == t2)
{
if((t1 == 1) || (t1 == 3))
{
SerWrite("Right",5);
for(i=0; i<300; i++)
{
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(150,30);
Sleep(216);
}

MotorSpeed(0,0);
}
}



}
while(1);
return 0;
}


im Prinzip liest er also die Taster richtig aus da ich ja z.b bei 16 etwas mache. aber in dem moment, wo ich den 6er verwende nimmt er den Immer

super_castle
26.02.2006, 20:25
die motoren gehen auch kaputt wenn nicht gewährleistet ist das der motorstrom komplett null ist. manchmal schalten die pwm nicht total auf null. es ist besser wenn der port abgeschaltet wird.

Arexx-Henk
26.02.2006, 22:12
if(t1 && t2 && t1 == t2)

ich kann mich irren aber ich denke da 't1' ein 'unsigned char' ist steht hier eigentlich

if( ( t1 != 0 ) && ( t2 != 0 ) && ( t1 == t2 ) )

oder:

if( ( t1 == TRUE ) && ( t2 == TRUE ) && ( t1 == t2 ) )

wenn eine taste gedruckt wird sind t1 und t2 immer TRUE

in asuro.h steht
'#define TRUE 1'
aber jeden 'unsigned char' nicht-null Wert wird vom C-compiler als TRUE interpretiert.

gruss

Henk

dehein2
28.02.2006, 00:14
hmm. ich habe das beispeil von einer anderen seite, und es ging wohl darum zu prüfen, dass auch beide Variablen gleich sind also der PollSwitch richtig ausgelesen wurde, da ja t1 und t2 in dem fall gleichs ein müssten, oder?

Arexx-Henk
28.02.2006, 14:27
Ja, wenn mann sich dass so anschaut musste dass schon stimmen.

Vielleicht braucht mann nicht zweimahl pollswitch an zu rufen wenn mann die verzogerung im pollswitch 'sleep(10)' etwas grosser macht z.B. 'sleep(20)'
Damit wird dann 20 milliseconden gewartet bis das analog Signal sich stabilisiert hat uber die condensator bevor die AD-converter AD-wandlung statt findet.

gruss

Henk

dehein2
28.02.2006, 14:58
hmm, hat evtl jmd mal ein programm was tod sicher funktioniert, damit ich mal testen kann, ob da alles mit rechten dingen zu geht??? :)

McClaude
28.02.2006, 23:46
Hallo, (wie auch immer du heissen magst)

um den PollSwitch mehrfach sicher abzurufen mußt Du den Durchschnittswert einer Mehrfachabfrage rannehmen.

int sw = 0;
sw = PollSwitch();
sw = PollSwitch()/2;
sw = PollSwitch()/2;
id (sw>0) // oder wie immer

Auch hatte ich den Fall daß in der downgeloadeden asuro.c und asuro.h die PollSwich Funktion geändert wurde. Nach einfügen der orginal PollSwitch funktion haben meine Taster alle wieder funktioniert.
Und hast Du den selftest Kompiliert oder als Hex geflasht?
Darüber kannst du rausfinden obn Dein Problem in der asuro.c liegt.

Viel Erfolg,

der CLAUDE

McClaude
28.02.2006, 23:50
Ich bin zu doof,
Was ich schrieb is richtig, nur der Code ist falsch.
Hier richtig:

int sw = 0;
sw = PollSwitch();
sw = (sw+PollSwitch())/2;
sw = (sw+PollSwitch())/2;
id (sw>0) // oder wie immer...

Ich sollte heim gehen und schlafen...
Aber vermutlich wird das die 11 Nacht die ich mit meinem ASURO alleine verbringe :-)

Alas, CLAUDE

FrankyD80
19.04.2006, 16:29
Hi bei mir hat folgendes ganz gut geklappt:

if(PollSwitch()&PollSwitch())
{
// dein Code;
}

Da beim Ansteuern der Motoren die Werte von den Tastern schwanken, kommen seltsame Kombinationen heraus. Hatte auch das Problem, dass er bei jedem vorfahren dachte, ein Taster sei gedrückt.

Das Bitweise verunden sorgt dafür, dass nur die meisten fehlerhaften Kombi´s herausgefiltert werden.

McClaude
19.04.2006, 18:29
Hallo an Alle,

Ich habe mittlerweile eine kleine Waffe für die Pollswitches. Das funktioniert bei mir perfekt.
Hier der Code:

unsigned int taste, taste1, taste2;
taste = 0;
taste1 = PollSwitch();
Msleep(1);
taste2 = PollSwitch();
if (taste1 == taste2)
{taste = taste1;}

Testet den mal, und schreibt wie es läuft,

Alas, der CLAUDE

dehein2
19.04.2006, 20:02
danke - werde ich mal machen :)

ExtreamCoder
21.04.2006, 23:45
Ein ähnliches Problem plagt mich eigentlich auch.
Es könnte aber auch durchwegs sein dass der Motor nicht richtig montiert ist ich habe ihn auch nicht schön genug mit dem Kabelbinder angemacht und schon übersetzt er seine Umdrehungen nicht richtig aufs große Zahnrad. Damit werde ich mich mal spielen müssen.
Eventuell sollte man auch mal messen ob an beiden Motoren die selbe Spannung abfällt.

FrankyD80
22.04.2006, 20:26
Hi

Ich habe auch immer einen kleinen Rechtsdrall beim Asuro -> rechter Motor langsamer.

Nun dachte ich mir:

-einmal die Odometrie so lange auslesen, bis der offset, den ich auf die einzelnen Motoren gebe dafür sorgt, dass beide Räder gleich schnell drehen und somit die differenz zwischen encoder[LEFT] und encoder[RIGHT] = 0 ist
-diesen Wert immer bei Speedangaben mit draufrechnen

Ich musste zum Beispiel, wenn beide Motoren vorwärts fahren rechts +4 und links -4 draufgeben, damit die Kiste gerade fährt. (TestSpeed 150)

Das Problem ist nun, dass der Unterschied der Motoren nicht nur von der Geschwindigkeit abhängt (bei 200 war +und- 4 wieder Schei*e), sondern auch von der Richtung.

Rückwärts fährt er zum Beispiel ohne Offset gerade, wenn ich langsamer, als 120 und schneller als 80 bin.

Also ist eine einmalige Einstellung, also ein Offset nicht sinnvoll.

Besser ist es, den Encoder einmal zu starten und vor jeder absolut geraden Fahrt auf 0 zu setzen und permanent abzufragen, ob beide die gleichen Werte haben -> gegebenenfalls gegensteuern.

Ist eine recht gute Lösung, wenn es nach meinem alten Ausbilder geht, der gerne alles und jeden in einen Regelalgorithmus packen wollte.
(einschwingen) war sein Lieblingswort
Allerdings finde ich diese Lösung recht umständlich, da jede gerade Fahrt in eine Schleife gepackt werden muss, die permanent die Odometrie abfragt.
Eine Lösungsidee ist jetzt ein Interrupt, der bei einer Abweichung von über (denkt euch was aus) die Korrektur anspricht. Hat jemand Ahnung oder bessere Ideen?

ExtreamCoder
23.04.2006, 23:49
Bei mir kriegt die komplette rechte Seite weniger Spannung.
die rote led hinten leuchtet schlechter und bei MotorSpeed(100,100);
kriegt er nu 1,33V der andere 1,79V.