-
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:
Code:
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;
}
Gruß Thund3r
-
Taschenlampe?
@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