PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro in RC-Auto



joi
22.08.2008, 13:31
Hallo
hab mir vor ca 2 wochen einen asuro zugelegt. Den habe ich dann sofort in ein kaputtes RC Auto(Porsche) eingebaut, in dem aber die motoren noch funktioniert haben. Die Taster habe ich mit kabeln nach außen geführt und am rc befestigt. Die BackLED habe ich auf dem Dach befestigt. Die Infrarot Schnittstelle habe ich vorne befestigt, um auch entfernungen zu messen. Funktioniert alles Hardware und Software technisch super. Nur beim Linienverfolgung habe ich ein Problem. Der Lenkmotor ist zu träge, um eine lenkung schnell auszuführen. Deshalb hat der RC Asuro wenn er einlenkt schon die Linie verloren. Ich könnte zwar den Antrieb verlangsamen, aber da das RC normalerweiße ein 9,6 Volt Auto ist, und ich mit 5,5 Volt fahre, befürchte ich, das der Motor nicht in Gang kommt. Und würde auch nicht gut aussehen, wenn ein Porsche so langsam fährt O:) . Nun habe ich mir gedacht, das ich so programmiere, das wenn links und rechts von der Linie das Licht gleich ist(mit Toleranz) das er dann immer gerade aus fährt. Und sobalt er zb eine rechtskurve schneidet, wird eine funktion abgespielt, die eine halbe sek nach rechts fahren lässt. Nun meine Frage: Wie kann ich bei der Linienverfolgung eine Toleranz einstellen? Mein bisheriger Code:





LineData(data);
if (data [0] == data [1] )
{
vor(200);
BackLED(OFF,OFF);
}
if (data [0] < data [1] )
{
links(400);
BackLED(ON,OFF);
}
if (data [0] > data [1] )
{
rechts(400);
BackLED(OFF,ON);
}

Der funktioniert auch, nur halt wenn links und rechts der identische wert zurückkommt.

hai1991
22.08.2008, 17:36
hallo joi

ich glaube das hir müsste funktionieren:



#define toleranz 10 //toleranz definieren, um sie leichter ändern zu können

int main()
{

//...

if(data[0]>(data[1]+toleranz))
{
//code falls links größer als rechts + Toleranz
}
else if(data[0]<(data[1]-toleranz))

{
//code falls links kleiner als rechts - Toleranz
}
else
{
//wert sind gleich (mit toleranz)
}


ich hoffe du kannst etwas damit anfangen

joi
22.08.2008, 21:14
also toleranzmäßig funkitoniert mehr oder weniger ist noch ne einstellungssache. Aber er braucht so lange, um die sensoren für die linienverfolgung abzufragen. Kann man den Code "beschleunigen"?

#include "asuro.h"
#include <stdlib.h>
#define toleranz 20

void delay(int zlr);
void gerade();
void zuruck(int timezuruck);
void links(int timelinks);
void rechts(int timerechts);
void vor(int timevor);
void lk(int timelk);
void rt(int timert);
void taster();
void porsche();

unsigned char taste;
unsigned char PollSwitch(void);
unsigned int data[2];
unsigned int j=1;
/*Lenkung ist linker Motor
Rechts ist FWD
Links ist RWD

Antrieb ist rechter Motor
Vorfährts ist FWD
Rückfährts ist RWD
*/

int main(void)
{
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
while (1)
{
FrontLED(ON);
BackLED(ON,OFF);
delay(500);
BackLED(ON,ON);
delay(500);
gerade();
delay(1000);
MotorDir(BREAK,BREAK);
while (1)
{
if (PIND & (1 << PD0))
{
MotorSpeed(255,255);
LineData(data);
taste = PollSwitch();

porsche();
}


else
{

MotorSpeed(255,150);
LineData(data);
taste = PollSwitch();

porsche();
}
}

}
return 0;
}

void delay (int zlr)
{
unsigned int i;
i = 1;
while (i < zlr)
{
Sleep (72);
i++;
}
return;
}

void gerade()
{
MotorDir(FWD,BREAK);
delay(1000);
MotorDir(RWD,BREAK);
delay(500);
}

void zuruck(int timezuruck)
{
MotorDir(BREAK,RWD);
delay(timezuruck);
}

void links(int timelinks)
{
MotorDir(RWD,FWD);
delay(timelinks);
}

void rechts(int timerechts)
{
MotorDir(FWD,FWD);
delay(timerechts);
}


void vor(int timevor)
{
MotorDir(BREAK,FWD);
delay(timevor);
}

void lk(int timelk)
{
MotorDir(RWD,BREAK);
delay(timelk);
}

void rt(int timert)
{
MotorDir(FWD,BREAK);
delay(timert);
}

void taster()
{
if (taste == 1) //Rechts vorne
{
gerade();
zuruck(1000);
links(500);
vor(700);
rechts(600);
vor(500);
rechts(400);
links(1000);
rechts(500);
}
if (taste == 2) //2te von Rechts vorne
{
gerade();
zuruck(1000);
links(500);
vor(700);
rechts(600);
vor(500);
rechts(400);
links(1000);
rechts(500);
}

if (taste == 4) //Mitte vorne
{
gerade();
zuruck(1500);
MotorDir(BREAK,BREAK);
delay(200);
lk(500);
vor(1500);
rt(1000);
zuruck(2500);
lk(1000);
vor(2500);
rt(500);
}

if (taste == 7) //2te von Links vorne
{
gerade();
zuruck(1000);
rechts(500);
vor(700);
links(600);
vor(500);
links(400);
rechts(1000);
links(500);
}
if (taste == 16) //Links Vorne
{
gerade();
zuruck(1000);
rechts(500);
vor(700);
links(600);
vor(500);
links(400);
rechts(1000);
links(500);
}
if (taste == 31) //hinten
{
gerade();
links(500);
rechts(1000);
links(1000);
rechts(500);
}
}


void porsche()
{
if (taste > 0)
{
taster();
}

else if(data[0]>(data[1]+toleranz))
{
links(500);
BackLED(ON,OFF);
}

else if(data[0]<(data[1]-toleranz))

{
rechts(400);
BackLED(OFF,ON);
}

else
{
vor(200);
BackLED(ON,ON);
}
}

H3llGhost
22.08.2008, 22:36
Hallo joi,

ich habe mir gerade den Code mal so auf die schnelle angeguckt ... ;)
Ich würde die Dinge verändern:

1. Entferne die erste While-Schleife aus der Main
2. Benutze eine For-Schleife in der Delay-Funktion
3. Benutze switch in der Funktion taster

radbruch
22.08.2008, 23:04
void delay (unsigned int zlr)
{
while (zlr--) Sleep (72);
}

... wäre auch elegant :)