PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro zeichnet wie ein Kugelschreiber



LuZ
22.01.2008, 19:50
Ich habe mich in letzter Zeit etwas mit der Odometrie von Asuro beschäftigt und wollte ihn dann auch Linien zeichnen lassen. Also musste ich irgendwie einen Stift befestigen. Dabei kam mir folgende Idee:
Wenn Asuro sich dreht, soll der Stift ja an einer Stelle stehen bleiben, damit die zweite Linie dann direkt weitergeht (auch nach einer Drehung).
Weil ich keine Lust hatte den Stift irgendwie schräg an Asuro zu befestigen, wie ich es schon auf Bildern im RN gesehen habe, habe ich mir etwas anderes überlegt.
Wenn man Asuro nur über einen Reifen drehen lässt, dann bleibt der andere an seinem Ort. Also habe ich etwas gebastelt, damit unter den Reifen Farbe kommt. Funktioniert also im Prinzip wie ein Kugelschreiber.
Das sieht jetzt ungefähr so aus:

Edit: Sorry, ich hab ganz vergessen zu schreiben, dass ich keinen Filzstift genommen habe, sondern eine Tintenpatrone, in die ich vorne den Kopf eines Wattestäbchens gesteckt habe. Da Tinte ziemlich flüssig ist klappt es. Ich hab auch noch ein Foto von einer Linie und das der Tintenpatrone angehängt.

JensK
22.01.2008, 20:50
d.h. der stift malt den reifen an, und der fährt dann die farbe, die auf ihm drauf ist ab? find ich keine schlechte Idee...
aber bekommt man denn so überhaupt deutliche striche hin?

mfg

LuZ
23.01.2008, 12:39
@JensK: Genau, so ist es. Ich hatte da auch erst bedenken, aber es funktioniert prima. Ich werde nachher nochmal eine Linie fotografieren und hier reinstellen.
mfg

JensK
23.01.2008, 16:01
mhh ich hab garde mal auch ein filzstift an den reifen gehalten, nur bei mir kommt da nix unten aufn papier raus:) muss der filzstift frsich sein? oder sollte ich mal versuchen ihn mit ein ganz klienes bisschen wasser aufzufüllen, so dass er mehr farbe am kopf hat?

mfg

Sim Robot
23.01.2008, 16:11
Stimmt wenn der Filzstift etwas eingetroknet ist malt er nicht mehr so gut und färbt deswegen auch weniger auf den reifen ab.
Das mit dem Wassser auffüllen Klingt Logisch darf aber nicht zu viel sein weil sont der Stich leichter verwischt und auch breiter ist.

Hansi41
23.01.2008, 21:32
hi kasnnst du mal dein programm zur odometrie posten?

