PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei Programm



. . . . .
25.03.2008, 09:51
Ich hab ein Linienfolgeprogramm geschrieben, aber gewisse Probleme damit er merkt zwar, dass er rechts oder links von der Linie abkommt (dass merk ich weil er die LEDs ändert), aber er ändert die Umdrehungen von den Motoren nicht und dann dreht er sich die ganze Zeit im Kreis.


#include "asuro.h"
#include <stdlib.h>
#include <stdio.h>

#define OFF_LEFT -1
#define ON_LINE 0
#define OFF_RIGHT +1
#define VARIA 400
#define SPEED 254
#define SLOWSPEED 220

unsigned int data[2];
int Offset;
int left,right;

void Left (void)
{
left -= 1;
if (left < SLOWSPEED) left = SLOWSPEED;
}

void Right (void)
{
right -= 1;
if (right < SLOWSPEED) right = SLOWSPEED;
}


int main(void)
{
int inlines;
int j=0;
int position;
Init();
FrontLED(ON);
StatusLED(GREEN);
LineData(data);
Offset = data[0] - data[1];
left = right =SPEED;
MotorDir(FWD,FWD);
MotorSpeed(0,0);
while(1){
LineData(data);
inlines = (data[0] - data[1]) - Offset;
if (inlines > 4)
{
StatusLED(GREEN);
Left();
BackLED(OFF,ON);
position=0;
}
else if (inlines < -4)
{
StatusLED(GREEN);
Right();
BackLED(ON,OFF);
position=1;
}
else {
StatusLED(RED);
left = right =SPEED;
BackLED(OFF,OFF);
position=3;
}
if(position=0){MotorSpeed(left,SPEED);}
else if(position=1){MotorSpeed(SPEED,right);}
else{ MotorSpeed(SPEED,SPEED);}
}
return 0;
}



Hoffentlich könnt ihr mir helfen.
[/code]

. . . . .
25.03.2008, 10:57
Ich war schon mal so weit, dass es funktioniert hat, aber dann hab ich was verändert und seitdem geht nichts mehr

harry3
25.03.2008, 10:58
Das ganze läuft viel zu schnell ab.
Du erhöhst die Geschwindigkeit so schnell, da können die trägen Motoren niemals folgen. Bau da also mal eine kräftige Verzögerung ein(ein paar ms pro Schleifendurchlauf).
Ein weiteres Problem ist, dass du beide Motoren hochdrehen lässt und dann wenn sie sich sehr schnell drehen auf einmal wieder zurückschaltest.
Lass die Motoren lieber mit gemütlichen 120 laufen. Und dann ändere entweder beide Motorgeschwindigkeiten gegengleich, oder einfacher, nur einen Motor. Also z.B. links immer 120, rechts variabel aber eben auch um die 120 pendelnd.

. . . . .
25.03.2008, 11:02
danke, ich werd mal eine Dummyschleife einbauen und die Motoren langsamer fahren lassen

harry3
25.03.2008, 11:05
Naja, Dummy Schleifen brauchst du zum Zeitverzögern nicht, dafür kannst du eh auf die Sleep Funktion zurückgreifen.

farratt
25.03.2008, 11:06
benutz keine dummyschleifen, sondern die Funktion Sleep aus der asuro.h

. . . . .
25.03.2008, 11:27
ich hab den fehler gefunden

beim abändern dürfte ich bei den ifs immer ein = zuviel gelöscht haben und deswegen ging es vorher und jetzt nicht

ich hab position am anfang bei if(position=0) immer auf 0 gesetzt und bin in die Anweisung des ifs reingegangen

. . . . .
25.03.2008, 13:41
ich stell mal das fertige programm rein

bei mir funktioniert es auf meiner selbstgebauten strecke mit einer Linienbreite von ca. 1,5 cm



#include "asuro.h"
#include <stdlib.h>
#include <stdio.h>

#define OFF_LEFT -1
#define ON_LINE 0
#define OFF_RIGHT +1
#define SPEED 170

unsigned int data[2];
int Offset;
int SLOWSPEED=SPEED;

int main(void)
{
int inlines;
int i=0;
int j=0;
int position;
Init();
FrontLED(ON);
StatusLED(GREEN);
LineData(data);
Offset = data[0] - data[1];
MotorDir(FWD,FWD);
MotorSpeed(SPEED,SPEED);
while(1){
LineData(data);
inlines = (data[0] - data[1]) - Offset;
if (inlines > 4)
{
StatusLED(GREEN);
BackLED(OFF,ON);
position=0;
}
else if (inlines < -4)
{
StatusLED(GREEN);
BackLED(ON,OFF);
position=1;
}
else {
StatusLED(RED);
BackLED(OFF,OFF);
position=3;
}
if(position==0){MotorSpeed(SLOWSPEED-84,SPEED);}
else if(position==1){MotorSpeed(SLOWSPEED+84,SPEED);}
else{ MotorSpeed(SPEED,SPEED);}
}
return 0;
}


Wenn ihr Verbesserungsvorschläge habt wäre ich euch sehr dankbar wenn ihr sie reinpostet. (Dann verbessert sich meine Note in Prozessregelung)

pinsel120866
25.03.2008, 14:24
Du könntest vielleicht deinen Nickname von ". . . . ." in "?????" ändern.
;-) *grübel* :-)

harry3
25.03.2008, 18:01
Ich würde an deiner Stelle den Look des Programms überarbeiten, es ist quasi nicht zu sehen welche Klammer zu welchem Block gehört. Bei einem guten Programm sieht man sowas auf den ersten Blick.
Also einrücken und einheitliche Klammersetzung!

Sowas wirkt sich normalerweise sehr positiv auf Noten aus, ohne dass man viel tun muss;-)