Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro soll bestimmte Strecke fahren
stollentroll
05.02.2006, 19:09
Hi
Ich will den asuro so programmieren, dass er vorwärts fährt, gegen eine Wand komm sich umdreht und eine Kurve fährt und dann wieder normal vorwärts. bis zu dem punkt, wo er sich umdrehen soll bin ich schon gekommen, nur fahrt er immer weter uns stoppt nicht.
#include "asuro.h"
int main(void)
{
Init();
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(133,120);
while (PollSwitch()==0){//Vorwärts fahren, bis Taster berührt werden
SerWrite("Alles in OK!\n",10);
}
StatusLED(RED);
MotorDir(RWD,RWD);// Dann um angegebene Strecke weiterfahren
MotorSpeed(5,10);
drehzahl(5,0,1);
}
Also mir fallen hier mehrere Sachen gleichzeitig auf:
1. Benutze die [ code ] Tags, damit es, vorallem bei längeren Code Stücken, übersichtlicher wird.
2. Die Funktion drehzahl(5,0,1); ist mir unbekannt. Woher hast du die?
3. Du machst ja (bis auf die mir unbekannte Funktion) nichts mehr nachdem gedreht hast.
4. Normalerweise hängt man bei AVR Programmen ans Ende ne Endlosschleife und trotzdem noch den Rückgabewert.
int main(void){
...
while(1);
return 0;
}
Also du musst einfach noch programmieren was er machen soll, wenn er mit drehen fertig ist. Du kannst ja zum Beispiel das ganze bis auf das Init() auch in ne Schleife tun oder so.
Andun
stollentroll
06.02.2006, 14:51
Ich kenne mich nicht sehr gut it dem Programmieren aus, und habe die Funktion drehzahl irgendwo im Internet gefunden. Kann mir irgendwer sagen, wie ich festlegen kann, dass der Roboter nur eine bestimmte Strecke fahren soll?
stollentroll
06.02.2006, 16:12
Mir ist aufgefallen, dass Asuro bei dem og Code vorwärts langsamer als Rückwärts ist (MotorDir(FWD,FWD);MotorSpeed(133,120);undMotorDir (RWD,RWD);
MotorSpeed(5,10); ) Woran kann das liegen?
m.a.r.v.i.n
06.02.2006, 16:59
Der Funktion MotorSpeed(l,r) werden als Parameter die Geschwindigkeit für linken und rechten Motor übergeben.
Gruß m.a.r.v.i.n
Also irgendwie hab ich das Gefühl, du weißt nicht so wirklich was diese Wortkonstrukte (auch Funktionsaufrufe) eigentlcih machen. Sry, aber das ist mein Eindruck.
Auch wenn du die Funktion drehzahl() irgendwo im Netz gefunden hast, dann ist das ja schön, aber wenn du es uns weder beschreibst, noch uns sagst wo du sie herhast, noch sie vielleicht gleich am besten postest, dann können wir dir leider nciht helfen.
Wenn du dich dann auch mal mit dem Heftchen vom Asuro auseinander setzt, wirst du feststellen, dass dein Problem eigentlich ziemlich einfach zu lösen ist. Wenn du dann immer noch ein Problem hast, kannst du mich sogar gerne in ICQ oder sonst was nerven bis mein Arzt kommt, ... :D
Andun
Ich hab also mal im Internet eine Funktion drehen(int wieoft) gesehen,
kann ich sie mit Asuro benutzen, damit er sich im Kreis dreht?
Gruß Sebastian
stollentroll
06.02.2006, 20:11
Ich weiß, dass ihr es nicht gut finde, aber in der Anleitung steht ja wie ich das machen muss. kann mir bitte irgendwer sagen, was ich machen muss, dass der Roboter nur für zB 5 sec fährt oder für 50 hell dunkel Übergänge?
also für 5sec könntest du mit der funktion
MotorDir(FWD,FWD);
MotorSpeed(120,120);
SSleep(5);
machen nach fünf sec sollte der dann anhalten. weiß allerdings nicht ob die funktion in der basis lib ist. bei nem fehler bitte verbessern.
mit den übergängen ist das schwerer weiß ich gerade nicht auswendig.
gruß fabi
Es gibt viele Wege um eine 5 Sek Pause anzulegen...
Man könnte die Forensuche benutzen, oder sich die asuro.c Datei anzuschauen, oder vielleicht das Dattenblatt zu Mega8.
Und die Hell Dunkel Übergänge kannst Du auch benutzen, such mal im Forum nach Odometrie, oder am besten nach der erweiterten Asuro Bibliothek...
P.S. Ich habe gerade eine Funktion hollBier(long Anzahl) gefunden \:D/
Mal schauen wie der Asuro reagiert...
Gruß Sebastian
stollentroll
07.02.2006, 17:36
Wenn man Sleep(5) nimmt, dann wartet er ja für 5 sec, ich will aber, dass der Asuro nur 5 sec lang fährt
Ja, du sagst Motoren nach vorne antreiben, wartest dann 5 sec und dann stoppst du die Motoren.
stollentroll
08.02.2006, 18:50
Ich will aber, dass der Roboter, wenn er z.B. an eine Wand stößt, für 5 sec in einer Kurve zurück fährt und dann soll er wieder normal gredeaus fahren, wenn er an die Wand fährt rückwärts fahren usw.
an dem bin ich auch gerade dran. ist am anfang gar nicht so einfach. ich denke du solltest erst einfach anfangen. 5 sec gerade aus drehen usw. und dann mit den tastern arbeiten.
gruß fabi
Ich will aber, dass der Roboter, wenn er z.B. an eine Wand stößt, für 5 sec in einer Kurve zurück fährt und dann soll er wieder normal gredeaus fahren, wenn er an die Wand fährt rückwärts fahren usw.
So ein Programm habe ich schon einmal geschrieben und es befindet sich sogar hier im Roboterforum.
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=10862&highlight=wohnung
Als Wandsensorren finde ich die Taster übrigens sehr ungeschickt, weil man unter Umständen die Taster nicht immer trifft.
In meinem Programm wurde einfach die Drehzahl der Motoren überwacht. Wenn der ASURO gegen ein Hindernis fährt, kann er detektieren, dass die Radgeschwindigkeit langsamer wird. Das gibt ein ziemlich zuverlässiges Signal um umzukehren.
Um eine bestimmte Wegstrecke zu fahren, eigenet sich die Go-Funktion aus der ASURO-LIB:
http://sourceforge.net/project/showfiles.php?group_id=155217
Gruss,
stochri
stollentroll
11.02.2006, 15:17
Ich habe es jetzt hingekriegt, dass der Asuro nur für eine bestimmte Zeit fahren soll.
Jetzt möchte ich, dass er, wenn er die Strecke gefahren ist, wieder von vorne anfängt. Stimmt es dass man dann am Ende einfach nur
return 1;
schreiben muss?
robotcool
12.02.2006, 19:26
Wennn du den code hast richitg dann schreibe ma hier rrein will das dann auch machen mit meien asuro
mfg robotcool
@Stollentroll:
Nichts für ungut, Kollege, aber lern lieber erstmal die Grundlagen von C!
Für den Anfang:
return x;
bedeutet, daß das Programm an dieser Stelle zurückkehrt in die aufrufende Funktion, und dieser den Wert x zurück liefert. Befindet sich das Programm bereits in der obersten Funktion, dann beendet es sich mit dem Returncode x. Ich muss gestehen, wie der ASURO auf ein Beenden seines Programms reagiert, kann ich nicht sagen; das müssen die erfahreneren ASURO Benutzer hier beantworten.
Um einen Satz Befehle unendlich oft zu wiederholen, benutzt man sogenannte Schleifen. Häufig genutzt ist da die "while"-Schleife ('while' englisch = 'solange'):
int tuEs = 1;
while( tuEs )
{
TuWasIchWill();
}
die "while"-Schleife führt die in den geschweiften Klammern aufgeführten Befehle immer und immer wieder aus, und zwar solange, wie die in den normalen Klammern angegebene Bedingung WAHR ist (handelt es sich dabei um einen Zahlenwert, so ist 0 = FALSCH, und alles größer 0 = WAHR).
Soweit nur ein kurzer Abriss über die Syntax von C. Du solltest dir echt erstmal ein paar kleine Programme zurechtschnitzen, die auf einem normalen PC laufen. Sogenannte "Hallo Welt"-Programme sind da sehr beliebt, für den Einstieg in die Programmierung.
Und noch eine Bitte: BITTE benutz den "CODE" Tag! Das bedeutet, daß du alles, was Code ist, in einen Block schreibst, der mit {code} beginnt und mit {/code} endet (geschweifte Klammern durch eckige ersetzen).
Rookie-Robot
03.03.2006, 19:18
Hallo,
ich habe irgendwie Probleme mit der Sleep Funktion, in der Anleitung steht das höchstens der Wert 255 (unsigned char) übergeben werden darf und dann wartet der auch nur 3 Millisekunden und keine 255 sec.
Soll heißen, wenn ich möchte das er 5sec. wartet funktioniert das nicht mit
Sleep(5)!
Wer kann mir helfen?
Rookie
die funktion müsste SSleep sein. da wartet er für die sekunden die in der klammer danach angegeben sind. bin mir allerdings nicht sicher ob diese funktion in der standard lib vorhanden ist.
gruß fabi
Rookie-Robot
03.03.2006, 21:44
Hallo fabix,
Danke für den Tip, nur leider ist diese Funktion nicht in der Standard-Lib!
Wie kann ich denn am besten eine neue Lib implementieren?
erweiterte ASURO-Lib:
http://sourceforge.net/project/showfiles.php?group_id=155217
Lunarman
04.03.2006, 12:47
Oder du benutzt diese Funktion:
void LongSleep(int ms)
{
int i;
for(i = 0; i < ms; i++)
{
Sleep(72);
}
}
Wenn du Longsleep(1)
sagst, wartet er eine Millisekunde.
Also wartet er so 5 Sekunden:
Longsleep(1000)
Longsleep(1000)
Longsleep(1000)
Longsleep(1000)
Longsleep(1000)
Ich glaub, diw Funktion kann nur Werte bis 1023 aufnehmen.
Rookie-Robot
04.03.2006, 18:26
Danke für den Link!
Jetzt funktioniert es! Zwar mit Msleep und nicht mit SSleep, aber das langt ja auch :D Danke!
Rookie-Robot
04.03.2006, 18:32
Hallo Lunarman,
Danke für Deinen Tip, kann ich ja auch mal ausprobieren.
Gruß
Rookie
stollentroll
15.03.2006, 21:48
Ich hab die Funktion Sleep ganz oft untereinandergeschrieben, dann kann man ausrechnen, wie lange der Prozessor warten soll
Mit der Sleep-Funktion Streckenlängen oder Kurven zu programmieren ist eine schlechte Variante. Weil je nach Batterieladung der Asuro unterschiedlich schnell fährt. Meiner Meinung nach geht es nur mit Odometrie-Einstellung und das auch nicht exakt.
Gerhard
https://www.roboternetz.de/phpBB2/viewtopic.php?p=168020#168020
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.