robo.fr
23.01.2008, 21:37
hier der Thread ASURO mit Servo (https://www.roboternetz.de/phpBB2/viewtopic.php?p=111334)



https://www.roboternetz.de/phpBB2/files/stiftabheber.jpg

Und ein kleiner Malwettbewerb:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10291

robo.fr
23.01.2008, 21:42
Hallo Luz,

Deine Idee mit der Tintenpatrone ist auch nicht schlecht. Vielleich kann man da noch ein Servo dranbasteln, dann kann die Linie auch unterbrochen werden.
Wenn Du mal schöne Zeichnungen hast, könntest Du die Ergebnisse hier posten, das interessiert bestimmt einige.

Gruß,
robo

LuZ
24.01.2008, 21:25
Das ist der code, den ich bisher geschrieben hab, aber irgendwie funktioniert FahreEinzeln(..) nicht richtig. Die zurückgelegten Strecken sind sehr sehr sehr viel kürzer als angegeben. Fahre() funktioniert allerdings ganz gut, obwohl diese funktion nach dem selben prinzip geht, wie FahreEinzeln(..). Vielleicht überseh ich auch irgendwas...


#include "asuro.h"

#define false 0
#define true 1
#define SCHWARZ 0
#define WEISS 1
#define LINKS 0
#define RECHTS 1
#define LGRW 540
#define RGRW 530

typedef short bool;

//Gradzahl in Bogenmaß umrechnen
double dtor( double deg )
{
double r = 32*deg/180;// PI*reifenabstand*winkel/180°
return r;
}

// eine bestimmte Strecke mit einem Rad fahren
void FahreEinzeln( double mm , int grenzw , unsigned char dir , short rad );

//eine bestimmte Strecke mit beiden Rädern fahren
void Fahre( double mm , unsigned int lgrenzw , unsigned int rgrenzw , unsigned char dir);

void InitTinte()
{
FahreEinzeln( 5.91 , LGRW , RWD , LINKS );
FahreEinzeln( 5.91 , LGRW , FWD , LINKS );
}

//-----------HAUPTPROGRAMM----------------
int main(void)
{
Init();
InitTinte();
//Gleichseitiges Dreieck mit seitenlänge 10cm (100mm) fahren
Fahre( 100.0 , LGRW , RGRW , FWD );
FahreEinzeln( dtor( 300.0 ) , RGRW , FWD , RECHTS );
Fahre( 100.0 , LGRW , RGRW , FWD );
FahreEinzeln( dtor( 300.0 ) , RGRW , FWD , RECHTS );
Fahre( 100.0 , LGRW , RGRW , FWD );

while(1);
return 0;
}
void Fahre( double mm , unsigned int lgrenzw , unsigned int rgrenzw , unsigned char dir)
{
unsigned int rodo,lodo,rodo_old,lodo_old;
unsigned int lcounter = 0;
unsigned int rcounter = 0;
unsigned int data[2];
unsigned char lspeed = 140;
unsigned char rspeed = 140;

OdometrieData( data );

//Momentaner Wert links
if( data[LINKS] < lgrenzw )
lodo_old = SCHWARZ;
else
lodo_old = WEISS;

//Momentaner Wert rechts
if( data[RECHTS] < rgrenzw )
rodo_old = SCHWARZ;
else
rodo_old = WEISS;

//Losfahren
MotorDir( dir , dir );
MotorSpeed( lspeed , rspeed );

while( 3*lcounter < mm || 3*rcounter < mm )
{
OdometrieData( data );

//links Auswerten
if( data[LINKS] < lgrenzw )
lodo = SCHWARZ;
else
lodo = WEISS;

//rechts Auswerten
if( data[RECHTS] < rgrenzw )
rodo = SCHWARZ;
else
rodo = WEISS;

//Farbwechsel links prüfen
if( lodo != lodo_old )
{
lcounter += 1;
lodo_old = lodo;
}

//Farbwechsel rechts prüfen
if( rodo != rodo_old )
{
rcounter += 1;
rodo_old = rodo;
}

//Ungleichmäßigkeiten ausgleichen
if( lcounter+1 < rcounter )
rspeed = 0;
else if( rcounter+1 < lcounter )
lspeed = 0;
else
{
rspeed = 140;
lspeed = 140;
}

//Falls eine Seite Ziel erreicht, stehenbleiben
if( 3*lcounter >= mm )
lspeed = 0;
if( 3*rcounter >= mm )
rspeed = 0;

MotorSpeed( lspeed , rspeed );
}
MotorSpeed( 0 , 0 );
}

void FahreEinzeln( double mm , int grenzw , unsigned char dir , short rad )
{
unsigned int data[2];
unsigned int counter = 0;
bool odo,odo_old;

OdometrieData(data);

//Momentaner Wert
if( data[rad] < grenzw )
odo_old = SCHWARZ;
else
odo_old = WEISS;

//Richtung und Geschwindigkeit einstellen
if( rad == LINKS )
{
MotorDir( dir , BREAK );
MotorSpeed( 140 , 0 );
}
else
{
MotorDir( BREAK , dir );
MotorSpeed( 0 , 140 );
}

//Strecke fahren
while(3*counter < mm )
{
OdometrieData(data);
//Auswerten
if( data[rad] < grenzw )
odo = SCHWARZ;
else
odo = WEISS;

//Farbwechsel prüfen
if( odo != odo_old )
{
counter += 1;
odo_old = odo;
}
}

//Anhalten
MotorSpeed( 0 , 0 );
MotorDir( BREAK , BREAK );
}


mfg Lukas

P.S.: die Idee mit dem Servo ist nicht schlecht. mal schauen vielleicht mach ich das auch noch mal.

robo.fr
25.01.2008, 07:55
Einen Fehler hätte ich schon mal:

double r = 32*deg/180;// PI*reifenabstand*winkel/180°
Obwohl das für Dein Streckenproblem eher wenig Bedeutung hat.
Übrigens: double = float beim AVR-GCC und es wird viel Speicher verbraucht.

Hansi41
25.01.2008, 23:34
danke für den code, werde ihn jetzt mal genauer betrachten