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
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.
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
@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
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
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.
[schild=14 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Roboter sind cool[/schild]
hi kasnnst du mal dein programm zur odometrie posten?
hier der Thread ASURO mit Servo
Bild hier
Und ein kleiner Malwettbewerb:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10291
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
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...
mfg LukasCode:#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 ); }
P.S.: die Idee mit dem Servo ist nicht schlecht. mal schauen vielleicht mach ich das auch noch mal.
Einen Fehler hätte ich schon mal:
Obwohl das für Dein Streckenproblem eher wenig Bedeutung hat.double r = 32*deg/180;// PI*reifenabstand*winkel/180°
Übrigens: double = float beim AVR-GCC und es wird viel Speicher verbraucht.
Lesezeichen