PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Robby RP6 für totalen Einsteiger...



LucaSilva301
12.11.2008, 14:31
Hey Leute!

Ich habe mir einen RP6 gekauft...
Leider habe ich noch fast keine Erfahrung, kann jedoch anhand der schönen Examples ganz gut C nachvollziehen.
nachdem ich nun versucht habe ein eigenes Programm zu schreiben, wollte ich es uploaden. Bei dem Versuch es via Programmers Notepad über Tools mit Make All zu compilen blieb leider der Erfolg aus^^
ich fand schnell heraus, dass ich auch Make All, Clear All und die Lib in den Ordner mit meiner .c Datei packen musste. leider gab es immernoch Fehlermeldungen, die ich nicht nachvollziehen kann.

Man muss doch die .c Datei in eine dem Chip (Atmega32) verständliche .hex umwandeln, oder? Die Informationen über den Chip stehen also in der MakeAll datei drinnen? was sind die ganzen anderen Dateien wie bspw. .elf und so weiter...?

hier ein kleiner errorcode: meine Datei heißt compile.c und ich habe auch in makefile statt des example namen meinen dateinamen eingefügt.


> "make.exe" all

-------- begin --------
avr-gcc (WinAVR 20080610) 4.3.0
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Linking: Compile.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Compile.o -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/Compile.elf.d Compile.o ../../RP6Lib/RP6base/RP6RobotBaseLib.o ../../RP6Lib/RP6common/RP6uart.o --output Compile.elf -Wl,-Map=Compile.map,--cref -lm
Compile.o: In function `main':
D:\Programme\RP6\Compile\Compile/Compile.c:7: undefined reference to `setLEDs'
D:\Programme\RP6\Compile\Compile/Compile.c:8: undefined reference to `msleep'
D:\Programme\RP6\Compile\Compile/Compile.c:9: undefined reference to `setLEDs'
D:\Programme\RP6\Compile\Compile/Compile.c:10: undefined reference to `msleep'
D:\Programme\RP6\Compile\Compile/Compile.c:11: undefined reference to `setLEDs'
D:\Programme\RP6\Compile\Compile/Compile.c:12: undefined reference to `msleep'
make.exe: *** [Compile.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:00



Beste Grüße und Danke für eure Hilfe!

Luca

Laias
12.11.2008, 15:12
Hi LucaSilva301,
laut des Errorcodes müsste es daran liegen, dass die Lib nicht eingebungen wurde oder die Befehle falsch geschriegen werden

Man schreibt bei msleep das S groß also mSleep(wert).

Ich glaube aber das das an der Lib liegt.
Suche mal in der Makefile nach der Zeile
RP6_LIB_PATH=Pfad
Pfad solltest du halt mit dem Pfad des Libordners ersetzen z.B RP6_LIB_PATH=RP6Lib wenn die Lib im gleichen Verzeichnis ist.

Hoffe ich konnte helfen.

mfg

Laias

LucaSilva301
12.11.2008, 15:43
Hey!
Vielen Dank...
es lag an beidem und jetzt krieg ich meine .hex endlich :D
nun noch eine kurze Frage:
mein code ist folgender:


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();

setLEDs(0b100100);
mSleep(500);
setLEDs(0b010010);
mSleep(500);
setLEDs(0b001001);
mSleep(500);

while(true)
{
return 7;
}
}


aber leider klappt das mit dem loop noch nicht so richtig...
hat mich sowieso schon gewundert, dass das while garnicht erklärt weerden muss, aber es stand auch so in den examples. könnte ich einfach statt "(true)" "(setLED(0b001001)" schreiben?

Danke nochmal für deine schnelle Antwort!
beste Grüße
Luca

Laias
12.11.2008, 18:56
Die While Schleife führt alles immer wieder aus. Allerdings nur wenn der Wert in der Klammer 1(oder true) ist. Dass heist das in deinem Code die While Schleife immer aktiv ist und du desshalb in die Klammer nicht den setLEDs befehl einfügen musst.

Die eigentliche Schleife steht zwischen den { } Klammern also:



while(true){
// Deine Schleife wie z.B LED Lauflicht
}

Das return 7 ist übrigens auch unnötig würde ich einfach weglassen.

Hoffe ich konnte dir das etwas erklären.
Kann dir auch empfehlen bei Fragen einfach bei Google nach nem C Tutorial
zu schauen davon gibt es viele die die Befehle verständlich erklären.

mfg

Laias

Pr0gm4n
13.11.2008, 08:09
Hi,

meines Erachtens ist z.b. die while-schleife auch schön ausführlich in der rp6-anleitung erklärt, das sollte nicht das problem sein...

aber um das nochmal zu verdeutlichen was laias natürlich völlig korrekt und eigentlich ausreichend erklärt hat:

aus:


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();

setLEDs(0b100100);
mSleep(500);
setLEDs(0b010010);
mSleep(500);
setLEDs(0b001001);
mSleep(500);

while(true)
{
return 7;
}
}


wird dann wenn er die ganze zeit die LEDs schalten soll



#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();

while(true)
{
setLEDs(0b100100);
mSleep(500);
setLEDs(0b010010);
mSleep(500);
setLEDs(0b001001);
mSleep(500);
}
return 0;
}

dashier

also wenn dus bei laias noch nicht verstanden hast, dann hoffe ich dass ich helfen konnte^^

@laias: ob man das return 7; weglassen kann bezweifle ich...

der compiler sollte dann eine errormessage ausgeben we "return [int] expected" oder irgendsowas, da die funktion main ja den rückgabetyp int hat
(siehe INT main(void){...})

LG Pr0gm4n

LucaSilva301
13.11.2008, 08:47
Hey
Danke für die Antworten,
habs jetzt einfach so gelöst:



while(true)
{
//MEIN PROGRAMM
}


hat super funktioniert und das return ist auch unötig.
habe nur noch eine Frage:
wenn ich die Bumpers aktivieren möchte, muss ich die bumpers void direkt am anfang des Programms schreiben oder in dein main-teil einbinden?
Bei mir reagiert er nämlich garnicht auf sie und macht einfach mit dem normalen Programmablauf weiter.
Bsp.:



//declarations

{
//erst die bumpers
}

int main(void)
{
Bewegunsabläufe
}



sry bin jetzt in der Schule und kann leider keinen richtigen code posten...
vielleicht versteht ihrs trotzdem, sonst nachher nochmal genauer.
Danke
Luca
[/code]

Laias
13.11.2008, 14:43
Ok die Bumpers...
Um die Bumpers auszuwerten brauchst du die Befehlte getBumperLeft() und getBumperRight() für den Linken und Rechten Bumper. Der Befehl gibt 1 Zurück wenn der Bumper gedrückt wird und 0 falls nicht.
Hier ein kleines Beispiel zum Verstehen:



//Alles was in ein RP6 Prog rein gehört (includes etc)

int main(void) {

while(true) {
if(getBumperRight()) setLEDs((0b000001); // Schalte Led 1 ein falls rechter Bumper gedrückt wird.
if(getBumperLeft()) setLEDs((0b000010); //Schalte Led 2 falls linker Bumper gedrückt wird.
mSleep(50); /* Dieser Befehl stoppt die Schleife für 50ms, dies hat keine
große Auswirkung auf das Ergebnis sondern dient dazu, dass der RP6 den Bumper nur 20mal in der Sekunde auswerten soll. */
}

}



Hab den Code nicht getestet müsste aber funktionieren.
Hoffe habe dich richtig verstanden oder woltest du dir eine Funktion zum
Auswerten der Bumper bauen?

Laias

LucaSilva301
13.11.2008, 17:11
Hey!
danke! genau dass wollte ich wissen.
Jetzt kann ich ja auch statt der LEDs Bewegung einbringen.
Mein Problem war vorher eben, dass er nicht darauf reagiert hat und mit der standart schleife weitergemacht hat.
Also wenn ich einen normalen loop schreibe in dem er nur vorwärts fährt, aber möchte, dass er bei getBumperLeft zurückfährt, 45° rechts dreht und dann wieder am anfang mit vorwärts fahren weitermacht. (Das gleiche gespiegelt mit getBumperRight nur dann links drehen...)

wie schreibe ich also, dass der mainloop (vorwärts fahren) unterbrochen wird, sobald ein bumper berührt wird?

Danke nochmal und einen schönen Abend!
Luca

RP6conrad
13.11.2008, 21:24
Der mainloop darf eigentlich nicht unterbrochen werden für eine saubere Ablauf. Prinzip ist das die Mainloop standig durchlaufen werd. Wen etwas passiert soll eine Function aufgerufen und bearbeitet werden, dan wieder zu Mainloop. Die blockierende Functionen(mSleep, delay...) haben das Nachteil das alles andere was auch noch in Mainloop derin ist, nicht mehr bearbeitet wird !!
Scheint kompliziert zu sein, aber sieht mal die Beispielen an die schon functionieren.

für ihre Frage :
In mainloop
if (getBumberLeft()) move(100,BWD,50,0);

Jetzt ist naturlich wichtig das in das andere Teil von Mainloop diese Move nicht wiederum gegengesprochen wird !!

LucaSilva301
16.11.2008, 18:06
Hey,
vielen Dank!

also hab es jetzt soweit verstanden...
möchte gerne ein eigenes Programm schreiben, bei dem der RP6 vorwärts fährt bis ein bumper gedrückt wird. Leider kann ich ihn immer nur mit
move([Geschwindigkeit],[Richtung],[Strecke],true)
bewegen. Das macht es mir schwer eine stetige überprüfung einzubauen.
Ich kann nur folgendes machen:


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
powerON();
while (true)
{
move(300,FWD,30,true);
if ((getBumperLeft() || getBumperRight()))
{
move(200,BWD,200,true);
}
}
}


Er fährt also ein möglichst kleines Stück um dann die bumpers zu prüfen und gegebenenfalls zu reagieren.
Leider etwas langsam und äußerst hässlich aufgrung der stockenden bewegungen^^
Wie kann ich zum Beispiel schreiben:

while ("Bumpers not hit")
{
FWD,[Geschwindigkeit]
}
if ("bumpers hit")
{
BWD,[Geschwindigkeit],[Strecke]
}

Danke für eure Hilfe!
Luca

radbruch
16.11.2008, 18:30
Hallo

Das true im Move-Befehl bewirkt dass der RP6 nichts anderes macht bis die Fahrt beendet ist:

#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
setLEDs(63);
powerON();
while (true)
{
changeDirection(FWD);
moveAtSpeed(150,150);
if (getBumperLeft() || getBumperRight())
{
move(150,BWD,200,true);
}
task_motionControl();
sleep(200);
}
}

Ich hoffe, das funktioniert so halbwegs. Ich kann's grad nicht testen weil mein LCD die Bumber blockiert(?). Das ist übrigends extrem quälend für den RP6 wenn er mit Volldampf gegen ein Hinderniss knallen soll! Besser ACS verwenden.

Gruß

mic

LucaSilva301
16.11.2008, 18:48
Hey Radbruch!

hab jetzt das hier geschrieben:



#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();
powerON();
while (true)
{
changeDirection(FWD);
moveAtSpeed(300,300);
if (getBumperLeft()) //Wenn ein Bumper aktiviert ist
{ //dann
move(200,BWD,400,true);
rotate(100,RIGHT,45,true);
}
if (getBumperRight())
{
move(200,BWD,400,true);
rotate(100,LEFT,45,true);
}
}
}


aber... leider passiert garnichts leuchtet einfach nur die PWRON LED :( er scheint irgendwie bei dem
changeDirection(FWD);
moveAtSpeed(X,X);
hängen zu bleiben oder es nicht zu verstehen.
Woran könnte das liegen?
Vielen Dank und beste Grüße
Luca

LucaSilva301
17.11.2008, 14:19
gut. es geht jetzt.
hatte die zeile :

task_motionControl();

vergessen.
warum schreibe ich diese Zeile? Was bewirkt sie?
Ist sie eine Art Verweis auf einen Eintrag in der Lib?
Danke!

Pr0gm4n
17.11.2008, 18:28
Hi,

ja das ist eine Art Verweis auf die Lib, du rufst damit halt die in der Lib definierte Funktion task_motionControl() auf und das Programm holt sich diese selbständig aus der Lib

LG Pr0gm4n