PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Beispielprogramm Labyrinth



Joee
06.07.2007, 11:58
Hi,

ich bin neu hier und suche richtig schnelle Hilfe!!!!
Ich habe mich mit meinem Projekt "ASURO" zeitlich total verschätz. Mein Auftrag ist, ASURO durch ein Labyrinth laufen zu lassen.
Mit dem Code komme ich irgendwie gar nicht zurecht. ASURO macht recht wenig. Geradeaus geht...naja, wenn man das so nennen kann.
Kann mir hier jemand helfen???
Habes es leider sehr eilig damit und wäre euch sehr dankbar über eine schnelle Hilfe!

adrisch
06.07.2007, 13:03
Was genau ist denn das Problem?

Joee
06.07.2007, 13:15
Hi, erst mal danke, für deine schnelle antwort. Leider ist am Code alles das Problem Wir bekommen z.B. die Funktion go mit turn nicht zusammen zum laufen. Er hält nicht die wegstrecke ein, welche ihm gegeben wird, sonder fährt und fährt und fährt...

adrisch
06.07.2007, 13:22
Da kann ich leider nichts zu sagen, da mein AVR-GCC-Compiler Problemne mit der neuen Lib hat (da hat sich immer der ganze Computer aufgehängt...)
=> Ich muss immer noch die alte von der CD verwenden...

damaltor
06.07.2007, 14:04
dann probiere doch mal die anderen versionen, die hier im forum herumgeistern... hast du ne ahnung woran es liegt? mal nen anderen pc getestet?

adrisch
06.07.2007, 14:06
ne, am pc liegts sicher nich... is grad auch wurscht, da ich den asuro zur zeit in bascom mach...

Joee
06.07.2007, 17:44
Am PC scheint es nicht zu liegen. Das Problem sitzt wohl eher davor

Hat denn jemand schon mal so ein Programm für ein Labyrinth geschrieben? Wenn ja, daürfte ich mal einen Blick auf den Source werfen? Ich weiss nicht mehr weiter, du das Ding sollte am Mittwoch laufen und ich habe noch keine Zeile Code, die bisher funktioniert hat. :-k

ehenkes
06.07.2007, 22:36
https://www.roboternetz.de/phpBB2/viewtopic.php?p=79010
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=75477#75477

m.a.r.v.i.n
07.07.2007, 11:16
Hi,

es gibt ein sehr schönes Video Asuro im Labyrinth (http://www.youtube.com/watch?v=vuzn-WWkA9s) auf Youtube.
Die Projektseite mit ausführlicher Beschreibung und Programmcode findest du unter http://www.derbeagle.de/asuro/

Allerdings werden bei diesem Labyrinth die Liniensensoren verwendet, damit der Asuro in der Spur bleibt.

izaseba
07.07.2007, 14:41
Ich habe mich mit meinem Projekt "ASURO" zeitlich total verschätz. Mein Auftrag ist, ASURO durch ein Labyrinth laufen zu lassen.

Ich weiss nicht mehr weiter, du das Ding sollte am Mittwoch laufen und ich habe noch keine Zeile Code

Und was hälst Du davon zu sagen,
-"sorry Leute, ich krieg es nicht hin, ich habe versagt..."

Das wäre ehrlich und nicht irgendwo abgekupfert.

ehenkes
07.07.2007, 16:45
"sorry Leute, ich krieg es nicht hin, ich habe versagt..."Absolutes "No Go". Er hat doch noch Zeit, die Lösung umzusetzen! Also fangen wir mal an:

Quelle: Gruber u. Hofmann, Mehr Spaß mit ASURO Band II, S.36/37.



// *******************************************
// * Triangulation für ASURO *
// * *
// * Versucht, einen konstanten Abstand zur *
// * rechten Wand einzuhalten *
// * (c) 2007 Robin Gruber *
// * Details zum Code in: *
// * "Mehr Spaß mit ASURO, Band II" *
// *******************************************

#include "asuro.h"

#define DISTANCE 400
#define GAIN1 1
#define GAIN2 4
#define MAXSPEED 255

/* Funktion zum Auslesen der Abstandssensoren (links, rechts) */
void DistanceData(unsigned int *data)
{
// Prozessorinterne Referenz verwenden
// Multiplexer auf linken Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_LEFT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[0] = ADCL + (ADCH << 8); // normale Sensoranordnung
// data[1] = ADCL + (ADCH << 8); // gekreuzte Sensoranordnung

// Prozessorinterne Referenz verwenden
// Multiplexer auf linken Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_RIGHT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[1] = ADCL + (ADCH << 8); // normale Sensoranordnung
// data[0] = ADCL + (ADCH << 8); // gekreuzte Sensoranordnung

}


int main(void)
{
unsigned int data[2];
signed int diff;
Init();
MotorDir(FWD, FWD);
MotorSpeed(MAXSPEED, MAXSPEED);
while(1) {
// Entfernungen einlesen
DistanceData(data);
// Differenz zum Sollwert ausrechnen und gewichten
diff=(data[1]-DISTANCE)*GAIN1;
// Drehen, falls der linke Sensor ein nahes Hindernis sieht
if (data[0]>DISTANCE) diff+=(data[0]-DISTANCE)*GAIN2;
// Wert nach oben und unten begrenzen
if (diff>MAXSPEED) diff=MAXSPEED;
if (diff<-MAXSPEED) diff=-MAXSPEED;
// wenn zu nah, linken Motor langsamer, ...
if (diff>0) MotorSpeed(MAXSPEED-diff,MAXSPEED);
// ... sonst rechten Motor langsamer
else MotorSpeed(MAXSPEED,MAXSPEED+diff);
}
return 0;
}


Hierbei werden zwei Triangulationssensoren (Sharp GP2D12) eingesetzt. Das Prinzip ist "Rechte Hand an der Wand".