Hallo
Ist n Sonntag ;)
Gruß Thund3r
Druckbare Version
Hallo
Ist n Sonntag ;)
Gruß Thund3r
Wie schnell soll denn dann das Ergebnis bekannt gegeben werden, bzw. wie viel Zeit will man zum Bewerten geben?
Ich persönlich fände da ne Woche angebracht, da man sich bestimmt ein paar Videos anschauen und nen bissel was lesen muss. Und ich hab keine Zeit, mich da mal nen Tag zwei Stunden hinzusetzten und das zu machen. Da wären mir nen paar Tage um das zu streuen lieber...
Viele Grüße,
jon
Hallo
Ja ich denke 1 Woche zum bewerten ist angemessen.
Gruß Thund3r
Ich hoffe das geht sich aus, denn die Ventile die ich verwende habe ich aus China bestellt ...
hört sich schonmal spannent an, aber nicht zuviel verraten :-)Zitat:
Ventile
wenn der termin auf den 11.4.10 festgelegt wird, würde das bei mir auch funktionieren, denn die sachen kommen ende märz ... zum glück
edit:
wieso kann man frühere beiträge nicht löschen, sondern nur editieren ???
[Edit von radbruch]
Man kann eigene Beiträge nur löschen wenn noch kein weiterer Betrag dahinter steht.
... ob es funktioniert ist die andere Frage :cheesy:Zitat:
Zitat von Virus
wenn der termin auf den 11.4.10 festgelegt wird, würde das bei mir auch funktionieren, denn die sachen kommen ende märz ... zum glück
Hallo
Da es keine weiteren Einwände gab wird nun der Abgabetermin auf den den 11.4.10 gelegt.
Allen viel Spaß und Erfolg!
Gruß Thund3r
Hallo
Ich wollte mal einen Zwischenstand abfragen.
Wie kommt ihr vorran wie läuft das Projekt etc?
Gruß Thund3r
ich hab fast das gefühl als obs bei mir nichts wird, denn das ventil wurde falsch geliefert ... mal schaun
Auf die Ferien warten dann gehts endlich mit dem bau los.
Das Problem ist derzeit der stress mit der schule
Hallo
@Xandi11 du machst das schon sosnt einfach improvisieren ;)
@Thomas$ Das Problem kenn ich :D:D
Gruß Thund3r
Kann man noch mitmachen? Bin so gut wie fertig.. :)
Muss nur noch das Löschen realisieren.
glaub nich sonst hätte ich gern mitgemacht habs nur zu spät gesehen
Hallo
Hm also es gab zwar eine Anmeldefrist aber meiner Meinung kann man da ne Ausnahme machen.
Wenn jemand was dagegen hat das die beiden noch teilnehmen soll er sich binnen der nächsten 24 Stunden hier melden sonst werden die beiden noch nachträglich aufgenommen.
Gruß Thund3r
Ich hatte ein wenig Probleme mit der Anmeldung, ich konnte den Aktivierungslink nicht öffnen, habe es heute von einem anderen PC ausprobiert und siehe da..
Also ich kann verstehen, wenn ich nicht mehr mitmachen darf, wäre auch unfair den anderen gegenüber. Ich warte eure Entscheidung ab.
ich werd Leider nicht mitmachen können da ich es nicht bis zur abgabe schaffen werde.
Aber ich werde mit Spaß den Wettbewerb verfolgen und vileicht beim nächsten mitmachen.
Hallo
Da wohl niemand etwas dagegen hat wird Superguenstig noch nachträglich für den Wettbewerb angemeldet.
Viel Glück und Erfolg!
Gruß Thund3r
Vielen Dank und auch allen anderen viel Erfolg!
Hallo
Ich hoffe bei allen laufen die Arbeiten gut ;)
Zudem wollte ich anmerken dass ich vom 6.4-11.4 nicht da bin und ihr im Falle von Fragen euch bitte in diesem Zeitraum an Virus wendet.
Bitte posted vom 11.4 - 13.4 euer Ergbnis mitsamt Dokumention,Erklärung und Video.
Nochmal zur Bewertung:
Jeder Teilnehmer nominiert 2 andere Kanidaten (nicht sich selber!) und verteilt jeweils für einen gewählten Kanidaten 2 und für den anderen 1 Punkt und begründet dies kurz wie gut und kreativ eurer Meinung nach mit der Aufgabenstellung gearbeitet wurde (Auch Ansätze werden bewertet). Wer am Ende die meisten Punkte von den anderen Teilnehmern erhalten hat ist der Gewinner.
Nur wer nominiert kann selber gewinnen.
Gruß Thund3r
Wie genau soll die Doku aussehen? Muss jedes einzelne Detail erklärt werden oder reicht es, wenn man den Ansatz so beschreibt, dass jeder nachvollziehen kann, was da getan wird? Kann die Doku auch im Video eingebaut sein?
MfG Mark
@Thund3r :Viel Spaß im Urlaub O:)
Hallo
Erklärungen im Video schaden sicher nicht jedoch sollte zB auch der Quellcode gepostet und da vllt die ein oder andere Stelle erklärt werden sodass man die Funktionsweise bzw das Aufspüren des Teelichts nachvollziehen kann. Man sollte nachvollziehen können wie dein Programm arbeitet und wie die verwendete Hardware bentutz wird.
@p_monk: Danke :)
Gruß Thund3r
Ich bekomme das Video nicht hochgeladen, mein UMTS hällt die Verbindung nicht lange genug aufrecht.. Gibt es schon andere Lösungen?
Hallo
Nur keine Panik! Ich gehe davon aus, dass auch der Abgabeschluss dieses "Wettbewerbs" noch geändert werden kann.
Mein Stand im Moment: Die Katze ist schneller als der RP6 ;)
Gruß
mic
Hallo
Nachtrag:
So die Wettbwerbszeit ist somit abgelaufen und die fertigen Projekte sollten nun im Zeitram vom 11.4 - 13.4 hier präsentiert werden.
Bei ungeklärten Fragen zur Präsentation wendet euch an mich oder Virus
Gruß Thund3r
Hallo
Hier meine Präsentation
Das Video:
http://www.youtube.com/watch?v=Ytfs5m9FXbE
Das Prinzip:
Der Roboter sucht mit der Asuro-Snake Erweiterungsplatine (In der 1ten Suchphase) grob eine Wärmequelle indem er einen Rundumscann vornimmt. Wenn er eine erhöhte Temperatur im Vergleich zur vorher gemessenen Umgebugnstemperatur findet richtet er sich zu der Wärmequelle aus und fährt suchend (im 2ten Programmteil) in die Richtung an der die Temperatur immer wärmer wird (sonst geradeaus --> also auf die Qärmequelle zu). Hat er sich unmittelbar vor die Wärmequelle gerbeitet (Wenn der gemessene Temperaturwert eine gewisse Grenze überschreitet) dreht der RP6 sich leicht so dass er mit Hilfe eines kleinen Propellers die Kerze löschen kann.
Der Quelltext:
Gruß Thund3rCode:int z; //Globale Vriable
void scan (int ds)
{
int max;
do
{
uint16_t adc2r = readADC(ADC_2);
uint16_t adc3r = readADC(ADC_3);
max=adc2r-adc3r; //Wert der Umgebung wird genommen
moveAtSpeed(50,0); //Drehe
setLEDs(0b1110);
}
while(!(max<ds-13)); //Bis neu gemessener Wert stark von dem Übergebenen Anfangswert abweicht
}
...
void Snake(int dif)
{
uint16_t adc2 = readADC(ADC_2);
uint16_t sSnake = adc2 ;
uint16_t adc3 = readADC(ADC_3);
uint16_t sSnake2 = adc3 ;
int a,b;
a=(sSnake-sSnake2); //Neuer Wert wird genommen
b=0;
if(a>dif+10) //Wenn neu gemessener Wert abzüglich Tolleranzwert rechts höher ist
{ setLEDs(0b1100);
moveAtSpeed(50,0); //Drehenach rechts
b=1; //Damit später nicht geradeaus gefahren wird
}
if(a<dif-5) //Wenn neu gemessener Wert abzüglich Tolleranzwert links höher ist
{ setLEDs(0b0011);
moveAtSpeed(0,50); //Drehe nach links
b=1; //Damit später nicht geradeaus gefahren wird
}
if(b==0) //Wenn sich nichts verändert hatte ist man auf direktem Kurs
{ setLEDs(0b0110);
moveAtSpeed(40,40); // Also geradeaus fahren
z=a; // Neuen Wert setzten der als Umgebungswert (s.u. in der Hauptschleife) genommen wird um den Roboter direkt und immer mehr Außenfaktorunabhängig
//auf die Wärmequelle fahren zu lassen da man sich ja nun auf direktem Weg zu der Wärmequelle befindet
}
if((sSnake> 310 ||sSnake2>310)) // Wenn man sich sehr nah an der Wärmequelle befindet mit löschen beginnen
{
int n;
changeDirection(FWD);
moveAtSpeed(50,0);
mSleep(1000);
moveAtSpeed(0,0);
for(n=0;n<25;n++)
{
l(); //Löschemethode
mSleep(150);
}
PORTC &= ~IO_PC5; //Löschvorgang beenden
mSleep(2000);
uint16_t adc2 = readADC(ADC_2);
uint16_t sSnake = adc2 ;
uint16_t adc3 = readADC(ADC_3);
uint16_t sSnake2 = adc3 ;
a=(sSnake-sSnake2); // Neuen Umgebungswert setzen
z=a; //Wird später in der Hauptschleife übergeben
scan(z); //Neue Wärmequelle grob orten
}
clearLCD();
setCursorPosLCD(0, 0);
writeStringLCD("Rechts: ");
writeStringLCD(" ");
writeIntegerLCD(sSnake, DEC);
writeStringLCD(" ");
writeIntegerLCD(a, DEC);
setCursorPosLCD(1, 0);
writeStringLCD("Links: ");
writeIntegerLCD(sSnake2, DEC);
writeStringLCD(" ");
writeIntegerLCD(b, DEC);
mSleep(200);
}
...
int main(void)
{
initRP6Control();
initLCD();
...
showScreenLCD("Search heat...", "");
uint16_t adc2 = readADC(ADC_2);
uint16_t sSnake =adc2 ;
uint16_t adc3 = readADC(ADC_3);
uint16_t sSnake2 = adc3 ;
int dd;
dd=(sSnake-sSnake2); // Ein Startvergleichswert wird gesetzt enspricht der Umgebungstemperatur
scan(dd); // s.o. Es wird nach einer Wärmequelle gesucht welche deutlich vom Vergleichswert abweicht (höher ist)
setLEDs(0b0001);
sSnake=readADC(ADC_2);
sSnake2=readADC(ADC_3);
dd=(sSnake-sSnake2); // Nachdem man auf die Wärmequelle grob ausgerichtet ist wird ein neuer Vergleichswert gesetzt
z=dd;
moveAtSpeed(20,20);
changeDirection(BWD);
mSleep(200);
changeDirection(FWD);
while(true)
{
Snake(dd); //Methode zur genauen Ortung der Wärmequelle anhand des Verlgeichswert wird aufgerufen
task_checkINT0();
task_I2CTWI();
dd=z; //Falls der Umgebungswert verändert wurde wird er hier übergeben
}
return 0;
}
@Thund3r:
Im Video sieht man den Strahl einer Taschenlampe(oder ähnlichem). Hat das etwas mit dem Wettbewerb zu tun?
Hallo
Meinst du die Lichtreflexion auf dem Boden ?
Die kommt nämlich von einer extra Lampe damit man auf dem Video möglichst viel erkennen kann.
Mein Suchverfahren arbeitet ohne Licht
Gruß Thund3r
Das ist ja schon kein schlechter Anfang. Da traue ich mir kaum noch mein Projekt vorzustellen.. :) Habe das ganze wohl ein wenig zu kompliziert angegangen.
Hallo
Ach nur Mut!
Los stellt mal eure Projekte vor ich möchte mal die Lösung von den anderen sehen.
Gruß Thund3r
Hallo!
mein Projekt findet ihr auf http://arips.roboterbastler.de/?Software:Firefighting , das Video gibts auch hier: http://www.youtube.com/watch?v=rSiB5mmOxaI
MfG Mark
Hallo alle zusammen !!
Hier ist also mein Projekt, mein Ziel war es das projekt so einfach wie möglich zu verwirklichen (das suche und das löschen ohne großes umbauen).
Prinzip: Der RP6 fährt in einem 1*1 Meter größen Areal herum, und orientiert sich mit hilfe der Bumper. Die Wände bestehen aus Schweisserdraht der mithilfe von Klebeband am Boden fixiert ist. Kommt ein Teelicht vor den RP6 erkennt er se durch seine Infrarotsensoren, alle LEDs gehen an und das Servo schließt den Stromkreis durch einen Kipp-Schalter und das Teelicht wird durch den Motor ausgeblasen. Leider musste ich eine Externe Stromquelle für den Motor nehmen, da der RP6 (VDD, GND) bei jedem Motorstart Abstürtzte (denselben Fehler hatte ich aber auch schon bei Großen Servos).
Hier das Video: http://www.youtube.com/watch?v=o2okdm7lwEE
Der Code:
So das war's !Code:#include "RP6RobotBaseLib.h"
uint8_t c;
void teelicht(void)
{
if (!obstacle_left && !obstacle_right && !bumper_left && !bumper_right) //wenn keine Hindernisse vorliegen
{
changeDirection(FWD);
moveAtSpeed(75,75);
}
if (obstacle_left && obstacle_right) //Haben die Infrarotsensoren ein Teelicht geortet
{
DDRC |= SCL;
PORTC &= ~SCL;
setLEDs(0b111111);
move(90, FWD, DIST_MM(50), BLOCKING);
for(c=0; c<50; c++) //Servoposition 1
{
PORTC |= SCL;
sleep(12);
PORTC &= ~SCL;
sleep(190);
}
setLEDs(0b100100); //LEDs blinken im Sekundentakt bis das Teelicht gelöscht ist
mSleep(1000);
setLEDs(0b010010);
mSleep(1000);
setLEDs(0b001001);
mSleep(1000);
setLEDs(0b000000);
for(c=0; c<50; c++) //Servo zurück
{
PORTC |= SCL;
sleep(9);
PORTC &= ~SCL;
sleep(190);
}
move(80, BWD, DIST_MM(100), BLOCKING);
rotate(80, RIGHT, 30, BLOCKING);
}
if (bumper_left) //ist der Linke Bumper gedrückt
{
move(80, BWD, DIST_MM(100), BLOCKING);
rotate(80, RIGHT, 110, BLOCKING);
}
if (bumper_right) //ist der Rechte Bumper gedrückt
{
move(80, BWD, DIST_MM(100), BLOCKING);
rotate(80, LEFT, 110, BLOCKING);
}
if (bumper_left && bumper_right) //sind beide Bumper gedrückt
{
move(80, BWD, DIST_MM(100), BLOCKING);
rotate(80, LEFT, 110, BLOCKING);
}
}
int main(void)
{
initRobotBase();
powerON();
setACSPwrLow(); // ACS auf geringe entfernung einstellen
while(true)
{
teelicht();
task_RP6System();
}
return 0;
}
Gruß Fabi
Hallo
Mein Projekt ist nun zumindest vom Bau und von der Programmierung fertig. Ich habe das Projekt mit den Sichtsensoren umgesetzt und das gesammte Programm nur für die Base geschrieben. Verwendet werden nur 2 kleine Servos. Davon 1 zum Steuern der Luftzufuhr zum Löschen und 1 zum gewegen des Luftschlauches.
Zur Funktion kann ich nur sagen, dass ich das Programm ohne Luft (also ohne Löschen) ausprobiert habe und es findet die Teelichter.
Das Problem besteht jetzt nur darin, dass der Roboter bei jedem Versuch ein Programm zu starten abstürtzt. Noch viel blöder ist, dass das glaube ich meine Schuld ist. Denn da ich das Pneumatikventil nicht rechtzeitig bekommen habe, musst ich auf einen Eigenbau umsteigen und wie ich diesen ausprobieren wollte habe ich einen Kurzschluss auf der Platine produziert.
Nun wird der Roboter von Conrad eingeschickt und wird hoffentlich bald wieder zurückkommen.
MFG
Xandi
Hi,
ich muss leider sagen, dass ich nicht über ein paar Zeichnungen hinausgekommen bin. Ich hatte einfach nicht genug Zeit und war dazu noch viel unterwegs...
Ich bin aber auf jeden Fall sehr begeistert von den Projekten, die bisher präsentiert wurden!!!
Viele Grüße,
jon
Hallo
Bild hier
Aus Zeitgründen habe ich es leider nicht geschafft eine vernünftige Software zu erstellen. Nach Druck auf den linken Bumper wird das hellste Teelicht im Blickbereich angesteuert und beschossen, ein Druck auf den rechten Bumper wiederholt den Schuss. Mein Konzept funktioniert nur im Halbdunkel, aber bei strahlender Sonne braucht man eh keine Teelichter;)
Sensor ist die Projekt-Cam, Ausbläser ist ein Luftballon auf einem PET-Flaschenrest der mit einer Wäscheklammer und zwei Servos gespannt und abgeschossen wird:
Bild hier Bild hier Bild hier
http://www.youtube.com/watch?v=qgmKWWT4lps
http://www.youtube.com/watch?v=l79jabBqgo0
Helferleinkatze ist natürlich auch mit dabei ;)
GrußCode:// Teelicht löschen mit RP6 12.4.2010 mic
#include "RP6RobotBaseLib.h"
#define auf 30
#define zu 12
#define aus 0
#define spannen 14
#define holen 38
uint8_t klammer=0, ziehen=0; // Servos aus
void init(void);
void setMotorPWM(uint8_t power_links, uint8_t power_rechts);
uint16_t richtung(void);
void schuss(void);
int main(void)
{
init();
while(1)
{
writeInteger(richtung(), 10);
writeString_P("\n");
setLEDs(63); // ready
do
{
schuss();
while(!(getBumperRight() || getBumperLeft())); // weiteren Schuss auslösen
}
while(!getBumperLeft()); // nächste Kerze
}
return(0);
}
ISR (TIMER1_OVF_vect)
{
static uint16_t servocount=1;
if(servocount > klammer) PORTC &= ~SCL; else PORTC |= SCL; // PC0 XBUS 10
if(servocount > ziehen) PORTC &= ~SDA; else PORTC |= SDA; // PC1 XBUS 12
if(servocount < 400) servocount++; else servocount=1;
}
void init(void)
{
initRobotBase();
DDRC |= (SCL | SDA); // Servopins auf Ausgang setzen
TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung
extIntOFF(); // schaltet den E_INT1-Port auf Eingang für den ADC
// ADC interne Referenz 2,56V, Ergebniss linksbündig, Kanal ADC4 (E_INT1)
ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<ADLAR) | 4;
// setzte free running triggern
SFIOR = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
// kein interupt, Wandler einschalten, prescaller /2
ADCSRA = (0<<ADIE) | (1<<ADEN) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0);
// Autotriggern bedeutet jetzt free running aktivieren, altes Flag löschen
ADCSRA |= (1<<ADATE) | (1<<ADIF);
// Initialisierung starten
ADCSRA |= (1<<ADSC);
// und noch die wohl eher unnötige Initiallesung
while (!(ADCSRA & (1<<ADIF)));
ADCSRA |= (1<<ADIF);
//powerON();
}
// Achtung! Die PWM-Werte werden hier OHNE Rampe verändert!
void setMotorPWM(uint8_t power_links, uint8_t power_rechts)
{
extern uint8_t mleft_ptmp, mright_ptmp;
if(power_links > 210) power_links = 210;
if(power_rechts > 210) power_rechts = 210;
mleft_power=mleft_ptmp=power_links;
mright_power=mright_ptmp=power_rechts;
OCR1BL = power_links;
OCR1AL = power_rechts;
if(power_links || power_rechts)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;
}
uint16_t richtung(void)
{
uint8_t bildspeicher[100], *bildzeiger; // 100 Byte Bildspeicher sollten reichen
uint8_t zeile, sync, c; // und dürfen NICHT global sein!
uint16_t spalte_max, spaltenwerte[12];
writeString_P("-------------------------\n");
do
{
spalte_max=0;
for(c=0; c<12; c++)
{
setLEDs(c); // working
bildzeiger=&bildspeicher[0]; // Zeiger auf Start des Bildspeicherbereich
zeile=c*20+35; // aktuelle Zeile (35 Zeilen sind der Schrott beim Bildstart)
cli();
do // Warten auf langen Syncbereich = Bildstart
{
sync=0;
while (ADCH > 20); // warten solange Bilddaten erkannt werden
while (ADCH < 30) sync++; // Länge des Sync-Signal zählen
}while (sync < 40); // größer 40 bedeutet Bildstart
while(zeile--)
{
while (ADCH > 20); // Bilddaten
while (ADCH < 30); // Sync
}
do *bildzeiger=ADCH; while(*bildzeiger++ > 20); // schnelle Zeile einlesen
sei();
spaltenwerte[c]=0;
for(zeile=0; zeile<48; zeile++) // 64 Pixel zusammenzählen
{
spaltenwerte[c]+=bildspeicher[zeile];
setLEDs(zeile);
}
if(spaltenwerte[c] > spalte_max) spalte_max=spaltenwerte[c];
}
for(c=0; c<12; c++) // größten Spaltenwert suchen
{
if(spaltenwerte[c] == spalte_max) spalte_max=c;
}
writeString_P("hellste Spalte: ");
writeInteger(spalte_max, 10);
writeString_P(" Spaltenwert: ");
writeInteger(spaltenwerte[spalte_max], 10);
writeString_P("\n");
//if(spaltenwerte[spalte_max] > 3000)
{
if(spalte_max > 6) {setMotorDir(FWD,FWD); setMotorPWM(100,0);}
else if(spalte_max <6) {setMotorDir(BWD,FWD); setMotorPWM(100,0);}
//mSleep(200);
//setMotorPWM(0,0);
//mSleep(500);
else setMotorPWM(0,0);
}
}while(spalte_max !=6);
return(spaltenwerte[spalte_max]); // Summenhelligkeit der Spalte
}
void schuss(void)
{
klammer=auf;
mSleep(500);
ziehen=holen;
mSleep(500);
klammer=zu;
mSleep(300);
ziehen=spannen;
mSleep(500);
klammer=auf;
mSleep(200);
klammer=zu;
mSleep(200);
klammer=0;
}
mic
[Edit]
Ich hab's zerlegt, weil der Ballon kaputt ging. Der kleine Knubbel war im Ballon als Greifpunkt für die Klammer. Das Sieb stammt aus einem Kaffeepad.
Vielleicht bin ich nicht ganz richtig hier im thread, weil ich ja beim Wettbewerb nicht mitgemacht habe.
@radbruch: Ich will aber trotzdem loswerden, wie stark ich Deine Luftspritze finde. Ich mußte zweimal hinschauen; zusammen mit den Ohren und der Beschreibung ließ es sich dann doch einordnen.
Die Lösung hat einfach was. Bin echt beeindruckt. Bild hier
Gruß
Searcher
Hallo
Schade das es nur so wenige Projektpräsentationen gab...
Trotzdem beginnt jetz das Voting also schickt mir bitte als PM eure Meinung wer 1 oder 2 Punkte bekommt (siehe Seite 1 Regeln)
Weitere Projekte können selbstverständlich vorgestellt werden.
Auch die Projektansätze können bewertet werden!
Gruß Thund3r
Das klingt gut, ich habe gestern noch wie verrückt versucht das zum laufen zu bekommen, auch das Video bekomme ich nicht hochgeladen. Ich kann gerne ein paar Fotos online stellen und würde auch gerne noch versuchen das Video online zu stellen.
Mein Projekt funktioniert leider nicht perfekt, ich bin auch noch nicht lange mit dem RP6 vertraut. (Er löscht die Teelichter jedenfalls alle, der Löschvorgang startet nur ein wenig zu oft da ich Probleme mit dem Einstellen der Temperaturwerte habe.
Vielleicht kann mir jemand von euch helfen, ich habe ein 70 Mb großes MP4 Video, das ich hochladen will. Geht das Format und die Größe?
Noch was zum Schema:
Der Roboter fährt eine "8" und misst dabei dauerhaft die Temperaturwerte mittels eines Temperatursensors, der über einen Servomotor positioniert wird. Hat er einen auffälligen Wert gefunden hält er an, richtet sich zur Wärmequelle aus und startet den Löschvorgang.
Danach wird geprüft ob noch ein Feuer vorhanden ist, wenn nicht setzt er die Suchfahrt weiter fort.
Hallo
Ich habe keine Bewertungen abgegeben, weil meiner Meinung nach jeder der es schafft auch ein Gewinner ist.
Für Thund3r spende ich allerdings einen Sonderpunkt für die Organisation des Wettbewerbs.
Gruß
mic