PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro soll vorwärts fahren-bei hinderniss-rückwärts



Problem
18.11.2010, 15:05
Hallo

Ich möchte gerne, das mein Asuro vorwärts fährt, bei einen Hinderniss ein stück zurück und dann wieder vorwärts:

Also er soll dann vor einen Wand immer vorwärts rückwärts vorwärts rückwärts fahren.

Mein größtes Problem liegt darin, wenn er vor der wand steht, dass er wieder zurück fährt.

markusj
18.11.2010, 15:25
Wenn du deinen Code nicht zeigst, kann dir keiner helfen, außer du erwartest eine fertige Lösung - Die zumindest ich nicht auftischen werde.

mfG
Markus

PS: Ein Schlagwort zum weitersuchen: State-Machine (Zustandsautomat)

Problem
18.11.2010, 16:26
Das ist das Programm


#include <asuro.h>
int main(void)
{
Init();
unsigned char;
int LANG = 0,x = 0;
MotorSpeed(110,110);
while( 1 )
{
x=x+1;

if (x > 1000)
LANG=LANG+1;
if (x > 1000)
x=0;


{
if (PollSwitch()>=1)
MotorDir(BREAK,BREAK);
else
MotorDir(FWD,FWD);
}

if (PollSwitch()>=1)
MotorDir(RWD,RWD);


if ( LANG > 1000)
LANG=0;
}

return 0;
}




Den roten teil benütze ich bei anderen Teilen aber hier bringt er mir nichts weil ich ja nicht weiß wann asuro anstoßt

Bei diesen Programm, habe ich das Problem das die dauer der Rückfahrt immer sehr kurz ist. (immer genau so lang bis der schalter wieder ausgefahren ist)

h_wood44
18.11.2010, 17:17
Hallo Markus,
deine Bemerkung, dass du "nichts auftischen" wirst finde ich sehr " überheblich".
Wenn du überhaupt in keiner Weise helfen willst - warum Antwortest du dann überhaupt?
Ich bin auch Anfänger , und solche Antworten wie RTFM usw. motivieren ungemein.
Ich bin schon etwas älter - wenn immer alles so gelaufen wäre????

Problem
18.11.2010, 17:21
So schlimm finde ich das nicht
ich habe mal das Programm hereingetan es funkt aber noch nicht

mfg

h_wood44
18.11.2010, 17:28
sorry,

mfG
oswald

Problem
18.11.2010, 17:31
nicht so schlimm

markusj
18.11.2010, 21:44
Hallo Markus,
deine Bemerkung, dass du "nichts auftischen" wirst finde ich sehr " überheblich".
Wenn du überhaupt in keiner Weise helfen willst - warum Antwortest du dann überhaupt?

Ich will durchaus helfen - Aber: Ich bevorzuge Hilfe zur Selbsthilfe. Nach meiner Erfahrung ist der Lerneffekt am größten wenn man selbst etwas erarbeitet hat. Außerdem mache ich keine Hausaufgaben anderer (was dieses Forum weniger betrifft, aber andere dafür umso mehr).

Jetzt zum geposteten Code:
Der ASURO macht genau das was du ihm "gesagt" hast: Wenn ein Taster gedrückt ist, stellst du die Motoren zuerst auf BREAK und gleich danach (Sekundenbruchteile danach um genau zu sein) auf RWD. Ab dem Augenblick ab dem die Taster keinen Wandkontakt mehr haben, konfigurierst du die Motoren wieder auf FWD.

Was du brauchst:
Eine Zeitbasis: Momentan führt dein ASURO die Schleife mit maximaler Geschwindigkeit aus - Wenn du darauf basierend versuchen würdest, über die Anzahl der Schleifendurchläufe eine Verzögerung zu realisieren, würde sich diese bei Änderungen im Code mit ändern. Es wäre daher sinnvoll, die Ausführungsgeschwindigkeit von vornherein zu reduzieren, auf vielleicht 10 oder 100 Iterationen in der Sekunde. Realisieren kannst du dies, indem du ans Ende der Schleife den sleep-Befehl stellst und eine entsprechende Verzögerung auswählst.

Zustände: Du möchtest Dinge in Abhängigkeit von vorherigen Ereignissen ausführen, dafür musst du dir das in irgend einer Form merken. Für deine Wünsche gibt es zwei Möglichkeiten. Entweder du nimmst eine Zählervariable die auf einen bestimmten Wert gesetzt wird, wenn du Tasterkontakt hast. Gleichzeitig wird der Rückwärtsgang "eingelegt". In der Hauptschleife reduzierst du die Variable in jeder Iteration um eins, ist sie bei 0 angelangt, konfigurierst du den ASURO wieder auf vorwärts.
Was erreichst du damit? Solange die Taster auslösen, wird die Variable auf den Verzögerungswert gesetzt und gehalten. Wenn die Taster nicht mehr auslösen, wird der Wert mit jedem Schleifendurchlauf reduziert. Da die Schleife aber nur begrenzt schnell läuft, kannst du aus der Zeit für eine Schleifeniteration bestimmen, wie lange der ASURO braucht bis er bei 0 angekommen ist und auf vorwärts umstellt.

Wenn du später kompliziertere Programme schreiben willst,reicht dir der Trick mit der Zählvariable vielleicht nicht mehr aus, dann kannst du noch eine Zustandsvariable einführen. In deinem Fall gibt es (momentan) nur die Zustände: "Vorwärts" und "Rückwärts", es könnte aber auch sein dass du vielleicht noch einen Zustand "Bremsen" einführen möchtest ...
Dann wird einfach im Ereignis das den Zustandswechsel auslöst der neue Zustand und die Verzögerungsvariable gesetzt. Nachdem die Zeit für den Zustand abgelaufen ist, kann dann anhand des alten Zustands entschieden werden, ob und wenn ja, welcher Zustand der Neue sein soll.

Das war jetzt vielleicht etwas viel auf einmal, wenn ich morgen Zeit haben sollte, kann ich dir evtl. mit einem kurzen Codeschnipsel zeigen wie das ganze gemeint ist.

mfG
Markus

Problem
20.11.2010, 20:21
#include "asuro.h"
int main (void)
{
Init();
int z;

MotorSpeed(110,100);

while(1)
{


if (PollSwitch()< 1)
{MotorDir(FWD,FWD);
BackLED(ON,OFF);}
else
{MotorDir(FWD,RWD);
BackLED(OFF,ON);}
for(z=0 ; z < 230 ; z++){Sleep(216);}

MotorDir(FWD,FWD);





}

return(0);
}



Das funkt jetzt vielen dank für die Hilfe
kenn mich voll aus