PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mal wieder linienverfolgung....



luckylukas92
27.11.2008, 17:28
Hallo
und vielen dank an alle di versuchen mir zu helfen :D

Ich habe ein (mehr oder weniger) kleines programm zur linienverfolgung geschrieben



#include "asuro.h"

timewait(unsigned int t) // 1 sek pause
{
unsigned int pause;

for (pause=0; pause<t; pause++) // 1 millisekunde Pause
{ Sleep (72);
}
}


int main(void) {
unsigned int data[2];
unsigned char links,rechts;
int diffl,diffr,i,ledonl,ledonr,ledoffl,ledoffr,ledon, ledoff,diffrf,difflf,j,rab;
//rab=regelabweichung

Init();


for (i = 0; i < 2; i++ ) {
FrontLED(ON);
LineData(data); // Messung mit LED ON
ledonl = data[0];
ledonr = data[1];
timewait(500);

/*FrontLED(OFF);
LineData(data); // Messung mit LED OFF
ledoffl = data[0];
ledoffr = data[1];
timewait(500);

*/

ledon = (ledonl - ledonr); // Regelabweichung mit LED ON

/*
ledoff = (ledoffl - ledoffr);// Regelabweichung mit LED OFF ->noch keine verwendung


diffl = ledonl - ledoffl; //differenzen
diffr = ledonr - ledoffr;
*/


rab = ledon; // Regelabweichung
timewait(500);
}

while(1) {
FrontLED(ON);
MotorDir(FWD,FWD);
LineData(data);
difflf=data[0]-data[1]-rab;
diffrf=data[1]-data[0]-rab;
links=120-(diffrf*3); //noch zu langsam
rechts=120-(difflf*3); //noch zu langsam

if (links&&rechts >= 120) // auf gerader strecke schneller //geht nicht
{
links&&rechts == 180;
}

if (data[0] && data[1] < 30) //prüfung ob weggabelung oder ende
{
for (j = 0; j < 5; j++ )
{
if (j <= 4&&data[0] && data[1] < 30) // 0,4sek lang gerade aus
{links=90;
rechts=90;
timewait(100);}

if (j > 4&&data[0] && data[1] < 30) //wenn immernoch schwarz stop
{links=0;
rechts=0;}
}
}

if (links>120)
{
links=120;
}

if (rechts>120)
{
rechts=120;
}
MotorSpeed(links,rechts);
}
return 0;
}


und jetzt hat meine kleine schwester meinen asuro kaputt gemacht :P ...kann bitte mal jmd testen ob das so in etwa klappt?
also die linienverfolgung müsste funktionieren das hatte ich noch selbst getesten mir geht er hauptsächlich um die beschleunigung auf geraden und das stoppen bei nem dicken schwarzen strich (das habe ich bei meinen zeicnungn immer am ende)

desweiteres wollte ich fragen ob es möglich ist dieses programm so zu erweitern das es im 90° winkel um ecken fahren kann ..und wenn ja natürlich wie^^

mfg lukas
und nochma vielen dank an die leute die sich das programm mal drauf machen
Ps:sry ich war noch nie gut in deutsch

luckylukas92
28.11.2008, 19:39
hats jmd getestet? bitte posten obs klappt :P is mir wirklich wichtig..plz

oberallgeier
28.11.2008, 20:04
... und jetzt hat meine kleine schwester meinen asuro kaputt gemacht ...Liegt das an der dunklen Jahreszeit, dass kleine Schwestern asurofeindlich reagieren?

https://www.roboternetz.de/phpBB2/viewtopic.php?t=37330

luckylukas92
28.11.2008, 22:12
also bei meinem asuro is ziemlich sichtbar was kaputt ist :P in der mitte durchgeborchen...hat sich draufgesetzt..aber ich war schuld hab ihn aufem boden stehen lassen...haste getestet obs geht?
edit: hab wieder nen funktionstüchtigen asuro...
so ich habe das programm jetzt getestet und es funktioniert soweit ganz gut...
jetzt habe ich folgendes problem:


#include "asuro.h"

timewait(unsigned int t) // millisekundenwert als t eingeben
{
unsigned int pause;

for (pause=0; pause<t; pause++) // 1 millisekunde Pause
{ Sleep (72);
}
}


int main(void) {
unsigned int data[2];
char links,rechts;
int diffl,diffr,i,ledonl,ledonr,ledon,rab,x,rr,lr;


Init();


for (i = 0; i < 2; i++ ) {
FrontLED(ON);
LineData(data); // Messung mit LED ON
ledonl = data[0];
ledonr = data[1];
timewait(500);

ledon = (ledonl - ledonr); // Regelabweichung mit LED ON

rab = ledon; // Regelabweichung
timewait(500);
}

while(1) {
x=120; //maximalgeschwindigkeit
FrontLED(ON);
LineData(data);
diffl=data[0]-data[1]-rab; //diff links zu rechts
diffr=data[1]-data[0]-rab; //diff rechts zu links
links=x-(diffr*4);
rechts=x-(diffl*4);
if (links<=0)
{
BackLED(ON,OFF);
links = links*-1;
lr=RWD;
x=90;
}
if (rechts<=0)
{
BackLED(OFF,ON);
rechts = rechts*-1;
rr=RWD;
x=90;
}

if (x-diffl*6>0)
{
lr=FWD;
}
if (x-diffr*6>0)
{
rr=FWD;
}


if (links>x)
{
links=x;
}

if (rechts>x)
{
rechts=x;
}


MotorSpeed(links,rechts);
MotorDir(lr,rr);
}
return 0;
}

ich wollte einbauen , dass wenn die kurve zu scharf ist nicht nur die geschwindigkeit variiert wird sondern , dass ein motor sogar "RWD" dreht.
...das funktioniert nicht ... hat jmd nen lösungsvorschlag?? wäre sehr dankbar